精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

瑞薩e2studio----Code Flash/Data Flash讀寫

RA生態工作室 ? 2021-11-26 17:17 ? 次閱讀
pYYBAGGA3i6Af0z4AABdWrtWoBM374.png

1.概述

本篇文章主要介紹如何使用e2studio對瑞薩進行Flash配置,并且分別對Code Flash & Data Flash進行讀寫操作。

Flash有Code Flash(儲存程序代碼)以及Data Flash(儲存一般數據),其中Code Flash主要以NOR型為主,儲存系統程序代碼及小量數據;而Data Flash則是以NAND型為主,用于儲存大量數據。

2.硬件準備

首先需要準備一個開發板,這里我準備的是芯片型號 R7FA2L1AB2DFL 的開發板。

3.新建工程

4954818c-4c51-11ec-9483-dac502259ad0.png

4.工程模板

4996dda2-4c51-11ec-9483-dac502259ad0.png

5.保存工程路徑

49c3d00a-4c51-11ec-9483-dac502259ad0.png

6.芯片配置

本文中使用R7FA2L1AB2DFL來進行演示。

4a023700-4c51-11ec-9483-dac502259ad0.png

7

7.工程模板選擇

4a151992-4c51-11ec-9483-dac502259ad0.png

8.Flash配置

點擊 Stacks -> New Stack -> Driver -> Storage -> Flash Driver on r_flash_lp。

4a4bd040-4c51-11ec-9483-dac502259ad0.png

9.Flash屬性配置

4a7f1af4-4c51-11ec-9483-dac502259ad0.png

10.設置E2STUDIO堆棧

4ac101bc-4c51-11ec-9483-dac502259ad0.png

11.e2studio的重定向printf設置

4ad24f8a-4c51-11ec-9483-dac502259ad0.png

C++ 構建->設置->GNU ARM Cross C Linker->Miscellaneous去掉Other linker flags中的 “--specs=rdimon.specs”

4afac30c-4c51-11ec-9483-dac502259ad0.png

12.printf輸出重定向到串口

打印最常用的方法是printf,所以要解決的問題是將printf的輸出重定向到串口,然后通過串口將數據發送出去。

注意一定要加上頭文件#include


#ifdef __GNUC__                                 //串口重定向
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
        err = R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);
        if(FSP_SUCCESS != err) __BKPT();
        while(uart_send_complete_flag == false){}
        uart_send_complete_flag = false;
        return ch;
}

