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

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

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

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

聚沃科技 ? 2024-06-02 10:05 ? 次閱讀
wKgaomZVdiiAfR9BAB3mDFhHnZc972.png

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

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

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

5.2.1FMC控制器原理

FMC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F303系列MCU中,F(xiàn)lash前256K字節(jié)空間內(nèi),CPU執(zhí)行指令零等待,具有相同主頻下最快的代碼執(zhí)行效率。FMC也提供了頁擦除,整片擦除,以及32位整字/16位半字/位編程等閃存操作。GD32F303系列MCU支持最大3M Flash空間,可以提供業(yè)內(nèi)最大Flash的相關(guān)產(chǎn)品

GD32F303系列MCU的Flash結(jié)構(gòu)如下圖所示。由該圖可知,GD32F303系列MCU可以支持最大3M的Flash空間,前256頁為2KB每頁,共512KB空間,后面的空間為4KB每頁,信息塊為存儲(chǔ)內(nèi)部出廠BOOTLOADER,中容量的GD32F303系列產(chǎn)品空間為2KB,大容量的GD32F303系列產(chǎn)品空間為6KB,互聯(lián)型的GD32F305/307系列產(chǎn)品空間為18KB,主要是由于不同的產(chǎn)品所支持的ISP燒錄接口不同,所需要的代碼空間也會(huì)有差別。可選字節(jié)塊存儲(chǔ)的是選項(xiàng)字節(jié),其空間大小為16個(gè)字節(jié),地址范圍為0x1FFFF800-0x1FFFF80F,本章主要講解FMC的操作,有關(guān)選項(xiàng)字節(jié)操作可以參考選項(xiàng)字節(jié)操作實(shí)驗(yàn)。

wKgaomZb0auADhBAAAE5vVykrCc089.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)操作。

5.2.2Flash擦除操作原理

Flash擦除可分為頁擦除以及整片擦除,如下圖所示,頁擦除時(shí)間典型值為48ms,256KB Flash的塊擦除時(shí)間典型值為2S。

wKgZomZb0c2ASswvAAEH590A580334.png

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

wKgaomZb0hOARtTCAABPassmiMA901.png
  • 注意:fmc_word_reprogram可以在不用擦除的情況下直接進(jìn)行位編程,但僅可實(shí)現(xiàn)將1編程為0,比如若調(diào)用以上fmc_word_reprogram(0x08001000,0xFE)語句,即實(shí)現(xiàn)將最低位編程為0,若0x08001000原始數(shù)據(jù)為0x81,則執(zhí)行完后改地址數(shù)據(jù)為0x80。

5.2.4Flash讀取操作原理

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

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

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

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

本例程不涉及硬件電路。

5.4代碼解析

5.4.1Flash寫入16bit雙字節(jié)函數(shù)

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

