娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

【GD32F303紅楓派開發板使用手冊】第五講 FMC-片內Flash擦寫讀實驗

發布者:心動旋律最新更新時間:2024-12-03 來源: elecfans關鍵字:GD32F303  FMC  片內Flash 手機看文章 掃描二維碼
隨時隨地手機看文章

5.1實驗內容

通過本實驗主要學習以下內容:

5.2實驗原理

5.2.1FMC控制器原理

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

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

wKgaomZb0auADhBAAAE5vVykrCc089.png

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

下面為各位讀者介紹Flash擦寫讀的相關操作。

5.2.2Flash擦除操作原理

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

wKgZomZb0c2ASswvAAEH590A580334.png

有關Flash的相關操作均在gd32f30x_fmc.c中實現,下面介紹下擦除實現的函數,如下表所示。

wKgaomZb0hOARtTCAABPassmiMA901.png

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

5.2.4Flash讀取操作原理

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

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

  • 注意:有關Flash有以下參數讀者需要了解,GD32F303系列MCU的內部Flash具有至少10萬次的擦寫次數以及20年的數據保持能力,但需注意,隨著擦寫次數的增加數據保持時間會下降。

5.3硬件設計

本例程不涉及硬件電路

5.4代碼解析

5.4.1Flash寫入16bit雙字節函數

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

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的錯誤標志 */ 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,說明需要擦寫的數據均在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,說明擦寫的數據可能跨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; } } } } /* 寫入數據 */ write_addr = write_start_addr; for(data_write_num = 0; data_write_num

5.4.2Flash讀取數據函數

Flash讀取數據函數如下所示,采用直接尋址的方式,讀取雙字節數據。

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


5.4.3主函數

主函數如下所示,通過該函數實現對flash起始地址為0x08001000的前20個字節擦寫以及讀取的驗證。

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實驗結果

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

wKgZomZb0p6ADaUfAABe7izWiVg635.png

關鍵字:GD32F303  FMC  片內Flash 引用地址:【GD32F303紅楓派開發板使用手冊】第五講 FMC-片內Flash擦寫讀實驗

上一篇:GD32F303想控制PA13~15、PB3和PB4不成功?
下一篇:GD32F1硬件開發指南之復位電路

小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 株洲市| 华蓥市| 青龙| 黄龙县| 南华县| 南木林县| 光山县| 望谟县| 含山县| 牡丹江市| 罗平县| 大洼县| 德庆县| 颍上县| 资兴市| 彩票| 太仓市| 英山县| 桑日县| 白山市| 岑溪市| 岗巴县| 天全县| 灵武市| 辛集市| 桦南县| 杭州市| 伊春市| 长治市| 拜泉县| 东丰县| 大庆市| 洛浦县| 镇巴县| 沁阳市| 诸城市| 全南县| 阿拉善左旗| 嘉荫县| 祥云县| 吉水县|