0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【GD32H757Z海棠派開發(fā)板使用手冊】第四講 FMC-片內(nèi)Flash擦寫讀實(shí)驗(yàn)

聚沃科技 ? 2024-04-19 10:09 ? 次閱讀
wKgZomYgeJOAUiXJAB6mQrDJGEg027.png

4.1實(shí)驗(yàn)內(nèi)容

通過本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容:

4.2實(shí)驗(yàn)原理

4.2.1FMC控制器原理

FMC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32H7XX系列MCU中,具有高達(dá)3840KB字節(jié)的片上閃存可用于存儲指令或數(shù)據(jù)。FMC也提供了扇區(qū)擦除和整片擦除操作以及編程操作。

Flash讀取可以支持64字節(jié)雙字、32位整字、16位半字或字節(jié)讀操作;Flash編程可以支持64位雙字、32位整字編程;Flash擦除支持扇區(qū)擦除和整片擦除操作。

Flash具有僅執(zhí)行的專用代碼讀保護(hù)區(qū)域,便于芯片代碼保護(hù)以及二次合作開發(fā)。

FMC框圖如下所示,F(xiàn)MC支持用以訪問代碼或數(shù)據(jù)的64位AXI接口以及用以訪問寄存器的32位AHB從機(jī)接口。

wKgZomYh0M2ASXBaAABWBI1KHf8769.png

閃存包括3840KB字節(jié)主閃存,分為960個(gè)扇區(qū),扇區(qū)大小為4KB,和64KB用于引導(dǎo)加載程序的信息塊。主存儲閃存的每個(gè)扇區(qū)都可以單獨(dú)擦除 。

wKgZomYh0NmADs3jAACHzfMnsTQ573.png

有關(guān)Flash擦寫操作均需要先解鎖Flash,然后進(jìn)行擦寫操作,擦寫完成后再進(jìn)行鎖Flash,注意Flash特性只能由1寫0,也就是Flash需要先擦除才能寫入新的數(shù)據(jù),如果確保寫入地址的數(shù)據(jù)為全0xFF,也可以直接寫入。讀取Flash數(shù)據(jù)可以采取直接尋址的方式進(jìn)行讀取。

下面為各位讀者介紹Flash擦寫讀的相關(guān)操作。

4.2.2Flash擦除操作原理

Flash擦除可分為塊擦除以及整片擦除,如下圖所示,扇區(qū)擦除時(shí)間典型值為100ms,整片擦除也根據(jù)容量大小會有差異。

wKgaomYh0PGAK-fYAAEQucyDXmc569.png

有關(guān)Flash的相關(guān)操作均在gd32h7xx_fmc.c中實(shí)現(xiàn),下面介紹下擦除實(shí)現(xiàn)的函數(shù),如下表所示。

wKgZomYh0P6AaAOHAABYIxnVQHU429.png

4.2.3Flash寫入編程操作原理

GD32H7系列MCU可支持64位雙字/32位整字編程,如下圖所示,F(xiàn)lash 32位整字編程時(shí)間典型值為1us。

wKgaomYh0PGAK-fYAAEQucyDXmc569.png

有關(guān)Flash編程實(shí)現(xiàn)函數(shù)如下表所示。

wKgaomYh0SuAdNZjAACGC3qGvsg217.png

4.2.4Flash讀取操作原理

Flash讀取可以采用直接尋址的方式進(jìn)行操作,具體可參考以下示例代碼。

C
uint32_t read_data;
read_data = *(uint32_t *)0x08001000;

注意:有關(guān)Flash有以下參數(shù)讀者需要了解,GD32H7xx系列MCU的內(nèi)部Flash具有至少10萬次的擦寫次數(shù)以及20年的數(shù)據(jù)保持能力,但需注意,隨著擦寫次數(shù)的增加數(shù)據(jù)保持時(shí)間會下降。

4.3硬件設(shè)計(jì)

本例程不涉及硬件電路。

4.4代碼解析

4.4.1Flash寫入多字節(jié)函數(shù)

Flash寫入多字節(jié)操作函數(shù)如下所示,寫入的過程主要分為擦寫兩個(gè)操作,由于Flash特有特性,需要先擦除才可以寫入,因而需要確保寫入地址的初識數(shù)據(jù)為0xFF。本函數(shù)可以實(shí)現(xiàn)根據(jù)地址識別對應(yīng)頁并進(jìn)行擦除的功能,使用上非常方便,使用者只需要關(guān)心擦寫的起始地址以及數(shù)據(jù)和長度即可,擦寫的位置函數(shù)中會進(jìn)行實(shí)現(xiàn)。

