本次測評基于瑞薩RA6E2地奇星開發板,驗證其內部 Code Flash 與 Data Flash 的讀寫功能穩定性與可靠性,測試 Flash 擦除、寫入、讀取及數據驗證的全流程可行性,為后續嵌入式項目存儲方案提供參考依據。
摘自優秀創作者-jf_34532509
https://bbs.elecfans.com/jishu_2507323_1_1.html

瑞薩RA6E2-地奇星開發板
測評環境:e2 studio + FSP( Flexible Software Package ) + RA6E2地奇星開發板
1、測評概述
硬件與軟件環境


核心測評流程
- 初始化 Flash 控制器,配置 FSP 底層驅動;
- 對指定 Flash 塊執行擦除操作,驗證擦除后空白狀態;
- 向 Code Flash 與 Data Flash 寫入測試數據;
- 從 Flash 讀取數據,通過memcmp函數驗證讀寫一致性;
- 通過 OLED 顯示讀寫狀態及數據,直觀呈現測試結果。
二、測評原理與代碼實現
2.1 Flash 讀寫核心原理
瑞薩RA6E2的 Code Flash 與 Data Flash 均基于 NOR Flash 架構,遵循"先擦除,后寫入"的操作原則:
- 擦除:將指定 Flash 塊的所有字節置為0xFF(空白狀態);
- 寫入:僅能將0xFF位改寫為0,無法直接將0改寫為1;
- 驗證:讀取寫入后的數據與原始數據對比,一致則代表讀寫成功。
2.2 FSP庫配置
對于IIC引腳的相關配置在之前帖子中講過了,試用軟件IIC主要就是把SCL和SDA引腳配置成GPIO接口,模擬IIC數據的傳輸即可。本次主要介紹flash相關FSP庫的配置。
步驟如下:
通過上述配置就完成了flash的FSP庫的配置。
2.3 芯片內部flash Memory結構及地址
通過查閱用戶手冊,flash memory相關的模塊框圖如下:
通過上圖我們可以知道應用層通過FACI向閃存子系統發起操作請求,FCU解析FACI轉發的命令,結合外部信號生成時序控制邏輯,通過Flash sequencer完成操作的資源調度與流程編排。Flash sequencer根據FCU的控制指令對目標存儲介質進行擦除-編程操作。
code flash的存儲器地址映射如下圖:
值得注意的是,每個塊對應的內存容量不一樣,后續代碼編寫需要注意,本次使用Block 13塊進行操作,從0x0003_8000開始編寫。
data flash的存儲器地址映射如下:

