瞭解更多關於bootloader 的C語言實現,請加我QQ: 1273623966 (驗證信息請填 bootloader),歡迎諮詢或定製bootloader(在線升級程序)。
手上有塊Renesas RH850 F1KM的板子,幾個月前有些空,準備給它寫個串口bootloader。 寫完後發現在debug模式下,bootloader工作很正常,能夠正常燒寫應用程序。但是在release模式下一直有R_FCL_ERR_PARAMETER錯誤,一直解決不了。後來非常忙,就沒再去倒弄它了。昨天有點空,就仔細地查看了下。發現在boot.asm中有以下定義。
;-----------------------------------------------------------------------------
; hdwinit
; Specify RAM addresses suitable to your system if needed.
;-----------------------------------------------------------------------------
GLOBAL_RAM_ADDR .set 0
GLOBAL_RAM_END .set 0
LOCAL_RAM_ADDR .set 0
LOCAL_RAM_END .set 0
查看datasheet, 修改成實際值後, 就運行正常了。很有意思。
;-----------------------------------------------------------------------------
; hdwinit
; Specify RAM addresses suitable to your system if needed.
;-----------------------------------------------------------------------------
GLOBAL_RAM_ADDR .set 0xFEDD8000
GLOBAL_RAM_END .set 0xFEDE0000
LOCAL_RAM_ADDR .set 0xFEDE0000
LOCAL_RAM_END .set 0xFEE00000
接下來介紹下RH850 F1KM 串口 bootloader 如何實現。
首先介紹實現環境,IDE是CS+, C編譯器是CC-RH, 硬件板是我的學習板, 詳細如下:
IDE : CS+ for CC V7.00.00 [13 Jun 2018]
Compiler: CC-RH V2.00.00
MCU: RH850 F1KM R7F701684
FCL: RENESAS_FCL_RH850_T01_V2.12
我的bootloader和application的memory map設計如下:
bootloader code range: 0x0000~0x17FFF
application code range: 0x18000~0x1FFFFF (offset 0x18000)
bootloader code range設置,需要通過修改CS+ bootloader工程的Linker Option來實現。
application code range設置, 也需要修改CS+ application工程的Linker Option來實現。具體可以查閱CS+的幫助。
另外,application 的interrupt 入口需要在CS+ application工程中的boot.asm中添加。
bootloader 的上位機是串口終端hyperterm(超級終端)。 hyperterm的配置(串口配置)如下:
baud rate: 19200
data bytes: 8
parity: none
stop bits: 1
flow control : none
line delay: 150ms
上電後, bootloader 初始化uart (baudrate-data bytes-parity-stop bits-flow control 要和hyperterm的配置一致,19200-8-none-1-none, 否則通信不了)。bootloader 然後每隔1S左右打印一個 '.' , 打印完6個'.' (6S)就跳轉到application. 如果要更新程序,就在6S內在hyperterm 窗口中敲一回車。bootloader 收到回車(代表握手成功)就開始擦除application code range. 打印 “Erasing *********" 每擦除一個block (1024 bytes) 就增加打印一個 ”*“直到所有application blocks都擦除完畢,並打印”Done“(代表擦除成功)。
hyperterm 窗口顯示了bootloader 完成Erase後打印的”Done“,就操作hyperterm採用發送文本的方式發送application 的hex文件,一行接一行的發送,每發送一行就暫停240ms (配置hyperterm參數line delay = 240ms).
bootloader 每接收一行,原樣打印,並解讀裏面的數據類型,地址,長度,數據,和Checksum, 如果數據類型爲S1或S2,就將接收到的數據燒寫到對應的地址。直到最後一行也處理完畢。整個燒寫過程都沒問題就打印”Program Rewritten Complete“ “(代表更新成功)。並跳轉到application。 如果燒寫過程有問題就打印”Program Rewritten Complete with Error“。
以上就是bootloader的更新程序的整個邏輯。代碼框架如下:
void M_Bootloader_MainFunc(void) { switch (bootState) { case BOOT_HANDSHAKE: M_Bootloader_Handshake(); break; case BOOT_ERASE: M_Bootloader_Erase(); break; case BOOT_RECEIVE: M_Bootloader_Receive(); break; case BOOT_PROGRAM: M_Bootloader_Write(); break; case BOOT_VERIFY: M_Bootloader_IVerify(); break; case BOOT_PREJUMP: Prejump_To_Application(); break; case BOOT_JUMPTO_APP: Jump_To_Application(); break; default: break; } }
整個過程, hyperterm中打印出來的內容就是更新流程log. 下面是一個完整的更新流程的部分log.
....BOOT Mode Erasing*****************************Done S0E0000726838353046314B6D6F7468 S090000E0020080010093 S214018000E0022480000000000000000000000000E4 S2140180101F00E0020E800000000000000000000CB S214018020E0020080000000000000000000000000E8 S214018030E002F07F000000000000000000000000E9 S214018040E002E27F000000000000000000000000E7 S214018050E002D27F00000000000000000000000E7 S214018060E002C07F000000000000000000000000E9 S2140180701F00E002B07F00000000000000000000CA S214018080E002A07F00000000000000000000000E9 S214018090E002907F000000000000000000000000E9 S2140180A0E002807F000000000000000000000000E9