色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32的串口環(huán)形隊列IAP調(diào)試

jf_pJlTbmA9 ? 來源:jf_pJlTbmA9 ? 作者:jf_pJlTbmA9 ? 2023-09-18 15:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

IAP很常見了,我這里主要是記錄一下我所使用的方法,調(diào)試也花了兩天時間。我所用的型號是STM32F103C8T6,這個片子估計是目前性價比最高的了,所以平時也都是用的這個。這個IC有64KFlash和20K的RAM,也有小道說有后置隱藏的64K,也就是說其實是有128K,我一直也沒有測試,有空測測,有大神這樣說,估計是可以的。這里重點記錄一下我寫的IAP思路和代碼以及細節(jié)和遇到坑的地方。先大體的概述一下,最后貼上我認為重點的代碼。

在概述之前先要解決一個問題,那就是sram空間和flash空間的問題,sram只有20K,flash有64k。

解決的辦法有很多:

1)最常見的就是自己寫上位機軟件,通過分包發(fā)送,期間還可以加入加密算法,校驗等等。

2)使用環(huán)形隊列,簡單點說就是個環(huán)形數(shù)組,一邊接收上位機數(shù)據(jù),一邊往flash里面寫。

這里條件限制就采用第二種方法。所以即使是分給A和B的25K空間的flash空間,sram只有20K也是不能一次接收完所有的bin數(shù)據(jù)的,這里我只開辟了一個1K的BUF,使用尾插法寫入,我的測試應(yīng)用程序都在5-6K,用這樣的方法可以在9600波特率下測試穩(wěn)定,也試過57600的勉強可以的,115200就不行了。

環(huán)形隊列代碼如下:

C文件:

#include "fy_looplist.h"
 
#include "fy_includes.h"
 
 
#ifndef NULL
#define NULL 0
#endif
 
#ifndef min
#define min(a, b) (a)<(b)?(a):(b) //< 獲取最小值
#endif
 
#define DEBUG_LOOP 1
 
static int Create(_loopList_s* p,unsigned char *buf,unsigned int len);
static void Delete(_loopList_s* p);
static int Get_Capacity(_loopList_s *p);
static int Get_CanRead(_loopList_s *p);
static int Get_CanWrite(_loopList_s *p);
static int Read(_loopList_s *p, void *buf, unsigned int len);
static int Write(_loopList_s *p, const void *buf, unsigned int len);
 
struct _typdef_LoopList  _list=
{
    Create,
    Delete,
    Get_Capacity,
    Get_CanRead,
    Get_CanWrite,
    Read,
    Write
};
 
 
//初始化環(huán)形緩沖區(qū)
static int Create(_loopList_s* p,unsigned char *buf,unsigned int len)
{
    if(NULL == p)
    {
#if DEBUG_LOOP
        printf("ERROR: input list is NULLn");
#endif
        return 0;
    }
    p->capacity = len;
    p->buf = buf;
    p->head = p->buf;//頭指向數(shù)組首地址
    p->tail = p->buf;//尾指向數(shù)組首地址
 
    return 1;
}
 
//刪除一個環(huán)形緩沖區(qū)
static void Delete(_loopList_s* p)
{
    if(NULL == p)
    {
#if DEBUG_LOOP
        printf("ERROR: input list is NULLn");
#endif
        return;
    }
 
    p->buf  = NULL;//地址賦值為空
    p->head = NULL;//頭地址為空
    p->tail = NULL;//尾地址尾空
    p->capacity = 0;//長度為空
}
 
//獲取鏈表的長度
static int Get_Capacity(_loopList_s *p)
{
    if(NULL == p)
    {
#if DEBUG_LOOP
        printf("ERROR: input list is NULLn");
#endif
        return -1;
    }
    return p->capacity;
}
 
//返回能讀的空間
static int Get_CanRead(_loopList_s *p)
{
    if(NULL == p)
    {
#if DEBUG_LOOP
        printf("ERROR: input list is NULLn");
#endif
        return -1;
    }
 
    if(p->head == p->tail)//頭與尾相遇
    {
        return 0;
    }
 
    if(p->head < p->tail)//尾大于頭
    {
        return p->tail - p->head;
    }
 
    return Get_Capacity(p) - (p->head - p->tail);//頭大于尾
}
 
//返回能寫入的空間
static int Get_CanWrite(_loopList_s *p)
{
    if(NULL == p)
    {
#if DEBUG_LOOP
        printf("ERROR: input list is NULLn");
#endif
        return -1;
    }
 
    return Get_Capacity(p) - Get_CanRead(p);//總的減去已經(jīng)寫入的空間
}
 
 
//  p--要讀的環(huán)形鏈表
//  buf--讀出的數(shù)據(jù)
//  count--讀的個數(shù)
static int Read(_loopList_s *p, void *buf, unsigned int len)
{
    int copySz = 0;
 
    if(NULL == p)
    {
#if DEBUG_LOOP
        printf("ERROR: input list is NULLn");
#endif
        return -1;
    }
 
    if(NULL == buf)
    {
#if DEBUG_LOOP
        printf("ERROR: input buf is NULLn");
#endif
        return -2;
    }
 
    if(p->head < p->tail)//尾大于頭
    {
        copySz = min(len, Get_CanRead(p));	//比較能讀的個數(shù)
        memcpy(buf, p->head, copySz);		//讀出數(shù)據(jù)
        p->head += copySz;					//頭指針加上讀取的個數(shù)
        return copySz;						//返回讀取的個數(shù)
    }
    else //頭大于等于了尾
    {
        if (len < Get_Capacity(p)-(p->head - p->buf))//讀的個數(shù)小于頭上面的數(shù)據(jù)量
        {
            copySz = len;//讀出的個數(shù)
            memcpy(buf, p->head, copySz);
            p->head += copySz;
            return copySz;
        }
        else//讀的個數(shù)大于頭上面的數(shù)據(jù)量
        {
            copySz = Get_Capacity(p) - (p->head - p->buf);//先讀出來頭上面的數(shù)據(jù)
            memcpy(buf, p->head, copySz);
            p->head = p->buf;//頭指針指向數(shù)組的首地址
            //還要讀的個數(shù)
            copySz += Read(p,(char*)buf+copySz, len-copySz);//接著讀剩余要讀的個數(shù)
            return copySz;
        }
    }
}
//  p--要寫的環(huán)形鏈表
//  buf--寫出的數(shù)據(jù)
//  len--寫的個數(shù)
static int Write(_loopList_s *p, const void *buf, unsigned int len)
{
    int tailAvailSz = 0;//尾部剩余空間
 
    if(NULL == p)
    {
#if DEBUG_LOOP
        printf("ERROR: list is empty n");
#endif
        return -1;
    }
 
    if(NULL == buf)
    {
#if DEBUG_LOOP
        printf("ERROR: buf is empty n");
#endif
        return -2;
    }
 
    if (len >= Get_CanWrite(p))//如果剩余的空間不夠
    {
#if DEBUG_LOOP
        printf("ERROR: no memory n");
#endif
        return -3;
    }
 
    if (p->head <= p->tail)//頭小于等于尾
    {
        tailAvailSz = Get_Capacity(p) - (p->tail - p->buf);	//查看尾上面剩余的空間
        if (len <= tailAvailSz)//個數(shù)小于等于尾上面剩余的空間
        {
            memcpy(p->tail, buf, len);//拷貝數(shù)據(jù)到環(huán)形數(shù)組
            p->tail += len;//尾指針加上數(shù)據(jù)個數(shù)
            if (p->tail == p->buf+Get_Capacity(p))//正好寫到最后
            {
                p->tail = p->buf;//尾指向數(shù)組的首地址
            }
            return len;//返回寫入的數(shù)據(jù)個數(shù)
        }
        else
        {
            memcpy(p->tail, buf, tailAvailSz);	//填入尾上面剩余的空間
            p->tail = p->buf;					//尾指針指向數(shù)組首地址
            //剩余空間                   剩余數(shù)據(jù)的首地址       剩余數(shù)據(jù)的個數(shù)
            return tailAvailSz + Write(p, (char*)buf+tailAvailSz, len-tailAvailSz);//接著寫剩余的數(shù)據(jù)
        }
    }
    else //頭大于尾
    {
        memcpy(p->tail, buf, len);
        p->tail += len;
        return len;
    }
}
 
 
/*********************************************END OF FILE********************************************/