int _write(int fd,char *pBuffer,int size)
{
    for(int i=0;i;i++)>

13.R_FLASH_LP_Open()函數原型

4b09c154-4c51-11ec-9483-dac502259ad0.png

故可以用R_FLASH_LP_Open ()函數進行初始化開啟初始化Flash。


 /* Open the flash lp instance. */
     fsp_err_t err = R_FLASH_LP_Open(&g_flash0_ctrl, &g_flash0_cfg);
    assert(FSP_SUCCESS == err);

14.R_FLASH_LP_Erase()函數原型

4b58d244-4c51-11ec-9483-dac502259ad0.png

故可以用R_FLASH_LP_Erase()函數進行擦除指定的代碼或數據閃存塊。


 /* Erase 1 block of code flash starting at block 62. */
    err = R_FLASH_LP_Erase(&g_flash0_ctrl, FLASH_CF_BLOCK_62, 1);
    assert(FSP_SUCCESS == err);

15.R_FLASH_LP_StatusGet()函數原型

4b6c0dfa-4c51-11ec-9483-dac502259ad0.png

故可以用R_FLASH_LP_StatusGet()函數對Code Flash或者Data Flash進行寫數據。

/* Write 32 bytes to the first block of data flash. */
    err = R_FLASH_LP_Write(&g_flash0_ctrl, (uint32_t) g_src_uint8, FLASH_CF_BLOCK_62, g_src_uint8_length);
    assert(FSP_SUCCESS == err);

16.R_FLASH_L

4b6c0dfa-4c51-11ec-9483-dac502259ad0.png

故可以用R_FLASH_LP_Write()函數對Code Flash或者Data Flash進行寫數據。

 /* Write 32 bytes to the first block of data flash. */
    err = R_FLASH_LP_Write(&g_flash0_ctrl, (uint32_t) g_src_uint8, FLASH_CF_BLOCK_62, g_src_uint8_length);
    assert(FSP_SUCCESS == err);

17.R_FLASH_LP_StatusGet()函數原型

4ba9e2d8-4c51-11ec-9483-dac502259ad0.png

對Data Flash進行寫操作時候,數據可以在后臺運行,故可以用R_FLASH_LP_StatusGet()函數查詢是否執行完畢。

/* Wait until the current flash operation completes. */
    do
    {
        err = R_FLASH_LP_StatusGet(&g_flash0_ctrl, &status);
    } while ((FSP_SUCCESS == err) && (FLASH_STATUS_BUSY == status));

18.Code Flash

對Code Flash進行讀寫操作時候,特別要注意寫的地址,因為如果寫的不對,會覆蓋到代碼區,造成運行錯誤,同時對于擦除,是一塊的數據都會直接擦除掉。

在RA2L1中,Code flash有2種規格,分別是128KB和256KB,每塊大小為2KB。

4bea6a2e-4c51-11ec-9483-dac502259ad0.png

為了兼容其他的型號,向Block62種寫入數據并且讀取出來,地址范圍是0x0001F000 - 0x0001F800。

使用R_FLASH_LP_Write()寫入的時候,寫入的是字節為單位,故num_bytes為g_src_uint8_length*1;


#define FLASH_CF_BLOCK_62               0x0001F000U /*   2 KB: 0x0001F000 - 0x0001F800 */
volatile uint8_t g_src_uint8[4]={0x1a,0x24,0x46,0x6a};
volatile uint8_t  g_src_uint8_length=4;
 /* Write 32 bytes to the first block of data flash. */
    err = R_FLASH_LP_Write(&g_flash0_ctrl, (uint32_t) g_src_uint8, FLASH_CF_BLOCK_62, g_src_uint8_length);
    assert(FSP_SUCCESS == err);
    assert(0 == memcmp(g_src_uint8, (uint8_t *) FLASH_CF_BLOCK_62, g_src_uint8_length));

19.Data Flash

對Data Flash進行讀寫操作時候,特別要注意要等待Data Flash寫完才能進行后續讀寫操作。

在RA2L1中, Data flash都是8KB的,每塊大小為1KB 。

4c1b4c8e-4c51-11ec-9483-dac502259ad0.png

向Block0種寫入數據并且讀取出來,地址范圍是0x40100000 - 0x401003FF。

使用R_FLASH_LP_Write()寫入的時候,寫入的是字節為單位,故num_bytes為g_src_uint8_length*1;

#define FLASH_DF_BLOCK_0               0x40100000U  /*   1 KB: 0x40100000 - 0x401003FF */
volatile uint8_t g_src_uint8[4]={0x1a,0x24,0x46,0x6a};
volatile uint8_t  g_src_uint8_length=4;
flash_status_t status;
/* Write 32 bytes to the first block of data flash. */
err = R_FLASH_LP_Write(&g_flash0_ctrl, (uint32_t) g_src_uint8, FLASH_DF_BLOCK_0, g_src_uint8_length);
assert(FSP_SUCCESS == err);
/* Wait until the current flash operation completes. */
do
{
err = R_FLASH_LP_StatusGet(&g_flash0_ctrl, &status);
} while ((FSP_SUCCESS == err) && (FLASH_STATUS_BUSY == status));

20.演示效果

向Data Flash地址0x40100000寫入{0x1a,0x24,0x46,0x6a}和{0xaabbccdd,0x11111111,0x22222222,0x33333333,0x44444444}

向Code Flash地址0x0001F000寫入{0x1a,0x24,0x46,0x6a}和{0xaabbccdd,0x11111111,0x22222222,0x33333333,0x44444444}

通過串口打印出的結果如下所示。

4c659abe-4c51-11ec-9483-dac502259ad0.png

內存地址查詢結果如下所示。

4ca84a8a-4c51-11ec-9483-dac502259ad0.png4cde8eba-4c51-11ec-9483-dac502259ad0.png

21.完整代碼

#include "hal_data.h"
#include 
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER

fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
    if(p_args->event == UART_EVENT_TX_COMPLETE)
    {
        uart_send_complete_flag = true;
    }
}
#ifdef __GNUC__                                 //串口重定向
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
        err = R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);
        if(FSP_SUCCESS != err) __BKPT();
        while(uart_send_complete_flag == false){}
        uart_send_complete_flag = false;
        return ch;
}
int _write(int fd,char *pBuffer,int size)
{
    for(int i=0;ievent;
}

#define FLASH_DF_BLOCK_0               0x40100000U  /*   1 KB: 0x40100000 - 0x401003FF */
#define FLASH_CF_BLOCK_62               0x0001F000U /*   2 KB: 0x0001F000 - 0x0001F800 */
/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)
{
    /* TODO: add your own code here */
    err = R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);
    assert(FSP_SUCCESS == err);
    volatile uint8_t  g_src_uint8_length=4;
    volatile uint8_t g_src_uint8[4]={0x1a,0x24,0x46,0x6a};
    volatile uint8_t  g_src_uint32_length=5;
    volatile uint32_t g_src_uint32[5]={
    0xaabbccdd,0x11111111,0x22222222,0x33333333,0x44444444
    };
    /********************code flash*******************************/
    flash_result_t blank_check_result;
    /* Open the flash lp instance. */
     fsp_err_t err = R_FLASH_LP_Open(&g_flash0_ctrl, &g_flash0_cfg);
    assert(FSP_SUCCESS == err);
     /* Disable interrupts to prevent vector table access while code flash is in P/E mode. */
    __disable_irq();
    /* Erase 1 block of code flash starting at block 62. */
    err = R_FLASH_LP_Erase(&g_flash0_ctrl, FLASH_CF_BLOCK_62, 1);
    assert(FSP_SUCCESS == err);
    /* Write 32 bytes to the first block of data flash. */
    err = R_FLASH_LP_Write(&g_flash0_ctrl, (uint32_t) g_src_uint8, FLASH_CF_BLOCK_62, g_src_uint8_length);
    assert(FSP_SUCCESS == err);
    assert(0 == memcmp(g_src_uint8, (uint8_t *) FLASH_CF_BLOCK_62, g_src_uint8_length));
    err = R_FLASH_LP_Write(&g_flash0_ctrl, (uint32_t) g_src_uint32, FLASH_CF_BLOCK_62+g_src_uint8_length*1, g_src_uint32_length*4);
    assert(FSP_SUCCESS == err);
    assert(0 == memcmp(g_src_uint32, (uint8_t *) FLASH_CF_BLOCK_62+g_src_uint8_length*1, g_src_uint32_length*4));
    /* Enable interrupts after code flash operations are complete. */
    __enable_irq();
    printf("\n/********************code flash*******************************/\n");
    PrintFlashTest(6,FLASH_CF_BLOCK_62);
    /********************data flash*******************************/
    interrupt_called = false;
    /* Erase 1 block of data flash starting at block 0. */
    err = R_FLASH_LP_Erase(&g_flash0_ctrl, FLASH_DF_BLOCK_0, 1);
    assert(FSP_SUCCESS == err);
    while (!interrupt_called)
    {
    ;
    }
    assert(FLASH_EVENT_ERASE_COMPLETE == flash_event);
    interrupt_called = false;
    flash_status_t status;
    /* Write 32 bytes to the first block of data flash. */
    err = R_FLASH_LP_Write(&g_flash0_ctrl, (uint32_t) g_src_uint8, FLASH_DF_BLOCK_0, g_src_uint8_length);
    assert(FSP_SUCCESS == err);

    /* Wait until the current flash operation completes. */
    do
    {
        err = R_FLASH_LP_StatusGet(&g_flash0_ctrl, &status);
    } while ((FSP_SUCCESS == err) && (FLASH_STATUS_BUSY == status));

    err = R_FLASH_LP_Write(&g_flash0_ctrl, (uint32_t) g_src_uint32, FLASH_DF_BLOCK_0+g_src_uint8_length*1, g_src_uint32_length*4);
    assert(FSP_SUCCESS == err);
    /* Wait until the current flash operation completes. */
    do
    {
        err = R_FLASH_LP_StatusGet(&g_flash0_ctrl, &status);
    } while ((FSP_SUCCESS == err) && (FLASH_STATUS_BUSY == status));

    /* If the interrupt wasn't called process the error. */
    assert(interrupt_called);
    /* If the event wasn't a write complete process the error. */
    assert(FLASH_EVENT_WRITE_COMPLETE == flash_event);
    /* Verify the data was written correctly. */
    assert(0 == memcmp(g_src_uint8, (uint8_t *) FLASH_DF_BLOCK_0, g_src_uint8_length));
    assert(0 == memcmp(g_src_uint32, (uint8_t *) FLASH_DF_BLOCK_0+g_src_uint8_length*1, g_src_uint32_length*4));
    printf("\n/********************data flash*******************************/\n");
    PrintFlashTest(6,FLASH_DF_BLOCK_0);
    while(1)
    {
        R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS); // NOLINT100->160
    }
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}
/*FLASH讀取打印程序*/
void PrintFlashTest(uint32_t L,uint32_t addr)
{
    uint32_t i=0;
    for(i=0;i;i++)>;i++)>

