日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【GD32学习】五、片内Flash读写实验-闪存控制器FMC

發布時間:2023/12/18 编程问答 155 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【GD32学习】五、片内Flash读写实验-闪存控制器FMC 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

文章目錄


前言

準備


一、存儲信息

1、存儲信息寄存器

這個寄存器可以獲取?片上FLASH存儲器容量、片上SRAM容量

2、系統架構示意圖

?可見Flash的操作可以通過FMC控制器盡心操作,提供字、半字、字節閃存操作,可以扇區擦除、塊擦除和部分系列(GD32F470xx, GD32F427xx and GD32F425xx )還提供頁擦除(4KB)

3、存儲器映射

這個F4系列最大3072KB,我們用的芯片只有 512K

4、存儲扇區基地址和大小

?可以看出,不同的扇區大小還不一樣,有16K、64K、128K不同大小的扇區

二、解鎖

1、解鎖FMC_CTL、FMC_OBCTLx

復位之后 如果要操作FMC前要解鎖 FMC_CTL這個控制寄存器、若果要操作選項字節需解鎖FMC_OBCTLx 選項字節控制寄存器,都是先后往對應的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

?

當需要執行頁擦除操作時需要 往 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寄存器不處于鎖定狀態;
b、等待FMC_STAT寄存器的BUSY位變為0來確保沒有閃存操作在進行,否則等待該操作完成;
c、按照需求設置PSZ位域,并置位FMC_CTL寄存器的PG位;
d、DBUS寫一個32位整字/16位半字/8位字節(必須與FMC_CTL寄存器中的PSZ位匹配)到
????????目的絕對地址(0x08XX XXXX);
e、通過檢查FMC_STAT寄存器的BUSY位是否清0,來確定寫操作執行完畢;
f、如果需要,使用DBUS讀操作驗證是否編程成功。

2、8位字節編程例程

/* 單字節編程 */ 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位字節*/FMC_CTL &= ~FMC_CTL_PSZ;/* 選擇新的編程大小位位 8位字節*/ FMC_CTL |= CTL_PSZ_BYTE;/* 置位 FMC_CTL_PG ,PG位必須在32位整字/16位半字/8位字節編程開始前進行置位*/ FMC_CTL |= FMC_CTL_PG;/* 開始編程,往對應的地址存入數據*/ REG8(address) = data;/* 等待BUSY忙碌標志清零,操作完成 */fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT);/* 清零PG位 */FMC_CTL &= ~FMC_CTL_PG;}/* 返回 FMC 狀態 */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;/* 選擇擦除扇區號 */ FMC_CTL &= ~FMC_CTL_SN;/* 主存儲塊扇區擦除命令置位 */ FMC_CTL |= FMC_CTL_SER;/* 發送擦除命令位 */ FMC_CTL |= FMC_CTL_START;/* 等待BUSY忙碌標志清零,操作完成 */fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT);/* PE_EN 停止頁擦除 */ FMC_PECFG &= ~FMC_PE_EN;/* 主存儲塊扇區擦除命令清零 */ FMC_CTL &= ~FMC_CTL_SER;}return fmc_state; }

?FMC還提供 扇區擦除、塊擦除,這里不詳細說明了。


總結

總結

以上是生活随笔為你收集整理的【GD32学习】五、片内Flash读写实验-闪存控制器FMC的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。