頭文件

#ifndef __FY_LOOPLIST_H
#define __FY_LOOPLIST_H
 
//環(huán)形緩沖區(qū)數(shù)據(jù)結(jié)構(gòu)
typedef struct {
    unsigned int   capacity;	//空間大小
    unsigned char  *head; 	//頭
    unsigned char  *tail; 	//尾
    unsigned char  *buf; 	//數(shù)組的首地址
} _loopList_s;
 
struct _typdef_LoopList
{
    int	(*Create)	(_loopList_s* p,unsigned char *buf,unsigned int len);
    void (*Delete)(_loopList_s* p);
    int (*Get_Capacity)(_loopList_s *p);
    int (*Get_CanRead)(_loopList_s *p);
    int (*Get_CanWrite)(_loopList_s *p);
    int (*Read)(_loopList_s *p, void *buf, unsigned int len);
    int (*Write)(_loopList_s *p, const void *buf, unsigned int len);
};
 
extern struct _typdef_LoopList _list;
 
#endif

1、整體思路

1、把64K的flash空間分成了4個部分,第一部分是BootLoader,第二部分是程序A(APP1),第三部分是程序B(APP2),第四部分是用來存儲一些變量和標記的。下面是空間的分配情況。BootLoader程序可以用來更新程序A,而程序A又更新程序B,程序B可以更新程序A。最開始的時候想的是程序A、B都帶更新了干嘛還多此一舉,其實這個Bootloader還是需要的。如果之后程序A、B和FLAG三部分,假設(shè)一種情況,在程序B中更新程序A中遇到問題,復(fù)位后直接成磚,因為程序A在其實地址,上電直接運行程序A,而程序A現(xiàn)在出問題了,那就沒招了。所以加上BootLoader情況下,不管怎么樣BootLoader的程序是不會錯的,因為更新不會更新BootLoader,計時更新出錯了,還可以進入BootLoader重新更新應(yīng)用程序。我見也有另外一種設(shè)計方法的,就是應(yīng)用程序只有一個程序A,把程序B區(qū)域的flash當作緩存用,重啟的時候判斷B區(qū)域有沒有更新程序,有的話就把B拷貝到A,然后擦除B,我感覺這樣其實也一樣,反正不管怎么樣這部分空間是必須要預(yù)留出來的。

pYYBAGEAt9SAXm_fAABKqTd1KAw663.png

這里在keil中配置的只有起始地址和大小,并沒有結(jié)束地址,我這里也就不詳細計算了??傮w就是這樣的。

2、Bootloader部分

BootLoader的任務(wù)有兩個,一是在串口中斷接收BIN的數(shù)據(jù)和主循環(huán)內(nèi)判斷以及更新APP1的程序,二是在在程序開始的時候判斷有沒有可用的用戶程序進而跳轉(zhuǎn)到用戶程序(程序A或者程序B)。

簡單介紹下執(zhí)行流程:

系統(tǒng)上電首先肯定是執(zhí)行BootLoader程序的,因為它的起始地址就是0x08000000,首先是初始化,然后判斷按鍵是否手動升級程序,按鍵按下了就把FLAG部分的APP標記寫成0xFFFF(這里用的宏定義方式),再執(zhí)行執(zhí)行App_Check(),否則就直接執(zhí)行App_Check()。

App_Check函數(shù)是來判斷程序A和程序B的,最開始BootLoader是用swd方式下載的,下載的時候全片擦除,所以會執(zhí)行主循環(huán)的Update_Check函數(shù)。此時串口打印出“等待接收APP1的BIN”,這個時候發(fā)送APP1的BIN過去,等接受完了,會寫在FLAG區(qū)域?qū)憘€0xAAAA,代表程序A寫入了,下次啟動可以執(zhí)行程序A。

主要代碼部分

#include "fy_includes.h"
 
/*
晶振使用的是16M 其他頻率在system_stm32f10x.c中修改
使用printf需要在fy_includes.h修改串口重定向為#define PRINTF_USART USART1 
*/
 
 
/*
Bootloader程序
完成三個任務(wù)
步驟1.檢查是否有程序更新,如果有就擦寫flash進行更新,如果沒有進入步驟2
步驟2.判斷app1有沒有可執(zhí)行程序,如果有就執(zhí)行,如果沒有進入步驟3
步驟3.串口等待接收程序固件
*/
 
#define FLAG_UPDATE_APP1 0xBBAA
#define FLAG_UPDATE_APP2 0xAABB
#define FLAG_APP1 0xAAAA
#define FLAG_APP2 0xBBBB
#define FLAG_NONE 0xFFFF
 
_loopList_s list1;
u8 rxbuf[1024];
u8 temp8[2]; 
u16 temp16;
u32 rxlen=0;
u32 applen=0;
u32 write_addr;
u8 overflow=0;
u32 now_tick=0;
u8 _cnt_10ms=0;
 