C void fmc_write_data_16b(uint32_t write_start_addr, uint16_t *data_buf, uint16_t data_lengh) { uint32_t write_addr,erase_addr; uint16_t data_write_num=0; int16_t data_earse_num; /* 解鎖FMC */ fmc_unlock(); /* 清除BANK0和BANK1的錯(cuò)誤標(biāo)志 */ fmc_flag_clear(FMC_FLAG_BANK0_PGERR|FMC_FLAG_BANK0_WPERR|FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK1_PGERR|FMC_FLAG_BANK1_WPERR|FMC_FLAG_BANK1_END); erase_addr = write_start_addr; data_earse_num = data_lengh; /* 若寫入起始地址加上總長*2小于0x08080000,說明需要擦寫的數(shù)據(jù)均在BANK0,頁大小為2K/頁 */ if((write_start_addr+data_lengh*2)<0x08080000) { /* 若寫入地址為頁起始地址 */ if(write_start_addr%2048 == 0) { for(;data_earse_num>0;) { fmc_page_erase(erase_addr); erase_addr+=2048; data_earse_num-=1024; } /*若寫入地址不是頁起始地址*/ }else{ for(;(data_earse_num>0||erase_addr>=write_start_addr+data_lengh*2);) { fmc_page_erase(erase_addr); erase_addr+=2048; data_earse_num-=1024; } } /* 若寫入地址加上寫入長度*2大于0x08080000,說明擦寫的數(shù)據(jù)可能跨BANK或者均在BANK1,頁大小有差別 */ }else{ /* 如果起始地址小于0x08080000,說明跨BANK */ if(write_start_addr<0x08080000) { /* 首先擦除BANK0部分所需頁 */ for(;erase_addr<0x08080000;) { fmc_page_erase(erase_addr); erase_addr+=2048; } /* 然后擦除BANK1部分所需頁 */ erase_addr = 0x08080000; for(;erase_addr<=write_start_addr+data_lengh*2;) { fmc_page_erase(erase_addr); erase_addr+=4096; } }else{ /*若寫入地址大于等于0x08080000,說明均在BANK1,頁大小為4K/頁*/ if(write_start_addr%4096 == 0) /* 若寫入地址為頁起始地址 */ { for(;data_earse_num>0;) { fmc_page_erase(erase_addr); erase_addr+=4096; data_earse_num-=2048; } }else{ /*若寫入地址不是頁起始地址*/ for(;(data_earse_num>0||erase_addr>=write_start_addr+data_lengh*2);) { fmc_page_erase(erase_addr); erase_addr+=4096; data_earse_num-=2048; } } } } /* 寫入數(shù)據(jù) */ write_addr = write_start_addr; for(data_write_num = 0; data_write_num

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

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

C uint16_t fmc_read_data_16b(uint32_t write_read_addr) { return *(uint16_t *)write_read_addr; }

5.4.3主函數(shù)

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

C int main(void) { uint16_t read_num =0; uint8_t i_num; bsp_led_group_init(); fmc_write_data_16b(WRITE_START_ADDR,write_data,10); for(read_num=0;read_num<10;read_num++) { read_data[read_num] = fmc_read_data_16b(WRITE_START_ADDR+read_num*2); } for(i_num=0;i_num<10;i_num++) { if(read_data[i_num]!=write_data[i_num]) { bsp_led_on(&LED0); }else{ bsp_led_on(&LED1); } } while (1) { } }

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

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

wKgZomZb0p6ADaUfAABe7izWiVg635.png

教程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ī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6022

    文章

    44375

    瀏覽量

    628280
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16662

    瀏覽量

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

    關(guān)注

    0

    文章

    84

    瀏覽量

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

    關(guān)注

    25

    文章

    4768

    瀏覽量

    96150
  • GD32F3
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    3819
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32CUBEMX開發(fā)GD32F303(6)----GPIO輸入函數(shù)說明

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中進(jìn)行開發(fā),同時(shí)通過GD32303C_START開發(fā)板
    的頭像 發(fā)表于 11-25 16:06 ?1411次閱讀
    STM32CUBEMX<b class='flag-5'>開發(fā)</b><b class='flag-5'>GD32F303</b>(6)----GPIO輸入函數(shù)說明

    STM32CUBEMX開發(fā)GD32F303(8)----USART收發(fā)配置

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中進(jìn)行開發(fā),同時(shí)通過GD32303C_START開發(fā)板
    的頭像 發(fā)表于 11-29 10:40 ?2904次閱讀
    STM32CUBEMX<b class='flag-5'>開發(fā)</b><b class='flag-5'>GD32F303</b>(8)----USART收發(fā)配置

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

    FMCFlash控制器,其提供了Flash操作所需要的所有功能,在GD32H7XX系列MCU中,具有高達(dá)3840KB字節(jié)的
    的頭像 發(fā)表于 04-19 10:09 ?991次閱讀
    【<b class='flag-5'>GD</b>32H757Z海棠<b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊(cè)</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>

    GD32F303】星空介紹

    一、開發(fā)板介紹星空GD開發(fā)板是由旗點(diǎn)科技推出的一款GD32開發(fā)板,板載
    發(fā)表于 09-11 17:55

    【星空GD32F303開發(fā)板試用體驗(yàn)】開發(fā)記錄匯總

    本帖最后由 申小林一號(hào) 于 2021-10-15 14:47 編輯 開貼日期:2021年10月11日該貼主要是用于記錄星空開發(fā)板使用記錄以及學(xué)習(xí)GD32F303芯片的一個(gè)過程,將所有的
    發(fā)表于 10-11 16:09

    【星空GD32F303開發(fā)板試用體驗(yàn)】開箱+環(huán)境搭建

    本帖最后由 lustao 于 2021-10-19 09:29 編輯 感謝 發(fā)燒友學(xué)院以及廣州旗點(diǎn)智能科技有限公司為我和孩子提供此產(chǎn)品星空GD32F303開發(fā)板。收到了星空
    發(fā)表于 10-18 14:15

    【星空GD32F303開發(fā)板試用體驗(yàn)】開箱+環(huán)境搭建

    https://bbs.elecfans.com/jishu_2179209_1_1.html感謝 發(fā)燒友學(xué)院以及廣州旗點(diǎn)智能科技有限公司為我和孩子提供此產(chǎn)品星空gd32F303開發(fā)板。收到了星空
    發(fā)表于 11-02 15:36

    【星空GD32F303開發(fā)板試用體驗(yàn)】+板卡概覽

    本帖最后由 cooldog123pp 于 2021-11-6 21:07 編輯 星空GD開發(fā)板是由旗點(diǎn)科技推出的一款GD32開發(fā)板
    發(fā)表于 11-06 21:05

    星空GD32F303開發(fā)板的相關(guān)資料下載

    一、開發(fā)板介紹星空GD開發(fā)板是由旗點(diǎn)科技推出的一款GD32開發(fā)板,板載
    發(fā)表于 12-10 08:27

    STM32CUBEMX開發(fā)GD32F303(14)----IIC之配置OLED

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中進(jìn)行開發(fā),同時(shí)通過開發(fā)板內(nèi)進(jìn)行驗(yàn)證。
    的頭像 發(fā)表于 07-26 13:52 ?1744次閱讀
    STM32CUBEMX<b class='flag-5'>開發(fā)</b><b class='flag-5'>GD32F303</b>(14)----IIC之配置OLED

    GD32F303固件庫開發(fā)

    /qq_24312945/article/details/124325797] GD32F303固件庫開發(fā)(2)----保護(hù)與寫保護(hù) 芯片保護(hù)以后,
    的頭像 發(fā)表于 07-27 09:27 ?954次閱讀
    <b class='flag-5'>GD32F303</b>固件庫<b class='flag-5'>開發(fā)</b>

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

    通過本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容: FMC控制器原理; FMC擦寫操作;
    的頭像 發(fā)表于 05-06 11:08 ?916次閱讀
    【<b class='flag-5'>GD32F</b>470紫藤<b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊(cè)</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>

    GD32F303紅楓開發(fā)板使用手冊(cè)】第二 GPIO-流水燈實(shí)驗(yàn)

    GD32F303系列MCU最多可支持?112?個(gè)通用I/O?引腳(GPIO),分別為?PA0 ~ PA15,?PB0 ~ PB15,?PC0 ~ PC15,PD0 ~ PD15,?PE0
    的頭像 發(fā)表于 05-29 10:02 ?1209次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊(cè)</b>】第二<b class='flag-5'>講</b> GPIO-流水燈<b class='flag-5'>實(shí)驗(yàn)</b>

    GD32F303紅楓開發(fā)板使用手冊(cè)】第十六 USART-DMA串口收發(fā)實(shí)驗(yàn)

    在前面ADC章節(jié)中,我們介紹了DMA的工作原理,這里就不多做介紹。從GD32F303用戶手冊(cè)中可以查到,各串口的TX和RX分別對(duì)應(yīng)DMA的不同通道,比如USART0的TX對(duì)應(yīng)DMA0的通道3,而RX對(duì)應(yīng)DMA0的通道4。
    的頭像 發(fā)表于 06-15 09:54 ?694次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊(cè)</b>】第十六<b class='flag-5'>講</b> USART-DMA串口收發(fā)<b class='flag-5'>實(shí)驗(yàn)</b>

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

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