STM32F103C8在应用编程(IAP)介绍及实现
1,ISP和IAP介紹和比較
STM32F103單片機默認支持ISP(在系統編程In System Programming, ISP),即通過ISP軟件(Flash_Loader_Demonstrator)通過USART1向Flash燒寫程序。它的實現方式是通過單片機的Boot0和Boot1引腳來讓單片機進入系統存儲器啟動方式(ISP啟動),系統存儲器中是廠商提供的bootload固件。這種方式得優點是使用廠商的bootload和下載軟件,方便簡單。但缺點是必須通過硬件引腳設置,無法實現在線升級。
IAP(在應用編程(In Application Programming, IAP)是另一種可下載固件的方式,它可以實現在線升級,但需要自己開發bootload。單片機啟動模式使用主Flash啟動。
下圖是STM32單片機的3種啟動方式:(通過Boot0和Boot1引腳設置選擇)
ISP模式,單片機上電啟動后,會直接執行用戶程序;
IAP模式,單片機上電會先運行bootloader,bootloader決定是下載固件還是執行用戶程序。
?
2,IAP的Flash分配情況
Flash中需要有2塊固件,分別是bootload和application,如下圖:
具體Flash分配如下:
?
3,bootload實現的技術要點
在工程中需要設置Flash和Ram空間如下:
?
定義application的起始地址
#define ApplicationAddress??? 0x8002000 // 8K
?
跳轉到application的代碼:
typedef? void (*pFunction)(void);
static void start_application()
{
? /* Jump to user application */
? uint32_t JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
? pFunction Jump_To_Application = (pFunction) JumpAddress;
? /* Initialize user application's Stack Pointer */
? __set_MSP(*(__IO uint32_t*) ApplicationAddress);
? Jump_To_Application();
}
?
4,application實現的技術要點
在工程中需要設置Flash和Ram空間如下:
?
因為0x08000000處存儲的是bootload的中斷向量表,application的中斷向量表存儲在在0x08002000,所以需要在main函數開始處,執行中斷向量offset設置。
? NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
?
而且bootload下載固件是用的bin文件,我們需要通過執行如下命令生成bin文件
C:\Keil\ARM\ARMCC\bin\fromelf.exe --bin -o? ..\Output\application.bin ..\Output\application.axf
在Keil中如下設置,可在編譯完成后自動生成。
?
5,固件燒錄步驟
1,燒錄bootload
使用Flash_Loader_Demonstrator工具下載bootload.hex到單片機
?
2,下載application
使用Hypertrm下載application.bin到單片機
?
Hypertrm 的串口設置如下:
單片機上電,bootloader啟動
輸入1,bootload進入Download Image模式
選擇菜單Transfer下的Send File…
選擇要下載的程序application.bin,協議選擇Ymodem
點擊Send,開始傳輸
等待傳輸完成后,輸入3啟動application
?
ISP軟件Flash_Loader_Demonstrator,超級終端Hypertrm,STM32F103C8T6的bootload和application的完整工程代碼可從下面的分享中下載。
https://download.csdn.net/download/tanzj123/14964219
?
總結
以上是生活随笔為你收集整理的STM32F103C8在应用编程(IAP)介绍及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自己动手实现一个malloc内存分配器
- 下一篇: 这两种printf()函数重定向方法,太