static void App_Check(void)
{
	//獲取程序標號
	STMFLASH_Read(FLASH_PARAM_ADDR, temp16,1);
 
	if(temp16 == FLAG_APP1)//執(zhí)行程序A
	{
		if(((*(vu32*)(FLASH_APP1_ADDR+4)) 0xFF000000)==0x08000000)//可執(zhí)行?
		{
			printf(" 執(zhí)行程序A...rn");			
			IAP_RunApp(FLASH_APP1_ADDR);
		}
		else
		{
			printf(" 程序A不可執(zhí)行,擦除APP1程序所在空間...rn");
			for(u8 i=10;i<35;i++)
			{
				STMFLASH_Erase(FLASH_BASE + i*STM_SECTOR_SIZE,512);
			}
			printf(" 程序A所在空間擦除完成... rn");
			printf(" 將執(zhí)行程序B... rn");
			if(((*(vu32*)(FLASH_APP2_ADDR+4)) 0xFF000000)==0x08000000)//可執(zhí)行?
			{
				printf(" 執(zhí)行程序B...rn");				
				IAP_RunApp(FLASH_APP2_ADDR);
			}
			else
			{
				printf(" 程序B不可執(zhí)行,擦除APP2程序所在空間...rn");
				for(u8 i=35;i<60;i++)
				{
					STMFLASH_Erase(FLASH_BASE + i*STM_SECTOR_SIZE,512);
				}
				printf(" 程序B所在空間擦除完成...rn");
			}
		}
	}
	
	if(temp16 == FLAG_APP2)//執(zhí)行程序B
	{
		if(((*(vu32*)(FLASH_APP2_ADDR+4)) 0xFF000000)==0x08000000)//可執(zhí)行?
		{
			printf(" 執(zhí)行程序B...rn");			
			IAP_RunApp(FLASH_APP2_ADDR);
		}
		else
		{
			printf(" 程序B不可執(zhí)行,擦除APP2程序所在空間... rn");
			for(u8 i=35;i<60;i++)
			{
				STMFLASH_Erase(FLASH_BASE + i*STM_SECTOR_SIZE,512);
			}
			printf(" 程序B所在空間擦除完成... rn");
			printf(" 將執(zhí)行程序A... rn");
			if(((*(vu32*)(FLASH_APP1_ADDR+4)) 0xFF000000)==0x08000000)//可執(zhí)行?
			{
				printf(" 執(zhí)行程序A...rn");				
				IAP_RunApp(FLASH_APP1_ADDR);
			}
			else
			{
				printf(" 程序A不可執(zhí)行,擦除APP1程序所在空間...rn");
				for(u8 i=10;i<35;i++)
				{
					STMFLASH_Erase(FLASH_BASE + i*STM_SECTOR_SIZE,512);
				}
				printf(" 程序A所在空間擦除完成...rn");
			}
		}
	}
	
	if(temp16 == FLAG_NONE)
	{
		printf(" 擦除App1程序所在空間...rn");
		for(u8 i=10;i<35;i++)
		{
			STMFLASH_Erase(FLASH_BASE + i*STM_SECTOR_SIZE,512);
		}
		printf(" 程序A所在空間擦除完成...rn");
	}
}
 
 
static void Update_Check(void)
{
	if(_list.Get_CanRead( list1)>1)
	{
		_list.Read( list1, temp8,2);//讀取兩個數(shù)據(jù)
		 
		temp16 = (u16)(temp8[1]<<8) | temp8[0];
					
		STMFLASH_Write(write_addr, temp16,1);
		write_addr+=2;
	}
 
	if(GetSystick_ms() - now_tick >10)//10ms
	{
		now_tick = GetSystick_ms();
		_cnt_10ms++;
		if(applen == rxlen    rxlen)//接收完成
		{
			if(overflow)
			{
				printf("接收溢出,無法更新,請重試 rn");
				SoftReset();//軟件復(fù)位
			}
			else
			{
				printf(" rn 接收BIN文件完成,長度為 %d rn",applen);
				
				temp16 = FLAG_APP1;
				STMFLASH_Write(FLASH_PARAM_ADDR, temp16,1);//寫入標記
				temp16 = (u16)(applen>>16);
				STMFLASH_Write(FLASH_PARAM_ADDR+2, temp16,1);
				temp16 = (u16)(applen);
				STMFLASH_Write(FLASH_PARAM_ADDR+4, temp16,1);
				
				SoftReset();//軟件復(fù)位
			}
		}else applen = rxlen;//更新長度
	}
	if(_cnt_10ms>=50)
	{
		_cnt_10ms=0;
		Led_Tog();
		if(!rxlen)
		{
			printf(" 等待接收App1的BIN文件 rn");
		}
	}
}
int main(void)
{
	NVIC_SetPriorityGrouping( NVIC_PriorityGroup_2);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	 //開啟AFIO時鐘
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);	//禁止JTAG保留SWD
    
	Systick_Configuration();
    Led_Configuration();
	Key_Configuration();
	Usart1_Configuration(9600);
	USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);//關(guān)閉串口空閑中斷
 
	printf(" this is bootloader!rnrn");
	if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == SET)
	{
		Delay_ms(100);
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == SET)//開機按下keyup進行更新
		{
			printf(" 主動更新,");
			temp16 = FLAG_NONE;
			STMFLASH_Write(FLASH_PARAM_ADDR, temp16,1);
		}
		else
		{
			
		}
	}
 
	App_Check();
	
	printf(" 執(zhí)行BootLoader程序... rn");
	_list.Create( list1,rxbuf,sizeof(rxbuf));
 
	write_addr = FLASH_APP1_ADDR;
	
    while(1)
    {		
		Update_Check();
    }
}
 
//USART1串口中斷函數(shù)
void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
		u8 temp = USART1->DR;
		if(_list.Write( list1, temp,1)<=0)
		{
			overflow=1;
		}
		rxlen++;
    }
}

其中的宏:

//FLASH起始地址
#define STM32_FLASH_BASE 0x08000000     //STM32 FLASH的起始地址
#define FLASH_APP1_ADDR    STM32_FLASH_BASE+0x2800    //偏移10K
#define FLASH_APP2_ADDR    STM32_FLASH_BASE+0x8c00    //偏移35K
#define FLASH_PARAM_ADDR    STM32_FLASH_BASE+0xF000    //偏移60K

3、程序A和程序B部分