原創:By RA_Billy Xiao


原文標題:瑞薩e2studio----Code Flash&Data Flash讀寫

文章出處:【微信公眾號:RA生態工作室】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    16675

    瀏覽量

    347851
  • ARM
    ARM
    +關注

    關注

    134

    文章

    8967

    瀏覽量

    365067
  • 嵌入式
    +關注

    關注

    5046

    文章

    18821

    瀏覽量

    298653
  • 開發板
    +關注

    關注

    25

    文章

    4771

    瀏覽量

    96195
收藏 人收藏

    評論

    相關推薦

    STM32CUBEMX(10)--Flash讀寫

    概述 本例程主要講解如何對芯片自帶Flash進行讀寫,用芯片內部Flash可以對一些需要斷電保存的數據進行保存,無需加外部得存儲芯片,本例程采用的是STM32F030R8T6,64K大小的Fl
    發表于 09-10 15:36

    如何使用e2studio單片機進行GPIO輸出

    本篇文章主要介紹如何使用e2studio單片機進行GPIO輸出,并以LED顯示。
    的頭像 發表于 07-30 16:12 ?380次閱讀
    如何使用<b class='flag-5'>e2studio</b>對<b class='flag-5'>瑞</b><b class='flag-5'>薩</b>單片機進行GPIO輸出

    Flash示例程序01型SC版本(代碼Flash)應用說明

    電子發燒友網站提供《Flash示例程序01型SC版本(代碼Flash)應用說明.pdf》資料免費下載
    發表于 02-19 13:48 ?0次下載
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>Flash</b>示例程序01型SC版本(代碼<b class='flag-5'>Flash</b>)應用說明

    Flash示例程序01型SC版本應用說明

    電子發燒友網站提供《Flash示例程序01型SC版本應用說明.pdf》資料免費下載
    發表于 02-19 13:46 ?0次下載
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>Flash</b>示例程序01型SC版本應用說明

    Flash示例程序01版V1.20(SC版)發布說明

    電子發燒友網站提供《Flash示例程序01版V1.20(SC版)發布說明.pdf》資料免費下載
    發表于 02-19 10:40 ?0次下載
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>Flash</b>示例程序01版V1.20(SC版)發布說明

    Flash程序員V3 發布說明

    電子發燒友網站提供《Flash程序員V3 發布說明.pdf》資料免費下載
    發表于 02-19 09:37 ?1次下載
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>Flash</b>程序員V3 發布說明

    data flash存了兩個標定參數后,不能正確讀寫了是什么情況?

    data flash存了兩個標定參數,運行一直沒有問題, 今天突然就不能正確讀寫data flash,程序運行是正常的,這是什么情況
    發表于 01-15 06:05

    GD32F系列MCU片上FlashCode區和Data區使用解密

    GD32F系列MCU產品片上FlashCode區和Data區,以GD32F303系列為例,從GD32F303xx Datasheet中可以獲取code區和
    的頭像 發表于 01-09 10:07 ?2271次閱讀
    GD32F系列MCU片上<b class='flag-5'>Flash</b>中<b class='flag-5'>Code</b>區和<b class='flag-5'>Data</b>區使用解密

    e2studio(28)----SPI 驅動WS2812燈珠

    本文介紹了如何使用RA微控制器,結合E2STUDIO配置工具和SPI通訊接口,來驅動和控制WS2812 LED燈帶。這是一個集硬件連接、軟件配置和編程開發于一體的綜合性項目,目標是實現對LED燈帶顏色和亮度的精確控制。
    的頭像 發表于 12-01 16:48 ?1733次閱讀
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>e2studio</b>(28)----SPI 驅動WS2812燈珠

    基于RASC的keil電子時鐘制作(RA)(9)----保存數據到flash

    本篇文章主要介紹如何使用e2studio進行Flash配置,并且分別對Code Flash
    的頭像 發表于 12-01 15:12 ?558次閱讀
    基于RASC的keil電子時鐘制作(<b class='flag-5'>瑞</b><b class='flag-5'>薩</b>RA)(9)----保存數據到<b class='flag-5'>flash</b>

    基于RASC的keil電子時鐘制作(RA)(5)----驅動LED數碼管

    本篇文章主要介紹如何使用e2studioRA2E1開發板進行數碼管的驅動。
    的頭像 發表于 12-01 15:01 ?512次閱讀
    基于RASC的keil電子時鐘制作(<b class='flag-5'>瑞</b><b class='flag-5'>薩</b>RA)(5)----驅動LED數碼管

    電子時鐘制作(RA)(8)----保存數據到flash

    本篇文章主要介紹如何使用e2studio進行Flash配置,并且分別對Code Flash
    的頭像 發表于 12-01 14:18 ?485次閱讀
    電子時鐘制作(<b class='flag-5'>瑞</b><b class='flag-5'>薩</b>RA)(8)----保存數據到<b class='flag-5'>flash</b>

    電子時鐘制作(RA)(4)----驅動LED數碼管

    本篇文章主要介紹如何使用e2studioRA2E1開發板進行數碼管的驅動。
    的頭像 發表于 12-01 14:03 ?401次閱讀
    電子時鐘制作(<b class='flag-5'>瑞</b><b class='flag-5'>薩</b>RA)(4)----驅動LED數碼管

    電子時鐘制作(RA)(1)----使用串口進行打印

    本篇文章主要介紹如何使用e2studioRA2E1開發板進行串口打印配置。
    的頭像 發表于 12-01 13:56 ?543次閱讀
    電子時鐘制作(<b class='flag-5'>瑞</b><b class='flag-5'>薩</b>RA)(1)----使用串口進行打印

    基于RL78-FDL庫實現RL78G13 Data Flash讀寫操作

    基于RL78-FDL庫實現RL78G13 Data Flash讀寫操作
    的頭像 發表于 10-27 09:19 ?2008次閱讀
    基于RL78-FDL庫實現RL78G13 <b class='flag-5'>Data</b> <b class='flag-5'>Flash</b>的<b class='flag-5'>讀寫</b>操作