怎么使用stm32寫IAP的bootloader和APP
Stm32的bootloader和App的編寫注意事項
1、怎么分配bootloader和app的空間
2、怎么得到數(shù)據(jù)和寫入flash
3、怎么從bootloader跳轉(zhuǎn)到app
4、怎么設(shè)置App的中斷向量
5、App中怎么生成bin文件
6、程序執(zhí)行的流程
1、怎么分配bootloader和app的空間
因為我用的是stm32f103c8t6,它的flash的大小是64k,所以把它分成如上所示
0x08000000 ---0x0800 33FF分配給bootloader使用,大小是13k
0x0800 3400----0x080097FF分配給第一個APP的使用,大小是25k
0x08009800----0x0800 FBFF分配給第二個APP的使用,大小是25k
0x0800FC00----0x0800 FFFF 分配給user_flag和其它標(biāo)志使用,大小是1k
在keil中設(shè)置rom的大小
A、bootloader中rom大小的設(shè)置
B、APP1中rom大小的設(shè)置
C、APP2中rom大小的設(shè)置
Rom設(shè)置好了就可以在map中看見地址的改變,這里拿bootloader和app1來說。
Bootloader的map
App1的map
這里就可以看到RESET的地址改變了
但是要想我們改變的rom在map中也改變keil里面必須要設(shè)置如下圖,
這里必須要打勾,默認(rèn)新建的工程是沒有選擇的
2、怎么得到數(shù)據(jù)和寫入flash
在我的程序是通過串口接收數(shù)據(jù),然后調(diào)用app_bin_handler(&timer);函數(shù)來在里面完成寫flash(函數(shù)iap_write_appbin(Flash_Current_Write_addr(),g_RxBuf1,length))、和校驗寫入的數(shù)據(jù)是否正確(函數(shù)flag =read_flash_ECC(Flash_Current_Write_addr(),length);)、校驗通過就可以跳轉(zhuǎn)到app中(函數(shù)JumpToApp(Flash_Current_Write_addr(),1);)
3、怎么從bootloader跳轉(zhuǎn)到app
voidJumpToApp(u32 ApplicationAddress,u8 flag)
{
u32 temp;
if (((*(vu32*)ApplicationAddress) &0x2FFE0000 ) == 0x20000000)
{
if(flag == 1)
{
User_write_Flash_falg();
}
temp = (*(vu32*)(ApplicationAddress + 4));
JumpToApplication =(FunVoidType)temp;
MSR_MSP(*(vu32*)ApplicationAddress);
JumpToApplication();
}
}
程序中就是利用上面的函數(shù)實現(xiàn)跳轉(zhuǎn),中間有個User_write_Flash_falg()函數(shù)是用來設(shè)置app的標(biāo)志的,如果當(dāng)前正在使用的是app1,那么就設(shè)置標(biāo)志位為2,好在下次啟動的時候跳轉(zhuǎn)到app2,如果當(dāng)前正在使用的是app2,那么就設(shè)置標(biāo)志位為1,好在下次啟動的時候跳轉(zhuǎn)到app1
至于上面函數(shù)的詳解可以百度。
4、怎么設(shè)置App的中斷向量
Stm32的中斷重定向比較簡單,因為它有一個專用的寄存器
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x9800);
這個函數(shù)就是重定向了app2的中斷向量,實現(xiàn)起來簡單
6、App中怎么生成bin文件
因為我的程序是通過串口下載app的所以必須要生成bin文件,才方便下載,
在工程里面進(jìn)行如下設(shè)置就可以生成bin文件
其中主要是路徑要對,不然找不到.axf文件,也就生成不了bin文件
總結(jié):
Bootloader里面主要是
1、設(shè)置bootloader和app的空間
2、接收編譯好的app的bin文件,寫入flash
3、實現(xiàn)跳轉(zhuǎn)
App里面主要修改的地方是
1、ROM起始地址和分配的空間大小
2、重定向中斷向量
3、生成bin文件
這里就是整個程序執(zhí)行的流程