這兩個都是用戶程序,這兩個程序都帶有更新程序功能,我這里用作測試的A和B程序大體都差不多,不同的地方就是程序A接收的BIN用來更新程序B,程序B接收的BIN用來更新A,還有就是中斷向量表便宜不同以及打印輸出不同。

應(yīng)用程序部分沒什么說的,程序A和B很類似,這里貼上A的代碼

#include "fy_includes.h"
 
/*
晶振使用的是16M 其他頻率在system_stm32f10x.c中修改
使用printf需要在fy_includes.h修改串口重定向為#define PRINTF_USART USART1 
*/
 
 
/*
APP1程序
完成兩個任務(wù)
1.執(zhí)行本身的app任務(wù),同時監(jiān)聽程序更新,監(jiān)聽到停止本身的任務(wù)進入到狀態(tài)2
2.等待接收完成,完成后復(fù)位重啟
*/
 
#define FLAG_UPDATE_APP1 0xBBAA
#define FLAG_UPDATE_APP2 0xAABB
#define FLAG_APP1 0xAAAA
#define FLAG_APP2 0xBBBB
#define FLAG_NONE 0xFFFF
 
_loopList_s list1;
u8 rxbuf[1024];
u8 temp8[2]; 
u16 temp16;
u32 rxlen=0;
u32 applen=0;
u32 write_flsh_addr;
u8 update=0;
u8 overflow=0;
u32 now_tick;
u8 _cnt_10ms=0;
 
static void Update_Check(void)
{
	if(update)//監(jiān)聽到有更新程序
	{
		write_flsh_addr = FLASH_APP2_ADDR;//App1更新App2的程序
		overflow=0;
		rxlen=0;
		_list.Create( list1,rxbuf,sizeof(rxbuf));
		
		printf(" 擦除APP2程序所在空間...rn");
		for(u8 i=35;i<60;i++)//擦除APP2所在空間程序
		{
			STMFLASH_Erase(FLASH_BASE + i*STM_SECTOR_SIZE,512);
		}
		printf(" 程序B所在空間擦除完成...rn");
		
		while(1)
		{
			if(_list.Get_CanRead( list1)>1)
			{
				_list.Read( list1, temp8,2);//讀取兩個數(shù)據(jù)
				 
				temp16 = (u16)(temp8[1]<<8) | temp8[0];
							
				STMFLASH_Write(write_flsh_addr, temp16,1);
				write_flsh_addr+=2;
			}
			
			if(GetSystick_ms() - now_tick >10)//10ms
			{
				now_tick = GetSystick_ms();
				_cnt_10ms++;
				if(applen == rxlen    rxlen)//接收完成
				{
					if(overflow)
					{
						printf(" rn 接收溢出,請重新嘗試 rn");
						SoftReset();//軟件復(fù)位
					}
					
					printf(" rn 接收BIN文件完成,長度為 %d rn",applen);
					
					temp16 = FLAG_APP2;
					STMFLASH_Write(FLASH_PARAM_ADDR, temp16,1);//寫入標記
					temp16 = (u16)(applen>>16);
					STMFLASH_Write(FLASH_PARAM_ADDR+2, temp16,1);
					temp16 = (u16)(applen);
					STMFLASH_Write(FLASH_PARAM_ADDR+4, temp16,1);
					
					printf(" 系統(tǒng)將重啟....rn");
					SoftReset();//軟件復(fù)位
				}else applen = rxlen;//更新長度				
			}
			
			if(_cnt_10ms>=50)
			{
				_cnt_10ms=0;
				Led_Tog();
				if(!rxlen)
				{
					printf(" 等待接收App2的BIN文件 rn");
				}
			}
		}//while(1)
	}
}
 
 
static void App_Task(void)
{
	if(GetSystick_ms() - now_tick >500)					
	{
		now_tick = GetSystick_ms();
		printf(" 正在運行APP1 rn");
		Led_Tog();
	}
}
 
int main(void)
{
	SCB->VTOR = FLASH_APP1_ADDR; 	 
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	 //開啟AFIO時鐘
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);	//禁止JTAG保留SWD
    
	Systick_Configuration();
    Led_Configuration();
	Usart1_Configuration(9600);
	printf(" this is APP1!rn");
	
	Delay_ms(500);
	
    while(1)
    {
		Update_Check();
		App_Task();
    }
}
 
//USART1串口中斷函數(shù)
void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
		u8 temp = USART1->DR;
		if(update)
		{			
			if(_list.Write( list1, temp,1) <= 0 )
			{
				overflow = 1;
			}
		}
		else
		{
			rxbuf[rxlen] = temp;
		}
		rxlen++;
    }
    if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
    {
		u8 temp = USART1->DR;
		temp = USART1->SR;
		
		if(strstr((char *)rxbuf,"App Update")    rxlen)
		{
			update=1;
			USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);//關(guān)閉串口空閑中斷
		}
		else
		{
			Usart1_SendBuf(rxbuf,rxlen);
		}
		rxlen=0;
    }
	
}

這里如果要移植需要注意的就是向量表的偏移以及更新擦寫的區(qū)域。

4、剩余的4Kflash空間部分

這里其實只是用來存儲2個變量,一個是程序運行標記,一個是接收到的程序長度,程序標記還有點把子用,程序長度其實要不要都無所謂。

5、遇到的坑

最值得一說的就是更新部分,最開始程序沒有加入擦除flash,遇到的情況就是下載完BootLoader后發(fā)送app1沒問題,在app1中更新App2也沒問題,然后app2再更新app1就出問題了。直觀的結(jié)果就是循環(huán)隊列溢出,原因就是app2在更新app1前沒有去擦除app1所在的flash,所以在寫的時候就要去擦除,這樣就寫的很慢,然而串口接收是不停的收,所以就是寫不過來。

審核編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • STM32
    +關(guān)注

    關(guān)注

    2296

    文章

    11038

    瀏覽量

    366564
  • 串口
    +關(guān)注

    關(guān)注

    15

    文章

    1592

    瀏覽量

    80390
  • IAP
    IAP
    +關(guān)注

    關(guān)注

    2

    文章

    165

    瀏覽量

    25168
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4907

    瀏覽量

    71200
