23.3.2.11
hal_entry入口函數
最后我們來編寫hal_entry入口函數,進行FLASH芯片讀寫校驗,代碼見下。
列表10:代碼清單hal_entry入口函數
/* 用戶頭文件包含 */#include"led/bsp_led.h"#include"debug_uart/bsp_debug_uart.h"#include"qspi_flash/bsp_qspi_flash.h"#define FLASH_WriteAddress 0x00000#define FLASH_ReadAddress FLASH_WriteAddress#define FLASH_SectorToErase FLASH_WriteAddress/* 發送緩沖區初始化 */uint8_t Tx_Buffer[] = "感謝您選用野火啟明瑞薩 RA 開發板";uint8_t Rx_Buffer[sizeof(Tx_Buffer)];/** 函數名:Buffercmp* 描述 :比較兩個緩沖區中的數據是否相等* 輸入 :pBuffer1 src 緩沖區指針* pBuffer2 dst 緩沖區指針* BufferLength 緩沖區長度* 輸出 :無* 返回 :0 pBuffer1 等于 pBuffer2* 1 pBuffer1 不等于 pBuffer2*/intBuffercmp(uint8_t *pBuffer1, uint8_t *pBuffer2, uint16_t BufferLength){while (BufferLength--){if (*pBuffer1 != *pBuffer2){return1;}pBuffer1++;pBuffer2++;}return0;}voidhal_entry(void){/* TODO: add your own code here */uint32_t FlashID = 0;uint32_t FlashDeviceID = 0;LED_Init(); // LED 初始化Debug_UART4_Init(); // SCI4 UART 調試串口初始化QSPI_Flash_Init(); // 串行 FLASH 初始化printf("這是一個串行 FLASH 的讀寫例程\r\n");printf("打開串口助手查看打印的信息\r\n\r\n");/* 獲取 SPI g_qspi0_flash ID */FlashID = QSPI_Flash_ReadID();FlashDeviceID = QSPI_Flash_ReadDeviceID();if ((FlashID == FLASH_ID_W25Q32JV) || (FlashID == FLASH_ID_AT25SF321B)){if(FlashID == FLASH_ID_W25Q32JV){printf("檢測到串行 FLASH:W25Q32 !\r\n");}else{printf("檢測到串行 FLASH:AT25SF32 !\r\n");}printf("FlashID is 0x%X, Manufacturer Device ID is 0x%X.\r\n",?→FlashID, FlashDeviceID);/* 擦除將要寫入的 SPI FLASH 扇區,FLASH 寫入前要先擦除 */// 這里擦除 4K,即一個扇區,擦除的最小單位是扇區QSPI_Flash_SectorErase(FLASH_SectorToErase);/* 將發送緩沖區的數據寫到 flash 中 */// 這里寫一頁,一頁的大小為 256 個字節QSPI_Flash_BufferWrite(Tx_Buffer, FLASH_WriteAddress, sizeof(Tx_→Buffer));printf("寫入的數據為:%s \r\n", Tx_Buffer);/* 將剛剛寫入的數據讀出來放到接收緩沖區中 */QSPI_Flash_BufferRead(Rx_Buffer, FLASH_ReadAddress, sizeof(Tx_→Buffer));printf("讀出的數據為:%s \r\n", Rx_Buffer);if (Buffercmp(Tx_Buffer, Rx_Buffer, sizeof(Tx_Buffer)) == 0){printf("\r\n32Mbit 串行 Flash 測試成功!\r\n");LED3_ON;}else{printf("\r\n32Mbit 串行 Flash 測試失敗!\r\n");LED1_ON;}printf("\r\n測試存儲浮點數和整數示例\r\n");/* 存儲小數和整數的數組,各 7 個 */longdouble double_buffer[7] = {0};int int_buffer[7] = {0};/* 生成要寫入的數據 */for (uint8_t k = 0; k < 7; k++){double_buffer[k] = k + 0.1;int_buffer[k] = k * 500 + 1 ;}printf("向芯片寫入數據:");/* 打印到串口 */printf("\r\n小數 tx = ");for (uint8_t k = 0; k < 7; k++){printf("%LF, ", double_buffer[k]);}printf("\r\n整數 tx = ");for (uint8_t k = 0; k < 7; k++){printf("%d, ", int_buffer[k]);}/* 前面已擦除整個扇區和寫入第 0 頁,現繼續寫入第 1 頁和第 2 頁 *//* 寫入小數數據到第一頁 */QSPI_Flash_BufferWrite((void *)double_buffer, SPI_FLASH_PageSize * 1,?→sizeof(double_buffer));/* 寫入整數數據到第二頁 */QSPI_Flash_BufferWrite((void *)int_buffer, SPI_FLASH_PageSize * 2,?→sizeof(int_buffer));/* 讀取小數數據 */QSPI_Flash_BufferRead((void *)double_buffer, SPI_FLASH_PageSize * 1,?→sizeof(double_buffer));/* 讀取整數數據 */QSPI_Flash_BufferRead((void *)int_buffer, SPI_FLASH_PageSize * 2,?→sizeof(int_buffer));printf("\r\n\r\n從芯片讀到數據:");printf("\r\n小數 rx = ");for (uint8_t k = 0; k < 7; k++){printf("%LF, ", double_buffer[k]);}printf("\r\n整數 rx = ");for (uint8_t k = 0; k < 7; k++){printf("%d, ", int_buffer[k]);}}else{printf("\tFLASH_ID 錯誤:0x%X", FlashID);LED1_ON;}while(1);#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();#endif}
23.3.3
下載驗證
用USB線連接開發板“USB TO UART”接口跟電腦,在電腦端打開串口調試助手,把編譯好的程序下載到開發板。在串口調試助手可看到FLASH測試的調試信息。


如您在使用瑞薩MCU/MPU產品中有任何問題,可識別下方二維碼或復制網址到瀏覽器中打開,進入瑞薩技術論壇尋找答案或獲取在線技術支持。
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
未完待續
推薦閱讀
瑞薩QSPI直接讀寫FLASH函數——瑞薩RA系列FSP庫開發實戰指南(81)
FLASH扇區擦除——瑞薩RA系列FSP庫開發實戰指南(82)

不定量數據寫入&從FLASH讀取數據——瑞薩RA系列FSP庫開發實戰指南(83)

