一,GD32的flash特征
1、在flash的前256K字節(jié)空間內(nèi),CPU執(zhí)行指令零等待;在此范圍外,CPU讀取指令存在較長延時;
2、對于flash大于512KB(不包括等于512KB)的GD32F10x_CL和GD32F10x_XD,使用了兩片閃存;前512KB容量在第一片閃存(bank0)中,后續(xù)的容量在第二片閃存(bank1)中;
3、對于flash容量小于等于512KB的GD32F10x_CL和GD32F10x_HD,只使用了bank0;
4、對 于 GD32F10x_MD , 閃 存 頁 大 小 為 1KB 。GD32F10x_CL 和 GD32F10x_HD ,GD32F10x_XD,bank0的閃存頁大小為2KB,bank1的閃存頁大小為4KB;
5、支持32位整字或16位半字編程,頁擦除和整片擦除操作;
二,GD32的flash結(jié)構(gòu)
1、GD32F10x_MD
GD32F10x_CL,GD32F10x_HD 和 GD32F10x_XD
三,GD32的flash讀操作
flash可以像普通存儲空間一樣直接尋址訪問。
value=*(uint32_t*)FlashAddr;
uint16_t IAP_ReadFlag(void){ return *(volatile uint16_t*)(FLASH_ADDR); }
四,GD32的flash擦除操作
每一頁可以被獨立擦除,步驟如下:
1,確保FMC_CTLx寄存器不處于鎖定狀態(tài);
2,檢查FMC_STATx寄存器的BUSY位來判定閃存是否正處于擦寫訪問狀態(tài),若BUSY位為1,則需等待該操作結(jié)束,BUSY位變?yōu)?;
3,置位FMC_CTLx寄存器的PER位;
4,將待擦除頁的絕對地址(0x08XX XXXX)寫到FMC_ADDRx寄存器;
5,通過將FMC_CTLx寄存器的START位置1來發(fā)送頁擦除命令到FMC;
6,等待擦除指令執(zhí)行完畢,F(xiàn)MC_STATx寄存器的BUSY位清0;
7,如果需要,使用DBUS讀并驗證該頁是否擦除成功。
void fmc_erase_page(uint32_t Page_Address){ fmc_unlock(); //fmc解鎖 /* clear all pending flags */ fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
/* erase the flash pages */ fmc_page_erase(Page_Address);
/* clear all pending flags */ fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
fmc_lock(); //fmc上鎖}
要擦除連續(xù)的幾頁:
void fmc_erase_pages(void){uint32_terase_counter;
/* unlock the flash program/erase controller */ fmc_unlock(); /* clear all pending flags */ fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
/* erase the flash pages */ for(erase_counter = 0; erase_counter < page_num; erase_counter++){ fmc_page_erase(FMC_WRITE_START_ADDR + (FMC_PAGE_SIZE * erase_counter)); fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR); }
/* lock the main FMC after the erase operation */ fmc_lock();}
全部擦除:
void fmc_erase_page(uint32_t Page_Address){ fmc_unlock(); //fmc解鎖 /* clear all pending flags */ fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
/* erase whole chip */ fmc_mass_erase();
/* clear all pending flags */ fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
fmc_lock(); //fmc上鎖}
五,flash寫
往flash的某個地址寫入數(shù)據(jù)前,一般要先擦除該地址。
16位半字編程:
void IAP_WriteFlag(uint16_t flag){ fmc_unlock(); fmc_page_erase(IAP_FLAG_ADDR); fmc_halfword_program(IAP_FLAG_ADDR,flag); fmc_lock();}
32位整字編程:
void fmc_program(void){ /* unlock the flash program/erase controller */ fmc_unlock();
address = FMC_WRITE_START_ADDR; /* program flash */ while(address < FMC_WRITE_END_ADDR){ fmc_word_program(address, data0); address += 4; fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR); } /* lock the main FMC after the program operation */ fmc_lock();}
-
FlaSh
+關(guān)注
關(guān)注
10文章
1662瀏覽量
150964 -
cpu
+關(guān)注
關(guān)注
68文章
11031瀏覽量
215955 -
GD32
+關(guān)注
關(guān)注
7文章
418瀏覽量
25143
發(fā)布評論請先 登錄
【GD32H757Z海棠派開發(fā)板使用手冊】第四講 FMC-片內(nèi)Flash擦寫讀實驗

GD32 MCU 入門教程】GD32 MCU 常見外設(shè)介紹(12)FMC 模塊介紹

什么是GD32
「必看干貨」淺談GD32與STM32之間的區(qū)別
JFlash解除GD32讀保護的方法
GD32操作FLASH時有哪些注意事項呢
GD32替換STM32?這些坑你別踩...
分享在IAR環(huán)境下GD32的flash下載算法的一些理解
《GD32 MCU原理及固件庫開發(fā)指南》 + 初讀感悟
Linux下flash操作讀、寫、擦除步驟

如何使用QSPI Flash控制器開發(fā)板上的 QSPI Flash進行寫讀操作

GD32操作FLASH時注意事項

評論