本文目的
- 本文將記錄如何在沁恆的cortex-m0平台的藍牙芯片上實現用戶bootloader引導用戶app方式,並且變相解決中斷向量表重映射的問題
- 用戶app包括一般的工程,和藍牙工程
- 本bootloader跟wch芯片內置的bootloader不同,並不燒錄到芯片自帶的bootloader區域.
- 在本例程的基礎上經過簡單的修改,既可以實現各種方式的DFU功能,諸如串口/BLE/USB/ETH方式等,只要實現傳輸,校驗,跳轉即可
適用芯片
- CH577/CH578/CH579
實現過程
存儲配置
flash地址 | 備注 | |
---|---|---|
中斷二次跳轉固件 | 0 - 0x1FF | 此部分已經包含在user_bootloader中的vector_remap.c 文件中 |
user_bootloader | 0x200 - 0x3FFF | |
user_app | 0x4000 - |
中斷重映射
CH577/578/579 是arm cortex-m0內核的芯片,該內核並不提供原生的中斷重映射功能,一般各廠商都是自行實現(如STM32 系列的可以放在RAM的起始地址). WCH的"解決方法"是芯片提供了叫RB_ROM_CODE_OFS的寄存器標志位,使能該位后,flash控制器讀寫整體向后偏移32K(比如實際0x8000的地址,會變為0地址),此方法不在本文范疇內.
本文實現的方法是:在flash的0地址放入一段固定代碼,接管所有的中斷,然后根據標志位,再次跳轉到user_bootloader還是user_app的實際的中斷服務程序里. 該標志位對應關系:
//R8_GLOB_RESET_KEEP bit7=1 for this bootloader interrupt
//R8_GLOB_RESET_KEEP bit7=0 for user app interrupt
燒錄
使用hex合並工具把hex合並后然后用WCH 的isp工具進行燒錄即可
- 合並工具 https://gitee.com/iot-fan/iot-fan_at_cnblogs/tree/master/Tools/hex_tools
- 燒錄參考 https://www.cnblogs.com/iot-fan/p/13498088.html
注意事項
- wchisptool 對於hex文件處理方式:不連續的hex 填充0x00,而不是0xff,如果涉及到不連續的固件在自己實現的bootloader里進行校驗,可能需要燒錄時候用戶自己進行hex轉成bin文件燒錄.
工程源碼
擴展資料
實現自定義的BLE OTA
根據blog:CH579/CH578/CH577/CH57x應用與協議棧分離方式實現,在本bootloader中啟動藍牙協議棧,實現藍牙傳輸,即可實現藍牙的DFU.