標籤:
Stm32的bootloader和App的編寫注意事項
1、 怎麼分配bootloader和app的空間
2、 怎麼得到資料和寫入flash
3、 怎麼從bootloader跳轉到app
4、 怎麼設定App的中斷向量
5、 App中怎麼產生bin檔案
6、程式執行的流程
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和其它標誌使用,大小是1k
在keil中設定rom的大小
A、bootloader中rom大小的設定
B、APP1中rom大小的設定
C、APP2中rom大小的設定
Rom設定好了就可以在map中看見地址的改變,這裡拿bootloader和app1來說。
Bootloader的map
App1的map
這裡就可以看到RESET的地址改變了
但是要想我們改變的rom在map中也改變keil裡面必須要設定如,
這裡必須要打勾,預設建立的工程是沒有選擇的
2、怎麼得到資料和寫入flash
在我的程式是通過串口接收資料,然後調用app_bin_handler(&timer);函數來在裡面完成寫flash(函數iap_write_appbin(Flash_Current_Write_addr(),g_RxBuf1,length))、和校正寫入的資料是否正確(函數flag =read_flash_ECC(Flash_Current_Write_addr(),length);)、校正通過就可以跳轉到app中(函數JumpToApp(Flash_Current_Write_addr(),1);)
3、怎麼從bootloader跳轉到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();
}
}
程式中就是利用上面的函數實現跳轉,中間有個User_write_Flash_falg()函數是用來設定app的標誌的,如果當前正在使用的是app1,那麼就設定標誌位為2,好在下次啟動的時候跳轉到app2,如果當前正在使用的是app2,那麼就設定標誌位為1,好在下次啟動的時候跳轉到app1
至於上面函數的詳解可以百度。
4、怎麼設定App的中斷向量
Stm32的中斷重新導向比較簡單,因為它有一個專用的寄存器
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x9800);
這個函數就是重新導向了app2的中斷向量,實現起來簡單
6、 App中怎麼產生bin檔案
因為我的程式是通過串口下載app的所以必須要產生bin檔案,才方便下載,
在工程裡面進行如下設定就可以產生bin檔案
其中主要是路徑要對,不然找不到.axf檔案,也就產生不了bin檔案
總結:
Bootloader裡面主要是
1、設定bootloader和app的空間
2、接收編譯好的app的bin檔案,寫入flash
3、實現跳轉
App裡面主要修改的地方是
1、 ROM起始地址和分配的空間大小
2、 重新導向中斷向量
3、 產生bin檔案
這裡就是整個程式執行的流程
怎麼使用stm32寫IAP的bootloader和APP