一。概念素養(yǎng)
1.內(nèi)購
IAP 是 In 的縮寫。IAP是用戶自己的程序,在運(yùn)行過程中對(duì)部分User Flash進(jìn)行編程。目的是在產(chǎn)品發(fā)布后,通過預(yù)留的通訊端口方便地更新產(chǎn)品中的固件程序。更新和升級(jí)。
通常,當(dāng)用戶需要實(shí)現(xiàn)IAP功能,即用戶程序進(jìn)行自己的更新操作時(shí),需要在設(shè)計(jì)固件程序時(shí)編寫兩個(gè)工程代碼。第一個(gè)項(xiàng)目程序不執(zhí)行正常的功能操作草叢筆刷,而只是通過某種通信管道(例如USB、USART)接收程序或數(shù)據(jù)并對(duì)第二部分代碼進(jìn)行更新;第二項(xiàng)代碼是真正的功能代碼。
2.
在上述IAP概念中,它是它的第一個(gè)項(xiàng)目程序。主要功能有:從串口、USB等媒體接收數(shù)據(jù);存儲(chǔ)和傳輸數(shù)據(jù);程序跳轉(zhuǎn)等功能。
3.應(yīng)用
IAP 概念中第二項(xiàng)代碼的術(shù)語
編寫Stm32和App的注意事項(xiàng)
1、如何分配和app地址空間
2、如何獲取升級(jí)軟件數(shù)據(jù)并寫入閃存
3、如何從一個(gè)應(yīng)用跳轉(zhuǎn)到另一個(gè)應(yīng)用
4、如何設(shè)置app的中斷向量
5、如何在App中生成bin文件
6、程序執(zhí)行流程
1、如何分配和app地址空間
圖1 STM32 Flash分區(qū)情況
(1)分配地址
我正在使用,它的flash大小是512K,所以我把它拆分成這樣:
--- 分配使用,大小為 64k
---- 分配給第一個(gè)APP使用,大小為124k
---- 分配給其他標(biāo)志并被其他標(biāo)志使用
(2)在keil中設(shè)置ROM的大小
A. 中 ROM 大小的設(shè)置
B.在App中設(shè)置ROM的大小
2、如何獲取升級(jí)軟件數(shù)據(jù)并寫入閃存
在我的程序中Photoflare(開源圖像處理工具),它通過串口接收數(shù)據(jù),然后調(diào)用(u32,u8*,u32)將接收到的APP程序存儲(chǔ)在FLASH中,也就是應(yīng)用程序的起始地址,也就是應(yīng)用程序CODE,即應(yīng)用程序的大小(字節(jié)),代碼如下:
#define FLASH_APP1_ADDR 0x08010000 //第一個(gè)應(yīng)用程序起始地址
if(applenth)//串口接收數(shù)據(jù)長度
{
printf("開始更新固件...\r\n");
LCD_ShowString(30,210,200,16,16,"Copying APP2FLASH...");
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
{
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代碼
LCD_ShowString(30,210,200,16,16,"Copy APP Successed!!");
printf("固件更新完成!\r\n");
}else
{
LCD_ShowString(30,210,200,16,16,"Illegal FLASH APP! ");
printf("非FLASH應(yīng)用程序!\r\n");
}
}else
{
printf("沒有可以更新的固件!\r\n");
LCD_ShowString(30,210,200,16,16,"No APP!");
}
clearflag=7;//標(biāo)志更新了顯示,并且設(shè)置7*300ms后清除顯示
void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
{
u32 t;
u16 i=0;
u32 temp;
u32 fwaddr=appxaddr;//當(dāng)前寫入的地址
u8 *dfu=appbuf;
for(t=0;t
3、如何從一個(gè)應(yīng)用跳轉(zhuǎn)到另一個(gè)應(yīng)用
//跳轉(zhuǎn)到應(yīng)用程序段
//appxaddr:用戶代碼起始地址.
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //檢查棧頂?shù)刂肥欠窈戏?
{
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用戶代碼區(qū)第二個(gè)字為程序開始地址(復(fù)位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆棧指針(用戶代碼區(qū)的第一個(gè)字用于存放棧頂?shù)刂?
jump2app(); //跳轉(zhuǎn)到APP.
}
}
4、如何設(shè)置app的中斷向量
SCB->VTOR = | ;/*中斷向量表位于()+*/
因?yàn)锳PP的起始地址是()+
5、如何在App中生成bin文件
我們點(diǎn)擊 MDK 中的 ?User 選項(xiàng)卡下載stm32程序的軟件,在 After Build/ 列中下載stm32程序的軟件,選中 Run #1,然后寫入:D:\tools\mdk5.14\ARM\ARMCC\bin\.exe -- bin -o ..\OBJ\RTC.bin..\OBJ\RTC.axf迅捷Gif制作工具,如圖:
6、程序執(zhí)行流程
總結(jié):
里面主要是
1、設(shè)置和應(yīng)用空間
2、接收編譯好的app的bin文件寫入flash
3、實(shí)現(xiàn)跳轉(zhuǎn)
該應(yīng)用程序的主要變化是:
1、 ROM 起始地址和分配的空間大小
2、 重定向中斷向量
3、 生成bin文件