远程升级stm32程序_STM32IAP远程升级带C#上位机
關(guān)注“電子芯吧客” ,每周都有精彩文章推薦
????在很多場景應(yīng)用中需要我們的控制器能夠?qū)崿F(xiàn)遠(yuǎn)程升級,比如我之前做的一個項(xiàng)目中,項(xiàng)目的主要需求就是老師的電腦能夠獲取學(xué)生的實(shí)驗(yàn)設(shè)備的實(shí)驗(yàn)數(shù)據(jù)。第一批測試完成之后,所有的學(xué)生設(shè)備的主控板子都上線了。運(yùn)行了大概一個月,買家那邊發(fā)現(xiàn)有些功能需要更新。沒辦法只能把這批100多塊主控板從學(xué)生設(shè)備的機(jī)箱里面拆出來,然后一塊一塊燒寫好程序之后,再裝回去。這個時候就很后悔當(dāng)初沒有把IAP遠(yuǎn)程升級的功能加到這里面去。加了這個功能一方面好和買家談價錢,另一方面方便自己。
? ? IAP的大概意思就是在自己目前運(yùn)行的程序中,對用戶的另外部分內(nèi)存進(jìn)行燒寫,燒寫完成之后,再跳轉(zhuǎn)到燒寫好的那一部分程序(也就是升級之后的程序)當(dāng)中。所以這里面大概需要了解的是
1、STM32的ROM起始地址以及ROM大小;
2、STM32對flash的讀寫;
3、程序中斷的指針偏移等。
? ? 要實(shí)現(xiàn)IAP遠(yuǎn)程升級,程序包含兩部分
1、IAP跳轉(zhuǎn)程序;
2、APP運(yùn)行程序。
大致思路為:程序開始從IAP進(jìn)入,IAP中判斷是否有收到升級包,如果沒有升級包跳轉(zhuǎn)到APP程序。有則燒寫新的升級包。跳轉(zhuǎn)至APP程序后,APP程序完成我們項(xiàng)目需求的功能,并加上一個跳轉(zhuǎn)回IAP的指令。
? ? 上位機(jī)程序中,將固件分包為2K一包,包頭加上0X5A的固定頭,以及長度字符(以0xA5為結(jié)尾標(biāo)志),0xaa為包尾。IAP程序從0x08000000-0x08010000,APP從0x0801000開始。
? ? 下面為IAP的主函數(shù),IAP程序從0x08000000開始,主要設(shè)置了串口1、按鍵、LED燈,以及延遲函數(shù)。程序采用串口1接收升級的固件包。當(dāng)接收到數(shù)據(jù)時,先判斷包頭和包尾是否正確。再將分包放入待燒寫的數(shù)組中,燒寫后,燒寫的位置 Flash_App_Pos 也相應(yīng)的增加剛才接收的升級包的長度(去除了包頭包尾)。待接收到0xA5的包時,表示接收到最后的一包升級分包。接收完成后,燒寫成功后,即可開啟跳轉(zhuǎn)。因篇幅問題,將程序中的1分鐘未接收到升級包便跳轉(zhuǎn)至APP程序略去。程序如下:
函數(shù)主要有設(shè)置偏移的語句? SCB->VTOR = FLASH_BASE; //@@* Vector Table Relocation in Internal FLASH. */FLASH_BASE=0X08000000;
int main(void)
?{?? ?
?? ?u8 t,half_s;
?? ?u8 times=0;
?? ?u16 oldcount=0;?? ??? ??? ??? ??? ??? ?//老的串口接收數(shù)據(jù)值
?? ?u16 applenth=0;?? ??? ??? ??? ??? ??? ?//接收到的app代碼長度
?? ?u16 buf=0;
?? ?u8 CodeSize;?
?? ?u16 i;?
?? ?SCB->VTOR = FLASH_BASE; /@@* Vector Table Relocation in Internal FLASH. */?? ??
?? ?delay_init();
?? ?uart_init(115200);
?? ?LED_Init();
?? ?KEY_Init();
?? ?STMFLASH_Read(CONFIG_PARAM_ADDR, &buf, 1);
?? ?if(buf!=0xAA)
?? ?{?? ?
?? ???if(((*(vu32*)0x8000000)&0x2FFE0000)==0x20000000)?? ?//檢查棧頂?shù)刂肥欠窈戏?
?? ???? {
?? ??? ?delay_init();
?? ??? ?uart_init(115200);
?? ??? ?LED_Init();
?? ??? ?KEY_Init();
?? ??? }
?? ?}
?? __enable_irq(); ??? ??? ?
? while(1)
?? ?{?? ??? ?
?? ?if(USART_RX_CNT)
?? ?{
?? ?????if(oldcount==USART_RX_CNT)//新周期內(nèi),沒有收到任何數(shù)據(jù),認(rèn)為本次數(shù)據(jù)接收完成.
?? ??? ?{
?? ??? ??? ?applenth=USART_RX_CNT;
?? ??? ??? ?if(USART_RX_BUF[0]==0x5a&&USART_RX_BUF[applenth-1]==0xaa)
?? ??? ??? ?{
?? ??? ??? ??? ?LED0=0;?? ?
?? ??? ??? ??? ?for(i=0;i?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?Upstring[i]=USART_RX_BUF[i+2];
?? ??? ??? ??? ?}?? ?
?? ??? ??? ??? ?LED0=1;
?iap_write_appbin(Flash_App_Pos,Upstring,applenth-3);//更新FLASH代碼?? ??? ??? ??? ??? ?
?? ??? ??? ??? ?Flash_App_Pos+=(applenth-3);?? ??? ??? ??? ?
?? ??? ??? ??? ?backdata[1]=USART_RX_BUF[1];
?? ??? ??? ??? ?Usart1_SendStr_length(backdata,3);
?? ??? ??? ??? ? if(USART_RX_BUF[1]==0xa5)
?? ??? ??? ??? ?{
?? ??? ??? ??? ???? iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASH APP代碼FLASH_APP1_ADDR=0X08010000
?? ??? ??? ??? ?}?? ??? ??? ??? ??? ?
?? ??? ??? ?}?? ??? ??? ??? ?
?? ??? ??? ?oldcount=0;
?? ??? ??? ?USART_RX_CNT=0;?? ??? ??? ??? ??? ??? ??? ?
?? ??? ?}else oldcount=USART_RX_CNT;?? ??? ??? ?
?? ?}
?? ?t++;
?? ?delay_ms(100);
?}
}
IAP程序點(diǎn)開魔法棒設(shè)置size為0x10000.
APP程序主要采用了FreeRTOS操作系統(tǒng),創(chuàng)建了LED翻轉(zhuǎn)的任務(wù),串口1接收到數(shù)據(jù)之后之后處理的任務(wù),以及看門狗喂狗任務(wù)。同樣在程序開始時,需要設(shè)置偏移。
NVIC_SetVectorTable(FLASH_APP1_ADDR,0);
串口接收到0XAA,0XBB,0XCC,0XDD,0XEE。的跳轉(zhuǎn)回IAP的指令之后,便寫入config之后,開始跳轉(zhuǎn)。跳轉(zhuǎn)前,關(guān)閉所有中斷,并清除標(biāo)志位。
程序如下:
總結(jié)
以上是生活随笔為你收集整理的远程升级stm32程序_STM32IAP远程升级带C#上位机的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蜜雪冰城回应IPO 看看官方对上市怎么说
- 下一篇: 上海汇付数据备付金是什么意思