【GD32学习】五、片内Flash读写实验-闪存控制器FMC
?
文章目錄
前言
準備
一、存儲信息
1、存儲信息寄存器
這個寄存器可以獲取?片上FLASH存儲器容量、片上SRAM容量
2、系統(tǒng)架構示意圖
?可見Flash的操作可以通過FMC控制器盡心操作,提供字、半字、字節(jié)閃存操作,可以扇區(qū)擦除、塊擦除和部分系列(GD32F470xx, GD32F427xx and GD32F425xx )還提供頁擦除(4KB)
3、存儲器映射
這個F4系列最大3072KB,我們用的芯片只有 512K
4、存儲扇區(qū)基地址和大小
?可以看出,不同的扇區(qū)大小還不一樣,有16K、64K、128K不同大小的扇區(qū)
二、解鎖
1、解鎖FMC_CTL、FMC_OBCTLx
復位之后 如果要操作FMC前要解鎖 FMC_CTL這個控制寄存器、若果要操作選項字節(jié)需解鎖FMC_OBCTLx 選項字節(jié)控制寄存器,都是先后往對應的KEY解鎖寄存器寫入兩個對應的序列,上鎖是把對應 的 LK bit 置1
FMC_CTL解鎖上鎖例程
/*!\brief unlock the main FMC operation\param[in] none\param[out] none\retval none */ void fmc_unlock(void) {if((RESET != (FMC_CTL & FMC_CTL_LK))) {/* write the FMC key */FMC_KEY = UNLOCK_KEY0;FMC_KEY = UNLOCK_KEY1;} }/*!\brief lock the main FMC operation\param[in] none\param[out] none\retval none */ void fmc_lock(void) {/* set the LK bit*/FMC_CTL |= FMC_CTL_LK; }2、解鎖 也擦除配置寄存器?FMC_PECFG
?
當需要執(zhí)行頁擦除操作時需要 往 FMC_PEKEY 寄存器寫入?0xA9B8C7D6來解鎖FMC_PECFG寄存器
?
三、讀操作
可以直接尋址訪問?
void fmc_read_8bit_data(uint32_t address, uint16_t length, int8_t* data_8) {uint8_t i; for(i=0; i<length; i++){/*直接尋址訪問*/data_8[i] = *(__IO int8_t*)address;address++;} }四、主flash編程操作
1、操作流程
a、確保FMC_CTL寄存器不處于鎖定狀態(tài);
b、等待FMC_STAT寄存器的BUSY位變?yōu)?來確保沒有閃存操作在進行,否則等待該操作完成;
c、按照需求設置PSZ位域,并置位FMC_CTL寄存器的PG位;
d、DBUS寫一個32位整字/16位半字/8位字節(jié)(必須與FMC_CTL寄存器中的PSZ位匹配)到
????????目的絕對地址(0x08XX XXXX);
e、通過檢查FMC_STAT寄存器的BUSY位是否清0,來確定寫操作執(zhí)行完畢;
f、如果需要,使用DBUS讀操作驗證是否編程成功。
2、8位字節(jié)編程例程
/* 單字節(jié)編程 */ fmc_state_enum fmc_byte_program(uint32_t address, uint8_t data) {fmc_state_enum fmc_state = FMC_READY;/* 等待BUSY忙碌標志清零、FMC就緒、FMC沒有故障 */fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT);if(FMC_READY == fmc_state) {/* 復位編程大小位有 32位整字/16位半字/8位字節(jié)*/FMC_CTL &= ~FMC_CTL_PSZ;/* 選擇新的編程大小位位 8位字節(jié)*/ FMC_CTL |= CTL_PSZ_BYTE;/* 置位 FMC_CTL_PG ,PG位必須在32位整字/16位半字/8位字節(jié)編程開始前進行置位*/ FMC_CTL |= FMC_CTL_PG;/* 開始編程,往對應的地址存入數(shù)據(jù)*/ REG8(address) = data;/* 等待BUSY忙碌標志清零,操作完成 */fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT);/* 清零PG位 */FMC_CTL &= ~FMC_CTL_PG;}/* 返回 FMC 狀態(tài) */return fmc_state; }3、頁擦除(GD32F425、GD32F427、GD32F470支持)
1、流程
2、程序解析
/* 頁擦除 */ fmc_state_enum fmc_page_erase(uint32_t page_addr) {fmc_state_enum fmc_state = FMC_READY;/* 等待BUSY忙碌標志清零、FMC就緒、FMC沒有故障 */fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT);if(FMC_READY == fmc_state) {/* 解鎖 FMC_PECFG */FMC_PEKEY = UNLOCK_PE_KEY;/* PE_EN置位使能頁擦除、 page_addr要擦除的頁地址*/FMC_PECFG = FMC_PE_EN | page_addr;/* 選擇擦除扇區(qū)號 */ FMC_CTL &= ~FMC_CTL_SN;/* 主存儲塊扇區(qū)擦除命令置位 */ FMC_CTL |= FMC_CTL_SER;/* 發(fā)送擦除命令位 */ FMC_CTL |= FMC_CTL_START;/* 等待BUSY忙碌標志清零,操作完成 */fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT);/* PE_EN 停止頁擦除 */ FMC_PECFG &= ~FMC_PE_EN;/* 主存儲塊扇區(qū)擦除命令清零 */ FMC_CTL &= ~FMC_CTL_SER;}return fmc_state; }?FMC還提供 扇區(qū)擦除、塊擦除,這里不詳細說明了。
總結
總結
以上是生活随笔為你收集整理的【GD32学习】五、片内Flash读写实验-闪存控制器FMC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ITIL事件管理流程关键知识
- 下一篇: map拼接URL参数