收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    請問串口接受用環(huán)形隊列,發(fā)送也能用嗎?

    串口接受用環(huán)形隊列,發(fā)送也可以用?發(fā)送用普通的中斷也可以
    發(fā)表于 05-07 07:56

    環(huán)形隊列串口數(shù)據(jù)接收中的使用

    前言??書接上回,前文主要介紹了環(huán)形隊列的實現(xiàn)原理以及C語言實現(xiàn)及測試過程,本文將回歸到嵌入式平臺的應(yīng)用中,話不多說,淦,上干貨!實驗?zāi)康腍AL庫下串口的配置及使用環(huán)形
    發(fā)表于 12-06 06:27

    stm32f103的串口IAP調(diào)試過程是怎樣的?

    stm32f103的串口IAP調(diào)試過程是怎樣的?
    發(fā)表于 12-07 07:04

    如何使用隊列實現(xiàn)STM32串口環(huán)形緩沖?

    串口環(huán)形緩沖的好處是什么?如何使用隊列實現(xiàn)STM32串口環(huán)形緩沖?
    發(fā)表于 12-07 07:13

    基于stm32串口環(huán)形緩沖隊列處理機制是什么

    基于stm32串口環(huán)形緩沖隊列處理機制是什么
    發(fā)表于 12-08 07:06

    實現(xiàn)隊列環(huán)形緩沖的方法

    串口隊列環(huán)形緩沖區(qū)隊列串口環(huán)形緩沖的好處代碼實現(xiàn)隊列
    發(fā)表于 02-21 07:11

    基于STM32F1的環(huán)形隊列的程序資料合集免費下載

    本文檔的主要內(nèi)容詳細介紹的設(shè)計基于STM32F1的環(huán)形隊列的程序資料合集免費下載。
    發(fā)表于 04-12 08:00 ?1次下載
    基于<b class='flag-5'>STM32</b>F1的<b class='flag-5'>環(huán)形</b><b class='flag-5'>隊列</b>的程序資料合集免費下載

    STM32串口環(huán)形緩沖--使用隊列實現(xiàn)(開放源碼)

    串口隊列環(huán)形緩沖區(qū)隊列串口環(huán)形緩沖的好處代碼實現(xiàn)隊列
    發(fā)表于 12-24 19:04 ?28次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>環(huán)形</b>緩沖--使用<b class='flag-5'>隊列</b>實現(xiàn)(開放源碼)

    STM32串口數(shù)據(jù)接收 --環(huán)形緩沖區(qū)

    STM32串口數(shù)據(jù)接收 --環(huán)形緩沖區(qū)環(huán)形緩沖區(qū)簡介??在單片機中串口通信是我們使用最頻繁的,使用串口
    發(fā)表于 12-28 19:24 ?31次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>數(shù)據(jù)接收 --<b class='flag-5'>環(huán)形</b>緩沖區(qū)

    基于STM32串口環(huán)形隊列IAP調(diào)試心得

    使用環(huán)形隊列,簡單點說就是個環(huán)形數(shù)組,一邊接收上位機數(shù)據(jù),一邊往flash里面寫。
    發(fā)表于 02-08 15:22 ?5次下載
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>串口</b><b class='flag-5'>環(huán)形</b><b class='flag-5'>隊列</b><b class='flag-5'>IAP</b><b class='flag-5'>調(diào)試</b>心得

    AN3965 STM32F40x和STM32F41x基于串口IAP

    AN3965 STM32F40x和STM32F41x基于串口IAP
    發(fā)表于 11-24 08:31 ?0次下載
    AN3965 <b class='flag-5'>STM32</b>F40x和<b class='flag-5'>STM32</b>F41x基于<b class='flag-5'>串口</b>的<b class='flag-5'>IAP</b>

    STM32進階之串口環(huán)形緩沖區(qū)實現(xiàn)

    碼代碼的應(yīng)該學(xué)數(shù)據(jù)結(jié)構(gòu)都學(xué)過隊列環(huán)形隊列隊列的一種特殊形式,應(yīng)用挺廣泛的。因為有太多文章關(guān)于這方面的內(nèi)容,理論知識可以看別人的,下面寫得挺好的:
    發(fā)表于 12-06 10:00 ?3435次閱讀

    基于串口環(huán)形隊列IAP實現(xiàn)

    我這里主要是記錄一下我所使用的方法,調(diào)試也花了兩天時間。
    的頭像 發(fā)表于 04-12 09:28 ?1004次閱讀

    STM32進階之串口環(huán)形緩沖區(qū)實現(xiàn)

    STM32進階之串口環(huán)形緩沖區(qū)實現(xiàn)
    的頭像 發(fā)表于 09-19 09:20 ?2936次閱讀
    <b class='flag-5'>STM32</b>進階之<b class='flag-5'>串口</b><b class='flag-5'>環(huán)形</b>緩沖區(qū)實現(xiàn)

    嵌入式環(huán)形隊列與消息隊列的實現(xiàn)原理

    嵌入式環(huán)形隊列,也稱為環(huán)形緩沖區(qū)或循環(huán)隊列,是一種先進先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),用于在固定大小的存儲區(qū)域中高效地存儲和訪問數(shù)據(jù)。其主要特點包括固定大小的數(shù)組和兩個指針(頭指針和尾指針
    的頭像 發(fā)表于 09-02 15:29 ?1350次閱讀
    主站蜘蛛池模板: 天天噜天天干 | 激情图片在线视频 | 日日噜夜夜爽精品一区 | 国内揄拍国内精品少妇国语 | 日韩在线天堂 | 亚欧激情乱码久久久久久久久 | 欧美色交 | 伊人av影院| 全国最大成人免费视频 | 亚洲国产果冻传媒av在线观看 | 久久久久一区 | 国产美女av| 黑人巨大国产9丨视频 | 国产乱色国产精品播放视频 | 亚洲网在线| 好吊日av | 成人天堂噜噜噜 | 伊人久久婷婷五月综合97色 | 女教师淫辱の教室蜜av臀 | 老牛嫩草二区三区观影体验 | 一级黄色短片 | 伦理片免费完整片在线观看 | 色av网站| 免费观看又色又爽又黄的崩锅 | 欧美日韩v | 国产精品秘入口18禁麻豆免会员 | 一级黄色美女视频 | 91精品国产色综合久久久浪潮 | 久久中文字幕人妻熟av女蜜柚m | 亚洲精品视频在线 | 午夜伦理av | 二个男人躁我疯狂吃奶视频 | 亚洲 国产 韩国 欧美 在线 | 亚洲精品无码人妻无码 | 3d动漫啪啪精品一区二区中文字幕 | 天堂在线观看av | 狠狠色狠狠色综合日日小说 | 国产精品亚洲一区二区在线观看 | 亚洲精品自在在线观看 | 国产伦理片在线观看 | 在线免费不卡视频 | 高清不卡视频 | 最近2019年好看中文字幕视频 | 夜夜爱夜夜做夜夜爽 | 狠狠躁夜夜躁人人爽超碰女h | 喷潮91| av性色| 日本一区二区三区免费高清 | 性视频黄色| 亚洲天堂男人影院 | 阿娇全套94张未删图久久 | 国产视频网站在线观看 | 名人明星三级videos | 免费成人一级片 | 国产va在线观看免费 | 国产a国产国产片 | eeuss国产一区二区三区 | 成人在线免费视频播放 | 欧美日韩亚 | 日本老少交| 亚洲自拍偷拍网 | 亚洲综合伊人久久大杳蕉 | 看特级黄色片 | 乱辈侵犯中文字幕 | 在线不卡日本 | 天堂中文最新版在线中文 | 中文字幕亚洲欧美日韩 | 亚洲综合网国产精品一区 | 国内自拍青青草 | 国产亚洲真人做受在线观看 | 亚洲色欲色欲www | 三级性生活视频 | 欧美va免费高清在线观看 | 夜鲁鲁鲁夜夜综合视频 | 波多野结衣操 | 奇米影视第4色 | 亚洲色妞| 日韩成人免费在线观看 | 一区二区三区视频免费在线观看 | 啪啪自拍视频 | bb日韩美女预防毛片视频 | 欧美大片免费在线观看 | 欧美熟妇另类久久久久久多毛 | 激性欧美激情在线 | 亚洲欧美自拍偷拍 | 狠狠狠色丁香婷婷综合久久88 | 精品亚洲欧美无人区乱码 | 亚洲www天堂com | 日韩高清在线中文字带字幕 | 亚洲一区无码中文字幕 | 久久五月网 | 在线观看精品国产 | 国产成人精品三级麻豆 | 99操| 色婷婷在线播放 | 午夜视频免费在线 | 精品一区二区三区中文字幕 | 毛片视屏 | x88av视频| 日韩欧美高清在线 | 国产精品爽黄69天堂a | 国产 日韩 一区 | 妲己艳史淫片免费看 | 国产精品黄在线观看免费软件 | 日韩激情无码免费毛片 | 欧美男女视频 | 中文无码日韩欧 | 久久久久99精品成人片牛牛影视 | 国产亲子乱弄免费视频 | 美日韩av | 伊人成综合 | 99国内精品久久久久久久夜夜嗨 | 桃色五月 | 国内毛片视频 | 色av导航| 18视频在线观看男男 | 乌克兰极品少妇xxxx做受小说 | 黄色a级一级片 | 国产女主播自拍 | 成人av日韩| 毛片在线观看网站 | 欧美一a一片一级一片 | www亚洲天堂 | 第一色综合 | 无码专区3d动漫精品免费 | 久久久久久久久久久久久久久久久 | 少妇露脸大战黑人视频 | 午夜av免费在线观看 | 欧美精品久久久久久久久久丰满 | 日免费视频 | 亚洲欧美另类图片 | 国产又黄又硬又粗 | 黄污视频在线播放 | 中文字幕在线乱 | 亚洲精品一区二区三区大桥未久 | 丰满人妻妇伦又伦精品国产 | 国产又粗又猛又爽又黄的视频文字 | 免费看日批视频 | 欧美精品亚洲一区 | 19禁大尺度做爰无遮挡小说 | 亚洲人妖女同在线播放 | 国产不卡高清 | 亚洲激情图片区 | 国产综合视频在线 | www片香蕉内射在线88av8 | 无码尹人久久相蕉无码 | 国产巨乳在线观看 | 狂野欧美性猛xxxx乱大交 | 91国模 | 91国产视频在线 | 小龙女娇喘呻吟啊快点 | 欧美激情精品久久久久久 | 在线免费毛片 | 理论片在线观看视频 | 欧美交受高潮1 | 热99视频| 免费看的一级片 | 午夜成人免费视频 | 国产精品人妻一区二区高 | 国产精品多人p群无码 | 欧美人与禽猛交乱配视频 | 含紧一点h边做边走动免费视频 | 亚洲欧美在线视频 | 久久综合第一页 | 国产免费一区二区三区在线能观看 | 人人插人人干 | 亚洲日韩av在线观看 | 国产91网址| 日本人妻丰满熟妇久久久久久 | 亚洲色偷偷av男人的天堂 | 欧美激情三区 | 亚洲熟妇无码一区二区三区导航 | 成年人免费视频网站 | 欧美丰满大乳大屁股毛片图片 | 在线看片不卡 | 欧美亚一区二区 | 永久免费看片在线播放 | 巨胸不知火舞露双奶头无遮挡 | 美日韩av | 亚洲乱码中文字幕久久孕妇黑人 | 日韩av在线天堂 | 国产经典三级在线 | 天天av天天好逼 | 国产精品国产三级国产专播 | 天堂在线观看av | 国产精品伦一区二区 | 5个黑人躁我一个视频 | 一道本无吗一区 | 久久中文字幕伊人小说小说 | 免费99| 女厕偷窥一区二区三区 | 四虎国产精品成人免费影视 | 又长又硬又粗一区二区三区 | 亚洲午夜福利在线观看 | 亚洲专区区免费 | 日韩成人性视频 | 秋霞影院午夜丰满少妇在线视频 | 天天躁夜夜躁天干天干2022 | 99在线播放视频 | 成人av在线一区二区 | 欧美视频综合 | 日本少妇bbwbbw高清 | 激情小说av | 色中色成人导航 | 国产精品久久久久av福利动漫 | 连裤袜美脚ol在线播放 | 亚洲啪啪网址 | 亚洲欧美自拍偷拍视频 | 西西人体大胆4444www | 亚洲精品成人在线视频 | 久久无码人妻一区二区三区午夜 | 国产精品日韩欧美一区二区三区 | 日本va在线视频播放 | 亚洲国产系列 | 伊人动漫| 中文字幕久久久久人妻 | 一级黄色片免费看 | 日产亚洲一区二区三区 | 五月激情婷婷丁香综合基地 | 欧美精品免费在线观看 | 亚洲成人免费av | 免费看黄色一级片 | 亚洲午夜福利在线视频 | 国产精品另类激情久久久免费 | 国产午夜精品视频 | 成人小视频在线 | 91看片免费 | 国产欧美一区二区精品性色 | 老司机亚洲精品 | 国产91网| 2020精品国产自在现线看 | 丰满少妇一区二区三区专区 | 91精品久久久久久久99蜜桃 | 成年人在线网站 | 日本爽爽 | 国产精品久久久久久久久久小说 | 国精产品乱码视频一区二区 | 污网站在线观看免费 | 精品三级在线观看 | 久久亚洲中文字幕无码 | 日韩精品一区二区三区在线观看 | 国产午夜精品av一区二区 | 一本一生久久a久久精品综合蜜 | 黑人av | 亚洲欧美日韩一区二区三区在线 | 日韩精品中文字幕一区二区 | 婷婷爱五月天 | 国精一二二产品无人区免费应用 | 最新日韩中文字幕 | 五月婷婷亚洲 | 羞羞国产一区二区三区四区 | 奇米四色777 | 澳门免费av | 九九热视 | 色综合免费视频 | 国产精品18久久久久白浆 | 中国一级黄色毛片 | 色又黄又爽18禁免费网站现观看 | 亚洲美女自拍视频 | 成人精品在线观看视频 | 人成乱码一区二区三区 | 五月天精品一区二区三区 | 成年人免费在线观看网站 | 放荡的美妇在线播放 | 白嫩少妇和二男三p爽的大声呻吟 | 偷拍久久久| 国产精品久久久久久久久久 | 日本视频在线免费观看 | 警花av一区二区三区 | 欧美人与善在线com 久久精品人人做人人综合 国产特级毛片aaaaaa高潮流水 | 337人体做爰大胆视频 | 欧美午夜精品久久久久久孕妇 | 少妇好爽影院 | 夜夜6699ww爽爽婷婷 | dy888夜精品国产专区 | 麻豆91在线 | 国内自拍农村少妇在线观看 | 三级理论中文字幕在线播放 | 亚洲 欧美日韩 国产 中文 | 欧美精品乱码99久久蜜桃 | 久久精品国产99久久6 | 欧美久久一区二区 | 91精品久久久久久综合乱菊 | 精品国产精品久久一区免费式 | 日韩欧美一区二区三区久久婷婷 | 又爽又色禁片1000视频免费看 | 中文字幕无码精品亚洲资源网久久 | 国产成人久久久精品免费澳门 | 国产成a人亚洲精v品无码性色 | 婷婷丁香五月激情综合 | 天天干干| 91黄色在线视频 | 亚洲色图插插插 | 国产视频久久久 | 国产在线欧美 | 999视频在线 | bt天堂新版中文在线地址 | 国产欧美日韩三级 | 大陆日韩欧美 | 欧美爱爱网站 | 国产精品久久久久久久久久久久午衣片 | 激情四射网| 综合色影院 | 伊人开心网| 激情婷婷| 少妇被粗大的猛烈进出免费视频 | 99久久久无码国产精品不卡 | 一本加勒比北条麻妃 | 每日在线观看av | 欧美aa在线观看 | 日本欧美国产一区二区三区 | 国产在线精品一区二区三区 | 亚洲成人一区在线 | 男男军官互攻互受h啪肉np文 | 国产亚洲欧美一区 | 亚洲国产天堂久久综合226114 | 情侣酒店偷拍一区二区在线播放 | 人妻精油按摩bd高清中文字幕 | 天干啦夜天干天干在线线 | 国产精品88久久久久久妇女 | 精品国产三级a∨在线观看 无码丰满熟妇 | 亚洲综合欧美色五月俺也去 | 日本欧美在线观看视频 | 少妇洁白178在线播放 | 男人的天堂av网站 | 亚洲 国产 韩国 欧美 在线 | 色久视频| 成人性生交大片免费看在线播放 | 国产一区二区精品久久 | 欧美视频1 | 成人性生交大片免费看96 | 张柏芝亚洲一区二区三区 | 国产a做爰全过程片 | jizz性欧美23 | 久久婷婷国产综合精品 | 992tv成人国产福利在线观看 | 99精品一级欧美片免费播放 | 日韩人妻无码一区二区三区久久 | 欧美一级免费黄色片 | 精品自拍第一页 | 中文字幕免费在线观看视频 | 131mm少妇做爰视频 | 超碰av在线 | 色狠狠久久av五月综合 | 国产精品国产三级国产av中文 | 97性视频| 我看黄色一级片 | 欧美成人手机在线视频 | 天堂无乱码| 国产成人亚洲精品 | а天堂8中文最新版在线官网 | 国产乱人伦偷精品视频不卡 | 夜夜骚av| 吃奶摸下的激烈视频 | 日韩精品在线观看免费 | 国产精品久久久久久久久福交 | 一区二区高清在线 | 亚洲成人在线视频网站 | 一本一道久久久a久久久精品蜜臀 | 日本三级网址 | 中文字幕人成乱码熟女 | 国产免费av一区二区三区 | 绯色av蜜臀vs少妇 | japanesexxx乱女另类 | 又爽又大久久久级淫片毛片 | 日本娇小侵犯hd | 日韩一级性生活片 | .精品久久久麻豆国产精品 国产精品久久毛片 | baoyu119.永久免费视频 | 农村妇女毛片精品久久久 | 天堂网免费视频 | 美女国产精品 | 在线免费观看www | 欧美日韩久 | 久久国产一级 | 热久久免费视频 | 色与欲影视天天看综合网 | 久久久国产精品一区二区三区 | 成人免费一区二区三区 | 美女做爰久久久久久 | 在线免费看av片 | 色网站免费 | 污网站免费在线 | 色婷婷狠狠久久综合五月 | 亚洲午夜1000理论片aa | 女裸全身无奶罩内裤内衣内裤 | 天天干天天干天天干天天 | 国产成人观看 | 亚洲精品成人无码中文毛片 | 91精品国产综合久久久久 | 国产一区二区三区四区五区加勒比 | 天堂va在线高清一区 | 国产视频在线一区二区 | 天天躁日日躁狠狠躁精品推荐 | 伊人久久大香线蕉av一区二区 | 黑人巨大xxxxx性猛交 | 天天做天天爱夜夜爽 | 亚洲视频在线免费观看 | 久久精品在线 | 国产一区二区精品丝袜 | 午夜大片 | 国内精品久久久久影院中文字幕 | 岛国av无码免费无禁网站 | 特大巨黑吊av在线播放 | 九九九精品视频 | 爱啪啪影视 | 国产精品久久久久999 | 九九热视频免费观看 | 成人亚洲| 影音先锋久久 | 婷综合 | 天天躁夜夜躁狠狠眼泪 | 天天躁夜夜躁狠狠躁2020色戒 | 国产超碰人人做人人爱ⅴa 日韩人妻无码精品久久久不卡 | 国产黑丝一区 | 日韩在观看线 | 在线观看不卡一区 | 韩日免费av | 国产人妖ts重口系列喝尿视频 | 妺妺窝人体色www看美女 | 激情五月激情综合网 | 国产免费大片 | 免费观看午夜视频 | 成人片在线视频 | 老熟妇高潮一区二区三区 | 亚洲天堂福利视频 | 小说区 图片区色 综合区 | 黑人巨大猛交丰满少妇 | 亚洲日本在线电影 | 成人快色| 中文字幕中文字幕 | 91亚洲精品乱码久久久久久蜜桃 | 污污网站免费在线观看 | 中文字幕二 | 日日鲁夜夜如影院 | 91av视频在线播放 | 国产乱码久久久久 | 亚洲色啦啦狠狠网站 | 国产精品久久久久无码av色戒 | 国产精品久久久久久久久免费丝袜 | 少妇高潮惨叫久久久久久 | 精品一区二区三人妻视频 | 亚洲人成网站777色婷婷 | 国产又粗又长又硬免费视频 | 亚洲www永久成人夜色 | 成人精品啪啪欧美成 | 麻豆传媒av在线播放 | 国产h在线观看 | 色男人影院 | 国产欧美一区二区精品秋霞影院 | 一本一道精品欧美中文字幕 | 日本一区视频在线 | 小黄鸭精品aⅴ导航网站入口 | 九一亚色视频 | 国产精选视频在线观看 | 91美女在线 | 久久久久久久久久久丰满 | 国产精品欧美一区二区三区不卡 | 91极品在线| 999国产精品999久久久久久 | 国产高清在线精品一区不卡 | 日日干夜夜草 | 午夜成人亚洲理论片在线观看 | 国产情人综合久久777777 | 草久久久久久 | 精品久久久久久无码专区不卡 | 欧美jizz18 | 小黄鸭精品aⅴ导航网站入口 | 国产精品久久久午夜夜伦鲁鲁 | xx色综合| 亚洲精品四区 | 日韩在线欧美 | 国产视频一区二区三区四区 | 亚洲天堂一区二区三区四区 | 欧美视频色 | 我我色综合 | 亚洲校园激情 | 国产福利小视频在线 | 国产免费一区二区 | 国产高潮久久 | 欧美一级爱爱视频 | 日韩欧美国产另类 | 曰韩一级片 | 欧美城天堂网 | 亚州av| 国产成人+亚洲欧洲+综合 | 久久久无码精品一区二区三区蜜桃 | 成人免费观看激情视频 | 国产成人精品综合在线观看 | 日批视频免费播放 | 亚洲综合第一 | 成人精品gif动图一区 | 三浦步美一区二区三区 | 成人性生交免费大片2 | 香蕉久久一区二区不卡无毒影院 | 青青青国产在线观看免费 | 99爱在线| 亚洲天堂午夜 | 国产丰满果冻videossex | 成片免费观看视频大全 | 国产亚洲一区二区三区四区 | 亚洲欧美精品suv | 欧美亚洲欧美 | 成人网战 | 国产一区二区三区四区五区vm | 97精品国产手机 | 美女隐私免费看 | av黄色免费观看 | 少妇尝试黑人粗吊受不了 | 免费精品视频一区二区三区 | 成人vagaa免费观看视频 | 亚洲日韩欧美综合 | 国产成人精品亚洲男人的天堂 | 国产精品va无码一区二区 | 激情三级在线 | 黄色一级小视频 | 99久久精品国产成人一区二区 | 国产精品久久久久9999鸭 | 8050午夜二级无码中文字幕 | 可以直接看的毛片 | 一区二区三区视频免费看 | 欧美黑人欧美精品刺激 | 成人在线三级 | 天天天天天干 | 中文日韩一区二区 | 草草影院ccyycom | 色哟哟精品观看 | 北京少妇宾馆露脸对白 | 亚洲精品国产主播一区 | 国产v综合v亚洲欧美久久 | 装睡被陌生人摸出水好爽 | 久久丫精品国产 | 日韩精品一卡 | 免费三级黄色 | www国产亚洲精品久久网站 | 麻花豆传媒mv在线观看 | av永久天堂一区二区三区 | 亚洲成人激情av | 欧美性色网| 国产漂亮白嫩美女在线观看 | 四虎影视www在线播放 | 国产草草影院 | 奇米第四色一二三四区 | 丰满少妇高潮惨叫视频 | 一区二区三区黄色片 | 新版天堂资源中文8在线 | 久久中文字幕一区二区三区 | 在线观看黄av | 无码精品国产一区二区三区免费 | 深夜福利视频在线 | 97香蕉久久超级碰碰高清版 | 国产欧美视频在线播放 | 亚洲国产精品久久久久久女王 | 久久高清内射无套 | 国产人妻精品一区二区三区 | 草色噜噜噜av在线观看香蕉 | 成人免费毛片男人用品 | 久久综合九色综合欧美狠狠 | 久久九九国产精品 | 久久久久久久久久免费视频 | 69伊人| 成人性生交大片免费看96 | 日韩欧美人人爽夜夜爽 | 1区2区3区视频 | 欧美色综合天天久久综合精品 | 国产成人精品亚洲午夜麻豆 | 久草aⅴ | 5999在线视频免费观看 | 精品国产一区二区三区久久影院 | 国产成人手机高清在线观看网站 | 亚洲人高潮女人毛茸茸 | 亚洲一区h | 能在线看的av | 国产一级一片免费播放放a 国产一级一片射内视频 | 96成人爽a毛片一区二区 | 久久视频免费 | 国内精品伊人久久久久网站 | 欧美成人性色 | 国产精品亚洲综合一区二区三区 | 天天鲁在视频在线观看 | 又色又爽又黄又免费的照片 | 国产a国产国产片 | 久久久久久免费毛片精品 | 欧美另类xxx | 国产免费啪啪 | 日本xxxx丰满人妖学校 | 饥渴的熟妇张开腿呻吟视频 | 欧美日韩国产在线精品 | 国产sm鞭打调教女m视频 | 国产精品久久久久久久久久久不卡 | 日本免费人成视频播放 | 日韩视频在线一区 | 久久久久夜夜夜精品国产 | 播播成人网 | 欧美日b片| 李丽珍裸体午夜理伦片 | 日本不卡一区二区三区 | 欧美freesex黑人又粗又大 | 尤物视频在线观看 | 国产精品人人爽人人爽av | 国产热99| 中国性xxx | 艳妇臀荡乳欲伦69调教视频 | 正在播放国产精品 | 三级网站在线免费观看 | 日本xxxxxxxxxx天美| 欧美日韩1区2区 | 欧美一区二区在线免费观看 | 黄色片视频免费观看 | 成人网站免费观看 | 在线精品视频一区二区三区 | 国产精品久久久久久2021 | 日韩亚洲欧美中文高清 | 亚洲精品成人片在线播放 | 国产淫语对白粗口video |

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品