C
void fmc_write_data(uint32_t write_start_addr, uint8_t *data_buf, uint16_t data_lengh)
{
uint32_t write_addr,erase_addr;
uint16_t data_write_num=0,data_lengh_word=data_lengh/4;
int32_t data_earse_num;
uint32_t* pbuff=(uint32_t*)data_buf;

if(data_lengh%4 !=0)
{
data_lengh_word++;
}


fmc_unlock(); /* 解鎖FMC */
/* 清除錯(cuò)誤標(biāo)志 */
fmc_flag_clear(FMC_FLAG_WPERR);
fmc_flag_clear(FMC_FLAG_PGSERR);
fmc_flag_clear(FMC_FLAG_RPERR);
fmc_flag_clear(FMC_FLAG_RSERR);
fmc_flag_clear(FMC_FLAG_ECCCOR);
fmc_flag_clear(FMC_FLAG_ECCDET);
fmc_flag_clear(FMC_FLAG_OBMERR);

erase_addr = write_start_addr;
data_earse_num = data_lengh;

if(write_start_addr%FLAG_PAGE_SIZE == 0) /* 若寫入地址為頁起始地址 */
{
for(;data_earse_num>0;)
{
fmc_sector_erase(erase_addr);
/* 清除錯(cuò)誤標(biāo)志 */
fmc_flag_clear(FMC_FLAG_WPERR);
fmc_flag_clear(FMC_FLAG_PGSERR);
fmc_flag_clear(FMC_FLAG_RPERR);
fmc_flag_clear(FMC_FLAG_RSERR);
fmc_flag_clear(FMC_FLAG_ECCCOR);
fmc_flag_clear(FMC_FLAG_ECCDET);
fmc_flag_clear(FMC_FLAG_OBMERR);
erase_addr+=FLAG_PAGE_SIZE;
data_earse_num-=FLAG_PAGE_SIZE;
}
}else{
/*若寫入地址不是頁起始地址*/
for(;(data_earse_num>0||erase_addr>=write_start_addr+data_lengh);)
{
fmc_sector_erase(erase_addr);
/* 清除錯(cuò)誤標(biāo)志 */
fmc_flag_clear(FMC_FLAG_WPERR);
fmc_flag_clear(FMC_FLAG_PGSERR);
fmc_flag_clear(FMC_FLAG_RPERR);
fmc_flag_clear(FMC_FLAG_RSERR);
fmc_flag_clear(FMC_FLAG_ECCCOR);
fmc_flag_clear(FMC_FLAG_ECCDET);
fmc_flag_clear(FMC_FLAG_OBMERR);
erase_addr+=FLAG_PAGE_SIZE;
data_earse_num-=FLAG_PAGE_SIZE;
}
}

/* 寫入數(shù)據(jù) */
write_addr = write_start_addr;

for(data_write_num = 0; data_write_num{
fmc_word_program(write_addr, pbuff[data_write_num]);
/* 清除錯(cuò)誤標(biāo)志 */
fmc_flag_clear(FMC_FLAG_WPERR);
fmc_flag_clear(FMC_FLAG_PGSERR);
fmc_flag_clear(FMC_FLAG_RPERR);
fmc_flag_clear(FMC_FLAG_RSERR);
fmc_flag_clear(FMC_FLAG_ECCCOR);
fmc_flag_clear(FMC_FLAG_ECCDET);
fmc_flag_clear(FMC_FLAG_OBMERR);

write_addr+=4;
}
fmc_lock();
}

4.4.2Flash讀取數(shù)據(jù)函數(shù)

Flash讀取數(shù)據(jù)函數(shù)如下所示,采用直接尋址的方式,讀取字節(jié)數(shù)據(jù)。

C
uint8_t fmc_read_data(uint32_t write_read_addr)
{
return *(uint8_t *)write_read_addr;
}

4.4.3主函數(shù)

主函數(shù)如下所示,通過該函數(shù)實(shí)現(xiàn)對flash起始地址為0x080A0000的前10個(gè)字節(jié)擦寫以及讀取的驗(yàn)證。

C
int main(void)
{
uint16_t read_num =0;
uint8_t i_num;
driver_init();
bsp_led_group_init();
bsp_uart_init(&BOARD_UART); /* 板載UART初始化 */
printf_log("Example of internal Flash read-write demo.\r\n");
printf_log("Write data to internal Flash.\r\n");
fmc_write_data(WRITE_START_ADDR,write_data,sizeof(write_data)); /* 向WRITE_START_ADDR地址寫入10個(gè)雙字節(jié)數(shù)據(jù) */
printf_log("Read data from internal Flash.\r\n");
for(read_num=0;read_num{
read_data[read_num] = fmc_read_data(WRITE_START_ADDR+read_num); /* 從WRITE_START_ADDR讀取10個(gè)雙字節(jié)數(shù)據(jù) */
}
printf_log("Verify the written and read data.\r\n");
for(i_num=0;i_num{
/* 校驗(yàn)數(shù)據(jù) */
if(read_data[i_num]!=write_data[i_num])
{
/* 校驗(yàn)數(shù)據(jù)出錯(cuò) */
printf_log("Error in verifying data.\r\n");
printf_log("Turn on LED1.\r\n");
bsp_led_on(&LED1);
while(1);
}else{
}
}
/* 校驗(yàn)數(shù)據(jù)成功 */
printf_log("Turn on LED1.\r\n");
bsp_led_on(&LED1);
printf_log("Verify that the data is correct and that the written and read data are consistent.\r\n");

while (1)
{
}
}

4.5實(shí)驗(yàn)結(jié)果

將本實(shí)驗(yàn)燒錄到海棠派實(shí)驗(yàn)板中,運(yùn)行后可以觀察到LED1常亮,表明擦寫以及讀取實(shí)驗(yàn)正常。

教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1635

    瀏覽量

    148023
  • FMC
    FMC
    +關(guān)注

    關(guān)注

    0

    文章

    93

    瀏覽量

    19687
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5050

    瀏覽量

    97468
  • GD32
    +關(guān)注

    關(guān)注

    7

    文章

    403

    瀏覽量

    24351
收藏 人收藏

    評論

    相關(guān)推薦

    GD32H757Z海棠開發(fā)板使用手冊】第十三講 SDIO-SD卡讀寫實(shí)驗(yàn)

    通過本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容: ?USB協(xié)議基本原理 ?GD32H7xx USBHS的使用 ?虛擬鍵盤的協(xié)議原理及使用
    的頭像 發(fā)表于 06-06 11:26 ?1918次閱讀
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第十三講 SDIO-SD卡讀寫<b class='flag-5'>實(shí)驗(yàn)</b>

    迅為iMX6ULL開發(fā)板使用手冊資料下載

    開發(fā)板使用手冊》第一部分 開發(fā)板入門第二部分 開發(fā)環(huán)境搭建第三部分 Linux系統(tǒng)編譯第四部分 QT
    發(fā)表于 12-02 14:13

    YL-51開發(fā)板使用手冊

    YL-51開發(fā)板使用手冊,YL-51開發(fā)板使用手冊YL-51開發(fā)板使用手冊YL-51
    發(fā)表于 05-10 16:31 ?21次下載

    51開發(fā)板使用手冊

    51開發(fā)板使用手冊,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 11-23 15:45 ?11次下載

    KC705開發(fā)板英文使用手冊

    KC705開發(fā)板英文使用手冊
    發(fā)表于 11-01 10:19 ?5次下載

    iTOP-3399開發(fā)板使用手冊大更新

    iTOP-3399開發(fā)板使用手冊大更新
    的頭像 發(fā)表于 12-10 15:46 ?1369次閱讀
    iTOP-3399<b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>大更新

    GD32H757Z海棠開發(fā)板使用手冊】第二 GPIO-按鍵查詢檢測實(shí)驗(yàn)

    2.1實(shí)驗(yàn)內(nèi)容通過本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容:GPIO輸入功能原理;按鍵查詢輸入檢測原理;2.2實(shí)驗(yàn)原理2.2.1GPIO輸入功能原理GD32H7XX系列MCUGPIO輸入配置結(jié)構(gòu)如下圖所
    的頭像 發(fā)表于 04-17 10:42 ?741次閱讀
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第二<b class='flag-5'>講</b> GPIO-按鍵查詢檢測<b class='flag-5'>實(shí)驗(yàn)</b>

    GD32H757Z海棠開發(fā)板使用手冊】第五 PMU-低功耗實(shí)驗(yàn)

    PMU即電源管理單元,其內(nèi)部結(jié)構(gòu)下圖所示,由該圖可知,GD32H7XX系列MCU具有三個(gè)電源域,包括VDD/VDDA電源域、0.9V電源域以及電池備份域,其中,VDD /VDDA域由電源直接供電
    的頭像 發(fā)表于 04-20 09:32 ?1033次閱讀
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第五<b class='flag-5'>講</b> PMU-低功耗<b class='flag-5'>實(shí)驗(yàn)</b>

    GD32F470紫藤開發(fā)板使用手冊第四講 FMC-內(nèi)Flash擦寫實(shí)驗(yàn)

    通過本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容: FMC控制器原理; FMC擦寫操作;
    的頭像 發(fā)表于 05-06 11:08 ?1286次閱讀
    【<b class='flag-5'>GD</b>32F470紫藤<b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】<b class='flag-5'>第四講</b>  <b class='flag-5'>FMC-</b><b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b><b class='flag-5'>Flash</b><b class='flag-5'>擦寫</b><b class='flag-5'>讀</b><b class='flag-5'>實(shí)驗(yàn)</b>

    GD32H757Z海棠開發(fā)板使用手冊】第八 ADC-規(guī)則組多通道采樣實(shí)驗(yàn)

    通過本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容: ADC的簡介 GD32FH757 ADC工作原理 DMA和DMAMUX的原理 規(guī)則組多通道循環(huán)采樣
    的頭像 發(fā)表于 05-14 09:39 ?634次閱讀
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第八<b class='flag-5'>講</b> ADC-規(guī)則組多通道采樣<b class='flag-5'>實(shí)驗(yàn)</b>

    GD32H757Z海棠開發(fā)板使用手冊】第九 USART-printf打印實(shí)驗(yàn)

    通過本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容: ?串口簡介 ?GD32H757串口工作原理 ?使用printf打印信息
    的頭像 發(fā)表于 05-15 11:39 ?727次閱讀
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第九<b class='flag-5'>講</b> USART-printf打印<b class='flag-5'>實(shí)驗(yàn)</b>

    GD32F303紅楓開發(fā)板使用手冊】第五 FMC-內(nèi)Flash擦寫實(shí)驗(yàn)

    MC即Flash控制器,其提供了Flash操作所需要的所有功能,在GD32F303系列MCU中,Flash前256K字節(jié)空間內(nèi),?CPU
    的頭像 發(fā)表于 06-02 10:05 ?787次閱讀
    【<b class='flag-5'>GD</b>32F303紅楓<b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第五<b class='flag-5'>講</b> <b class='flag-5'>FMC-</b><b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b><b class='flag-5'>Flash</b><b class='flag-5'>擦寫</b><b class='flag-5'>讀</b><b class='flag-5'>實(shí)驗(yàn)</b>

    GD32H757Z海棠開發(fā)板使用手冊】第十一講 SPI-SPI NOR FLASH讀寫實(shí)驗(yàn)

    通過本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容: ?SPI簡介 ?GD32H7 SPI簡介 ?SPI NOR FLASH——GD25Q128ESIGR簡介 ?使用GD3
    的頭像 發(fā)表于 06-04 11:42 ?1007次閱讀
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第十一講 SPI-SPI NOR <b class='flag-5'>FLASH</b>讀寫<b class='flag-5'>實(shí)驗(yàn)</b>

    GD32H757Z海棠開發(fā)板使用手冊】第十二 SDIO-SD卡讀寫實(shí)驗(yàn)

    SD卡是一種主要以Nand Flash作為存儲介質(zhì),具有體積小、數(shù)據(jù)傳輸速度快以及支持熱插拔的優(yōu)點(diǎn)。如今,已被廣泛應(yīng)用于數(shù)碼相機(jī)、便攜式移動設(shè)備以及手機(jī)等多種設(shè)備中。SD卡的驅(qū)動一般有SPI接口或SDIO接口,本例程介紹使用GD32F4xx的SDIO接口驅(qū)動SD卡的實(shí)現(xiàn)。
    的頭像 發(fā)表于 06-05 10:35 ?719次閱讀
    【<b class='flag-5'>GD32H757Z</b><b class='flag-5'>海棠</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第十二<b class='flag-5'>講</b> SDIO-SD卡讀寫<b class='flag-5'>實(shí)驗(yàn)</b>

    GD32F303紅楓開發(fā)板使用手冊】第二十 SPI-SPI NAND FLASH讀寫實(shí)驗(yàn)

    通過本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容: ?SPI通信協(xié)議,參考19.2.1東方紅開發(fā)板使用手冊 ?GD32F303 SPI操作方式,參考19.2.2東方紅
    的頭像 發(fā)表于 06-20 09:50 ?904次閱讀
    【<b class='flag-5'>GD</b>32F303紅楓<b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第二十<b class='flag-5'>講</b> SPI-SPI NAND <b class='flag-5'>FLASH</b>讀寫<b class='flag-5'>實(shí)驗(yàn)</b>