本次代碼編寫從起始地址0x0800_0000開始編寫。
2.4 關鍵代碼實現
本次測評采用 FSP 標準 API 完成 Flash 操作,核心代碼邏輯如下:
本次所有有關flash的代碼都在hal_entry.c文件下編寫:
1. 對相關地址寄存器的地址進行宏定義
#defineFLASH_CF_BLOCK_21 0x00038000U#defineFLASH_DF_BLOCK_0 0x08000000U#defineFLASH_DATA_BLOCK_SIZE (1024*32)
2. 回調函數實現
volatilebool interrupt_called;volatileflash_event_t flash_event;voidflash_callback(flash_callback_args_t*p_args){ interrupt_called =true; flash_event = p_args->event;}
通過回調函數,Flash操作完成后,主動觸發中斷然后調用回調函數并置位標志位,主程序只需要等待標志位即可,從而降低CPU資源占用率。
3. 擦除flash
// 擦除Code Flash R_FLASH_HP_Erase(&g_flash0_ctrl,FLASH_CF_BLOCK_21,1);
4. 寫入Code Flash
// 寫入Code Flash R_FLASH_HP_Write(&g_flash0_ctrl, (uint32_t)test_data, FLASH_CF_BLOCK_21,256);
5. 讀取并驗證是否寫入成功
memcpy(read_data, (uint8_t*)FLASH_CF_BLOCK_21,4);if(memcmp(test_data, read_data,4) ==0){// OLED顯示"code flash寫入成功"OLED_ShowString(1,1,"code flash: OK");// 顯示讀取的實際數據for(uint8_ti=0; i<4; i++)?OLED_ShowHexNum(2,1+i*3, read_data[i],?2);}else{OLED_ShowString(2,1,"code flash: FAIL");assert(false);}
data flash相關代碼和code flash基本一致,因此不在展示。
整體相關實現代碼如下:
#include"hal_data.h"#include"oled.h"#include // 僅用于memcpy/memcmp#if(1 == BSP_MULTICORE_PROJECT) && BSP_TZ_SECURE_BUILDbsp_ipc_semaphore_handle_tg_core_start_semaphore = {.semaphore_num =0};#endif// Flash 塊地址定義#defineFLASH_CF_BLOCK_21 0x00038000U // Code Flash 21塊地址#defineFLASH_DF_BLOCK_0 0x08000000U // Data Flash 0塊地址#defineFLASH_DATA_BLOCK_SIZE (1024*32) // Code Flash 塊容量(32KB)// Flash 中斷回調標志與事件volatilebool interrupt_called;volatileflash_event_t flash_event;/*** [url=home.php?mod=space&uid=2666770]@Brief[/url] Flash 中斷回調函數* [url=home.php?mod=space&uid=1902110]@NOTE[/url] 用于感知Flash異步操作(擦除/寫入)的完成狀態*/voidflash_callback(flash_callback_args_t*p_args){ interrupt_called =true; // 置位操作完成標志 flash_event = p_args->event;// 記錄操作結果事件}/*** @brief 主入口函數:實現Code Flash/Data Flash讀寫驗證*/voidhal_entry(void){ fsp_err_terr; uint8_ttest_data[4] = {0x1a,0x24,0x46,0x6a}; // 測試數據(4字節) uint8_tread_data[4] = {0}; // Flash讀取數據緩存 // 初始化OLED(可視化驗證結果) OLED_Init(); OLED_Clear(); // ========== Code Flash 操作流程 ========== // 1. 打開Flash控制器 err =R_FLASH_HP_Open(&g_flash0_ctrl, &g_flash0_cfg); assert(FSP_SUCCESS == err); // 2. 關閉全局中斷,避免Flash操作被干擾 __disable_irq(); // 3. 擦除Code Flash 21塊(擦除是寫入的前提) R_FLASH_HP_Erase(&g_flash0_ctrl, FLASH_CF_BLOCK_21,1); // 4. 寫入測試數據到Code Flash(最小寫入單位256字節) R_FLASH_HP_Write(&g_flash0_ctrl, (uint32_t)test_data, FLASH_CF_BLOCK_21,256); // 5. 恢復全局中斷 __enable_irq(); // 6. 讀取+驗證Code Flash數據 memcpy(read_data, (uint8_t*)FLASH_CF_BLOCK_21,4); if(memcmp(test_data, read_data,4) ==0) { // OLED顯示Code Flash寫入成功 OLED_ShowString(1,1,"code flash: OK"); // 顯示讀取的實際數據(十六進制) for(uint8_ti=0; i<4; i++)?OLED_ShowHexNum(2,1+i*3, read_data[i],?2);? ? }? ? else? ? {? ? ? ? OLED_ShowString(2,1,"code flash: FAIL");? ? ? ? assert(false); ?// 驗證失敗觸發斷言,定位錯誤? ? }? ? // ========== Data Flash 操作流程 ==========? ? // 1. 重置中斷完成標志? ? interrupt_called =?false;? ? // 2. 擦除Data Flash 0塊 + 等待中斷回調確認完成? ? R_FLASH_HP_Erase(&g_flash0_ctrl, FLASH_DF_BLOCK_0,?1);? ? while(!interrupt_called);? ? // 3. 寫入測試數據到Data Flash(最小寫入單位4字節)? ? R_FLASH_HP_Write(&g_flash0_ctrl, (uint32_t)test_data, FLASH_DF_BLOCK_0,?4);? ? // 4. 等待寫入操作完成(輪詢狀態寄存器)? ? flash_status_t?status;? ? do{R_FLASH_HP_StatusGet(&g_flash0_ctrl, &status);}while(FLASH_STATUS_BUSY == status);? ? // 5. 讀取+驗證Data Flash數據? ? memcpy(read_data, (uint8_t?*)FLASH_DF_BLOCK_0,?4);? ? if(memcmp(test_data, read_data,?4) ==?0)? ? {? ? ? ? // OLED顯示Data Flash寫入成功? ? ? ? OLED_ShowString(3,1,"data flash: OK");? ? ? ? // 顯示讀取的實際數據(十六進制)? ? ? ? for(uint8_t?i=0; i<4; i++)?OLED_ShowHexNum(4,1+i*3, read_data[i],?2);? ? }? ? else? ? {? ? ? ? OLED_ShowString(4,1,"data flash: FAIL");? ? ? ? assert(false); ?// 驗證失敗觸發斷言,定位錯誤? ? }? ? // 多核相關代碼(保留以避免編譯錯誤,單核場景可忽略)#if?(0 == _RA_CORE) && (1 == BSP_MULTICORE_PROJECT) && !BSP_TZ_NONSECURE_BUILD#if?BSP_TZ_SECURE_BUILD? ? R_BSP_IpcSemaphoreTake(&g_core_start_semaphore);#endif? ? R_BSP_SecondaryCoreStart();#if?BSP_TZ_SECURE_BUILD? ? while(FSP_ERR_IN_USE ==?R_BSP_IpcSemaphoreTake(&g_core_start_semaphore)){}#endif#endif#if?(1 == _RA_CORE) && (1 == BSP_MULTICORE_PROJECT) && BSP_TZ_SECURE_BUILD? ? R_BSP_IpcSemaphoreGive(&g_core_start_semaphore);#endif#if?BSP_TZ_SECURE_BUILD? ? R_BSP_NonSecureEnter();#endif}// 安全相關空函數(保留以避免編譯錯誤)#if?BSP_TZ_SECURE_BUILDFSP_CPP_HEADERBSP_CMSE_NONSECURE_ENTRY?void?template_nonsecure_callable?();BSP_CMSE_NONSECURE_ENTRY?void?template_nonsecure_callable?(){}FSP_CPP_FOOTER#endif
三、測評結果與分析
3.1 功能驗證結果

3.2 常見問題與解決方案

四、測評總結與建議
4.1 測評總結
- 瑞薩RA6E2地奇星開發板的Code Flash與Data Flash讀寫功能穩定可靠,數據驗證一致性達 100%,完全滿足嵌入式項目的存儲需求。
- FSP 驅動封裝簡潔易用,通過標準化 API 即可完成 Flash 全流程操作,降低了開發門檻。
- Code Flash 適合存儲程序固件或大容量靜態數據,Data Flash 適合存儲小容量頻繁更新的參數(如設備配置信息)。
4.2 應用建議
- 存儲方案選型
- 大容量、低更新頻率數據 → Code Flash;
- 小容量、高更新頻率數據 → Data Flash;
- 關鍵數據建議采用雙備份存儲,提升可靠性。
- 開發優化建議
- 擦除和寫入操作耗時較長,建議在非中斷敏感時段執行;
- 頻繁寫入的場景可引入wear leveling(磨損均衡)算法,延長 Flash 使用壽命;
- 利用 Flash 保護功能,對關鍵數據塊進行寫保護,防止誤操作。

聲明:本文由電子發燒友社區發布,轉載請注明以上來源。如需平臺(包括:試用+專欄+企業號+學院+技術直播+共建社區)合作及入群交流,請咨詢18925255684(微信同號:elecfans123),謝謝!
更多熱點文章閱讀
基于ESP32的終極智能手表,全過程+全開源!
基于樹莓派制作一個番茄鐘機器人!
用ESP12E做一個3D打印的6輪搖臂火星探測車
基于ESP32的圓形顯示屏互動式圣誕雪球
基于Arduino控制的六足機器人

-
OLED
+關注
關注
121文章
6357瀏覽量
233616 -
FlaSh
+關注
關注
10文章
1747瀏覽量
155503 -
瑞薩
+關注
關注
37文章
22481瀏覽量
90845 -
開發板
+關注
關注
26文章
6289瀏覽量
118023
發布評論請先 登錄
【干貨分享】瑞薩RA6E2地奇星開發板Flash讀寫與OLED顯示實戰



評論