引言
在工業控制、電機驅動乃至物聯網邊緣節點中,固件在線升級(OTA)已成為產品生命周期管理的標配。然而傳統OTA往往伴隨停機、風險與低效。瑞薩電子MCU中的Dual?Bank閃存架構為工程師帶來了幾乎“零感知”的升級體驗。本文以RX26T為例,拆解無感OTA的實現思路、代碼框架與實測情況,幫助開發者在自家項目中快速落地。
一、MCU傳統Flash架構與OTA挑戰
1.1.單Bank Flash架構
大部分傳統MCU使用的是單一Bank Flash設計:
應用程序存放在一片連續的Code Flash區域內
CPU取指(Fetch)和Flash擦寫/編程使用同一個物理通道
這就導致了一個先天矛盾:
Flash進入擦除/寫入模式時,不能讀取指令,這會CPU無法正常執行代碼,更不要說響應中斷請求
傳統的解決方案:
把代碼拷貝到RAM區域執行,包括擦寫Flash的代碼以及需要在Flash處于擦除和編程期間正常執行的其他代碼,如下圖所示:
1.2.OTA中的具體問題
在OTA場景下,這種單Bank架構會帶來一系列挑戰:
問題
影響
需要停機升級
業務中斷(比如停止電機運行),系統不可用或者性能受限(大部分中斷需要間歇關閉)
升級過程遇到意外斷電風險
一旦擦寫過程中斷電,MCU固件受損,有可能會變磚
缺乏回退機制
新固件有BUG,
無法快速恢復舊版本,
只能重刷
這種架構下,即使想做OTA,也必須設計復雜的 Bootloader流程、校驗機制,還要小心翼翼控制電源和升級時機,總體開發成本高、可靠性低。
二、瑞薩的無感OTA解決方案
2.1.為什么需要Dual-Bank?
如果能讓MCU有兩個獨立的程序區,一個邊跑應用,一個邊刷固件,中間互不干擾,升級自然就可以做到:
不中斷現有業務
把新固件寫好后,一鍵切換啟動區
即使升級失敗,也能自動回到老固件
這正是Dual-Bank閃存架構帶來的革命性變化。
2.2.Dual-Bank方案簡介
瑞薩電子在RX系列、RL78系列、RA系列等MCU 中,均提供了支持Dual-Bank架構設計的型號,可適配工業、汽車、物聯網等多種應用場景。
在本篇中,我們以RX26T為例進行詳細說明:
RX26T內 512 KB Code Flash被物理劃分為 Bank 0/1,各256 KB
Bank 0正常運行應用,Bank 1在后臺擦除/寫入新固件
升級完成后,通過切換Bank方式修改啟動設置,軟復位切換到新固件
如升級中斷或失敗,可以靈活切換回退到原有 Bank啟動,保障設備持續運行
這一機制讓MCU升級過程真正做到"無感知",極大提升了系統可維護性和用戶體驗。
三、RX26T無感OTA實驗環境搭建
3.1.硬件環境
MCK-RX26T開發套件
邏輯分析儀抓取關鍵測試波形
3.2.軟件環境
IDE:E2Studio2023-07(23.7.0)
編譯器:CC-RX V3.06
BSP以及相關外設驅動包:
3.3.Flash驅動配置
為了正常使用Dual-Bank功能,需要在Flash組件中使用以下配置,使用BGO模式,并且讓自編程庫運行在Code Flash中,無需拷貝到RAM中運行。
3.4.Flash操作關鍵代碼說明
Dual-Bank架構可以支持Flash的操作庫在后臺運行,可以定義一個回調函數注冊,這樣當Flash完成擦除和寫入命令時,就直接進入后臺操作,不會阻塞主循環和中斷。
擦除時--->只需發起一次整體擦除,后臺等待標志位完成
寫入時--->每接收一塊數據,發起一次寫入,后臺等待標志完成,循環直至所有數據寫入完畢
主要代碼示例如下:
A、Flash回調函數
左右滑動查看完整內容
voidu_cb_function(void*event) { flash_int_cb_args_t *ready_event =event; switch(ready_event->event) { caseFLASH_INT_EVENT_ERASE_COMPLETE: ERASE_COMPLETE_f =1; caseFLASH_INT_EVENT_WRITE_COMPLETE: WRITE_COMPLETE_f =1; caseFLASH_INT_EVENT_TOGGLE_BANK: break; default: break; } }
B、Flash初始化
左右滑動查看完整內容
e_fwup_err_tmy_flash_open_function(void) { if(FLASH_SUCCESS !=R_FLASH_Open()) { return(FWUP_ERR_FLASH); } #if(FLASH_BGO_MODE == 1) flash_interrupt_config_tcb_func_info; cb_func_info.pcallback = u_cb_function; cb_func_info.int_priority =1; if(FLASH_SUCCESS !=R_FLASH_Control(FLASH_CMD_SET_BGO_CALLBACK,(void*)&cb_func_info)) { return(FWUP_ERR_FLASH); } #endif/* (FLASH_BGO_MODE == 1) */ return(FWUP_SUCCESS); } }
C、Flash擦除操作
左右滑動查看完整內容
staticvoidfwup_erase_step(void) { if(!g_erase_started) { ERASE_COMPLETE_f =0; R_FLASH_Erase(FLASH_CF_BLOCK_22,22); g_erase_started =true; } else { if(!g_erase_done) { if(ERASE_COMPLETE_f ==1) { ERASE_COMPLETE_f =0; g_erase_done =true; g_write_addr =BANK_LO_ADDR; g_write_offset =0; g_total_writes_completed =0; g_fwup_state =FWUP_STATE_WRITE; } } } }
D、Flash寫入操作
左右滑動查看完整內容
staticvoidfwup_write_step(void) { if(g_write_offset >= TOTAL_DATA_SIZE) { g_fwup_state = FWUP_STATE_DONE; return; } if(!g_write_in_progress && FWUP_UART_RTS) { uint8_t*buf =malloc(g_write_chunk_size); if(!buf)return; uint32_tchunk = (s_flash_buf.cnt >= g_write_chunk_size) ? g_write_chunk_size : s_flash_buf.cnt; memcpy(buf, s_flash_buf.buf, chunk); if(chunk < g_write_chunk_size)?memset(&buf[chunk],?0xFF, g_write_chunk_size - chunk); ? ? ? ? WRITE_COMPLETE_f =?0; ? ? ? ??R_FLASH_Write((uint32_t)buf, g_write_addr, g_write_chunk_size); ? ? ? ??free(buf); ? ? ? ? g_write_in_progress =?true; ? ? } ? ??elseif?(g_write_in_progress && WRITE_COMPLETE_f) ? ? { ? ? ? ? WRITE_COMPLETE_f =?0; ? ? ? ? g_write_in_progress =?false; ? ? ? ? g_total_writes_completed++; ? ? ? ? g_write_addr += g_write_chunk_size; ? ? ? ? g_write_offset += g_write_chunk_size; ? ? ? ??if?(s_flash_buf.cnt > g_write_chunk_size) { s_flash_buf.cnt -= g_write_chunk_size; memmove(s_flash_buf.buf, &s_flash_buf.buf[g_write_chunk_size], s_flash_buf.cnt); } elses_flash_buf.cnt =0; FWUP_UART_RTS =false; } }
3.5.無感OTA流程示意圖
四、RX26T無感OTA實驗測試結果
4.1.邏輯分析儀測試波形
加入測試代碼
在主循環100us定時翻轉IO口
中斷10us定時翻轉IO口
在擦除函數進入前后加入翻轉IO口
在寫入函數進入前后加入翻轉IO口
通過波形可以看到整體對中斷基本無影響,主循環在寫操作中間偶爾會有短時間的延時,實測25us左右,為Flash庫進入BGO操作之前的準備時間。
4.2.電機驅動實測
為了進一步驗證實際性能,把電機驅動也加入到代碼中來,設計2個軟件版本,其中:
版本1.1.1上電后,啟動電機,并控制轉速到2000RPM,打印信息
版本6.0.0上電后,啟動電機,并控制轉速到500RPM,打印信息
首先燒錄版本1.1.1,上電后可以看到電機正常運行,打印信息如下:
這時通過PC端的Tere Term發送版本6.0.0版本的BIN文件,并進入OTA流程,可以觀察到電機保持運行,同時持續接收新的固件并寫入到Bank1的對應地址,當寫入完成后,切換bank并進行復位,復位過程電機會有幾秒鐘的時間停下來,當新的軟件版本啟動后,電機會重新啟動加速并控制轉速在500RPM運行
五、實驗總結
RX26T的Dualbank+BGO模式為固件升級提供了一個完美的解決方案。這種方式的優點是:
升級過程中不影響當前程序運行
防止升級失敗導致系統”變磚”
升級過程安全可靠,支持斷電保護
實現真正的”無感”升級體驗
這種升級方案特別適合對實時性要求較高的工業控制和電機驅動應用,能夠在不影響正常工作的情況下完成固件更新,是工業設備遠程維護的理想選擇。
六、注意事項
1.BGO模式使用要點:
初始化時必須正確配置回調函數
每次操作前檢查Flash狀態
合理使用對齊的緩沖區
2.狀態機設計原則:
狀態轉換邏輯要清晰
單個狀態處理時間要短
使用標志位跟蹤進度
3.調試建議:
使用GPIO觀察關鍵時序
保留關鍵日志輸出
4.拓展說明
切換Bank進行軟件復位的時間非常短,在1秒以內即可運行到主函數
如果有極限的要求,即核心業務在OTA過程中要求不受任何影響,也有解決方案,就是在切換Bank之前,把核心業務處理函數以及相關的中斷都拷貝到RAM中運行,這樣就可以不受軟件復位的影響,無縫切換到新的固件版本
-
mcu
+關注
關注
146文章
17790瀏覽量
359376 -
FlaSh
+關注
關注
10文章
1659瀏覽量
150875 -
OTA
+關注
關注
7文章
601瀏覽量
36111 -
瑞薩電子
+關注
關注
37文章
2909瀏覽量
73083 -
工業控制
+關注
關注
38文章
1520瀏覽量
86652
原文標題:瑞薩電子MCU無感OTA升級功能介紹
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
瑞薩針對顯示應用的MCU和方案介紹

評論