怎么使用stm32寫(xiě)IAP的bootloader和APP
Stm32的bootloader和App的編寫(xiě)注意事項(xiàng)
1、怎么分配bootloader和app的空間
2、怎么得到數(shù)據(jù)和寫(xiě)入flash
3、怎么從bootloader跳轉(zhuǎn)到app
4、怎么設(shè)置App的中斷向量
5、App中怎么生成bin文件
6、程序執(zhí)行的流程
1、怎么分配bootloader和app的空間
因?yàn)槲矣玫氖莝tm32f103c8t6,它的flash的大小是64k,所以把它分成如上所示
0x08000000 ---0x0800 33FF分配給bootloader使用,大小是13k
0x0800 3400----0x080097FF分配給第一個(gè)APP的使用,大小是25k
0x08009800----0x0800 FBFF分配給第二個(gè)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中看見(jiàn)地址的改變,這里拿bootloader和app1來(lái)說(shuō)。
Bootloader的map
App1的map
這里就可以看到RESET的地址改變了
但是要想我們改變的rom在map中也改變keil里面必須要設(shè)置如下圖,
這里必須要打勾,默認(rèn)新建的工程是沒(méi)有選擇的
2、怎么得到數(shù)據(jù)和寫(xiě)入flash
在我的程序是通過(guò)串口接收數(shù)據(jù),然后調(diào)用app_bin_handler(&timer);函數(shù)來(lái)在里面完成寫(xiě)flash(函數(shù)iap_write_appbin(Flash_Current_Write_addr(),g_RxBuf1,length))、和校驗(yàn)寫(xiě)入的數(shù)據(jù)是否正確(函數(shù)flag =read_flash_ECC(Flash_Current_Write_addr(),length);)、校驗(yàn)通過(guò)就可以跳轉(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ù)實(shí)現(xiàn)跳轉(zhuǎn),中間有個(gè)User_write_Flash_falg()函數(shù)是用來(lái)設(shè)置app的標(biāo)志的,如果當(dāng)前正在使用的是app1,那么就設(shè)置標(biāo)志位為2,好在下次啟動(dòng)的時(shí)候跳轉(zhuǎn)到app2,如果當(dāng)前正在使用的是app2,那么就設(shè)置標(biāo)志位為1,好在下次啟動(dòng)的時(shí)候跳轉(zhuǎn)到app1
至于上面函數(shù)的詳解可以百度。
4、怎么設(shè)置App的中斷向量
Stm32的中斷重定向比較簡(jiǎn)單,因?yàn)樗幸粋€(gè)專用的寄存器
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x9800);
這個(gè)函數(shù)就是重定向了app2的中斷向量,實(shí)現(xiàn)起來(lái)簡(jiǎn)單
6、App中怎么生成bin文件
因?yàn)槲业某绦蚴峭ㄟ^(guò)串口下載app的所以必須要生成bin文件,才方便下載,
在工程里面進(jìn)行如下設(shè)置就可以生成bin文件
其中主要是路徑要對(duì),不然找不到.axf文件,也就生成不了bin文件
總結(jié):
Bootloader里面主要是
1、設(shè)置bootloader和app的空間
2、接收編譯好的app的bin文件,寫(xiě)入flash
3、實(shí)現(xiàn)跳轉(zhuǎn)
App里面主要修改的地方是
1、ROM起始地址和分配的空間大小
2、重定向中斷向量
3、生成bin文件
這里就是整個(gè)程序執(zhí)行的流程