STM32 IAP Consideration
Bootloader可以實作IAP(In-Application Programming)。IAP是軟體運行中升級自己,電腦升級BIOS也算IAP,我們執行程式就能更新BIOS。開發IAP是為了重燒軟體,所以要先問:能否不要折騰IAP MCU已經有內建的燒錄程式 參考 STM AN2606 文件,STM32F103C8開機讓boot0 pin = high就能用內建bootloader開機。這段軟體是STM寫好,直接刻在IC裡面 STM32F103C8T6的Bootloader提供的資源,最重要的資訊是:他用USART1和外界溝通 這份軟體的行為能看 STM AN3155 ,開機過程如下圖,支援的命令我也列出來。表格最重要的內容是Read Memory/ Write Memory/ Erase。也就是說,開發者買個USB to UART的dongle,就可以燒寫MCU了 如果不想自己寫程式燒寫MCU,STM也提供 STM32 Flash Loader ,他就是用上面的bootloader protocol和MCU溝通 為什麼原廠程式不合用 要啟動原廠Bootloader,需要滿足以下兩個條件 Boot0 pin = 1 看得到UART pins 我得打開機殼才能湊滿條件(不開機殼是先決條件),所以原廠的解決方案不能用。所以我得重現原廠所有工作量,達成我的目的。這種東西沒標準,想怎麼搞都可以,開心就好 IAP框架設計 一般我們會把IAP拆解成一系列步驟,每次PC下命令讓MCU做一小步。PC負責串流程(想修改也方便),MCU只做簡單的操作。我的電路是CAN bus對外,IAP得從通訊界面著手,我定義的框架如下: PC透過CAN bus後門把更新軟體寫入Flash PC通知MCU計算checksum PC寫入觸發訊號 PC通知MCU重新開機 MCU開機經過Bootloader,看到觸發信號,把更新軟體覆蓋原軟體,並且清除觸發信號。操作完成後,跳轉回主程式開始執行 我在韌體端,定義以下的操作。記住這東西沒標準,想怎麼做都可以! IAP_ERASE_PAGE IAP_SET_ADDR IAP_PROGRAM_FLASH IAP_GET_BUF_DEPTH IAP_PROGRAM_FLASH_SEND_WORD IAP_PROGRAM_FLASH_BATCH IAP_CHECK