![wKgaomYwSqiAY_PQAAnl063z3JE116.png](https://file1.elecfans.com/web2/M00/DF/57/wKgaomYwSqiAY_PQAAnl063z3JE116.png)
4.1實(shí)驗(yàn)內(nèi)容
通過本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容:
- FMC控制器原理;
- FMC擦寫讀操作;
4.2實(shí)驗(yàn)原理
4.2.1FMC控制器原理
FMC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F4xx系列MCU中,F(xiàn)lash前512KB字節(jié)空間內(nèi),CPU執(zhí)行指令零等待,具有相同主頻下最快的代碼執(zhí)行效率。FMC也提供了扇區(qū)擦除和整片擦除操作,以及32位整字/16位半字/字節(jié)編程等閃存操作。
另外GD32F470xx,GD32F427xx和GD32F425xx系列還額外提供了頁(4KB)擦除操作
GD32F4xx系列MCU支持最大3M Flash空間。
GD32F4xx系列MCU可以支持最大3M的Flash空間,BANK0的空間為1MB,前4個(gè)扇區(qū)為16KB,第五個(gè)扇區(qū)為64KB,之后的扇區(qū)為128KB;BANK1的空間為2MB,前4個(gè)扇區(qū)為16KB,第五個(gè)扇區(qū)為64KB,之后七個(gè)扇區(qū)為128KB;剩下的扇區(qū)為256KB。
有關(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)操作。
4.2.2Flash擦除操作原理
Flash擦除可分為扇區(qū)擦除以及整片擦除,如下圖所示,扇區(qū)擦除時(shí)間典型值為200-600ms(根據(jù)扇區(qū)大小進(jìn)行區(qū)分),整片擦除也根據(jù)容量大小會有差異。
![wKgZomY4SMCAUDvTAAOCgyFckE0155.png](https://file1.elecfans.com/web2/M00/E0/4D/wKgZomY4SMCAUDvTAAOCgyFckE0155.png)
有關(guān)Flash的相關(guān)操作均在gd32f4xx_fmc.c中實(shí)現(xiàn),下面介紹下擦除實(shí)現(xiàn)的函數(shù),如下表所示。
![wKgaomY4SM2AHSJtAABznpenHIk869.png](https://file1.elecfans.com/web2/M00/E1/2C/wKgaomY4SM2AHSJtAABznpenHIk869.png)
4.2.3Flash寫入編程操作原理
GD32F4xx系列MCU可支持32位整字編程/16位半字以及字節(jié)編程,如下圖所示,F(xiàn)lash 32位整字編程時(shí)間典型值為37.5us。
![wKgZomY4SMCAUDvTAAOCgyFckE0155.png](https://file1.elecfans.com/web2/M00/E0/4D/wKgZomY4SMCAUDvTAAOCgyFckE0155.png)
有關(guān)Flash編程實(shí)現(xiàn)函數(shù)如下表所示。
![wKgaomY4SOWASS1xAACmNFpH5Yk690.png](https://file1.elecfans.com/web2/M00/E1/2D/wKgaomY4SOWASS1xAACmNFpH5Yk690.png)
4.2.4Flash讀取操作原理
Flash讀取可以采用直接尋址的方式進(jìn)行操作,具體可參考以下示例代碼。
C
uint32_t read_data;
read_data = *(uint32_t *)0x08001000;
|
4.3硬件設(shè)計(jì)
本例程不涉及硬件電路。
4.4代碼解析
4.4.1Flash寫入多字節(jié)函數(shù)
Flash寫入多字節(jié)操作函數(shù)如下所示,寫入的過程主要分為擦寫兩個(gè)操作,由于Flash特有特性,需要先擦除才可以寫入,因而需要確保寫入地址的初識數(shù)據(jù)為0xFF。本函數(shù)可以實(shí)現(xiàn)根據(jù)地址識別對應(yīng)頁并進(jìn)行擦除的功能,使用上非常方便,使用者只需要關(guān)心擦寫的起始地址以及數(shù)據(jù)和長度即可,擦寫的位置函數(shù)中會進(jìn)行實(shí)現(xiàn)。
C
void fmc_write_data(uint32_t write_start_addr, uint8_t *data_buf, uint16_t data_lengh)
{
uint32_t write_addr,erase_addr;
uint16_t data_write_num=0;
int32_t data_earse_num;
fmc_unlock(); /* 解鎖FMC */
/* 清除錯(cuò)誤標(biāo)志 */
fmc_flag_clear(FMC_FLAG_RDDERR|FMC_FLAG_PGSERR|FMC_FLAG_PGMERR|FMC_FLAG_WPERR|FMC_FLAG_OPERR);
erase_addr = write_start_addr;
data_earse_num = data_lengh;
if(write_start_addr%FLAG_PAGE_SIZE == 0) /* 若寫入地址為頁起始地址 */
{
for(;data_earse_num>0;)
{
fmc_page_erase(erase_addr);
/* 清除錯(cuò)誤標(biāo)志 */
fmc_flag_clear(FMC_FLAG_RDDERR|FMC_FLAG_PGSERR|FMC_FLAG_PGMERR|FMC_FLAG_WPERR|FMC_FLAG_OPERR);
erase_addr+=FLAG_PAGE_SIZE;
data_earse_num-=FLAG_PAGE_SIZE;
}
}else{
/*若寫入地址不是頁起始地址*/
for(;(data_earse_num>0||erase_addr>=write_start_addr+data_lengh);)
{
fmc_page_erase(erase_addr);
fmc_flag_clear(FMC_FLAG_RDDERR|FMC_FLAG_PGSERR|FMC_FLAG_PGMERR|FMC_FLAG_WPERR|FMC_FLAG_OPERR);
erase_addr+=FLAG_PAGE_SIZE;
data_earse_num-=FLAG_PAGE_SIZE;
}
}
/* 寫入數(shù)據(jù) */
write_addr = write_start_addr;
for(data_write_num = 0; data_write_num{
fmc_byte_program(write_addr, data_buf[data_write_num]);
fmc_flag_clear(FMC_FLAG_RDDERR|FMC_FLAG_PGSERR|FMC_FLAG_PGMERR|FMC_FLAG_WPERR|FMC_FLAG_OPERR);
write_addr++;
}
fmc_lock();
}
4.4.2Flash讀取數(shù)據(jù)函數(shù)
Flash讀取數(shù)據(jù)函數(shù)如下所示,采用直接尋址的方式,讀取字節(jié)數(shù)據(jù)。
C
uint8_t fmc_read_data(uint32_t write_read_addr)
{
return *(uint8_t *)write_read_addr;
}
4.4.3主函數(shù)
主函數(shù)如下所示,通過該函數(shù)實(shí)現(xiàn)對flash起始地址為0x080A0000的前10個(gè)字節(jié)擦寫以及讀取的驗(yàn)證。
C
int main(void)
{
uint16_t read_num =0;
uint8_t i_num;
driver_init();
bsp_led_group_init();
bsp_uart_init(&BOARD_UART); /* 板載UART初始化 */
printf_log("Example of internal Flash read-write demo.\r\n");
printf_log("Write data to internal Flash.\r\n");
fmc_write_data(WRITE_START_ADDR,write_data,sizeof(write_data)); /* 向WRITE_START_ADDR地址寫入10個(gè)雙字節(jié)數(shù)據(jù) */
printf_log("Read data from internal Flash.\r\n");
for(read_num=0;read_num{
read_data[read_num] = fmc_read_data(WRITE_START_ADDR+read_num); /* 從WRITE_START_ADDR讀取10個(gè)雙字節(jié)數(shù)據(jù) */
}
printf_log("Verify the written and read data.\r\n");
for(i_num=0;i_num{
/* 校驗(yàn)數(shù)據(jù) */
if(read_data[i_num]!=write_data[i_num])
{
/* 校驗(yàn)數(shù)據(jù)出錯(cuò) */
printf_log("Error in verifying data.\r\n");
printf_log("Turn on LED1.\r\n");
bsp_led_on(&LED1);
while(1);
}else{
}
}
/* 校驗(yàn)數(shù)據(jù)成功 */
printf_log("Turn on LED1.\r\n");
bsp_led_on(&LED1);
printf_log("Verify that the data is correct and that the written and read data are consistent.\r\n");
while (1)
{
}
}
4.5實(shí)驗(yàn)結(jié)果
將本實(shí)驗(yàn)燒錄到紫藤派實(shí)驗(yàn)板中,運(yùn)行后可以觀察到LED1常亮,表明擦寫以及讀取實(shí)驗(yàn)正常。
![wKgaomY4STWACq3NACfNIcLBnHc085.png](https://file1.elecfans.com/web2/M00/E1/2D/wKgaomY4STWACq3NACfNIcLBnHc085.png)
本教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)
-
單片機(jī)
+關(guān)注
關(guān)注
6043文章
44621瀏覽量
638495 -
嵌入式
+關(guān)注
關(guān)注
5092文章
19177瀏覽量
307645 -
FlaSh
+關(guān)注
關(guān)注
10文章
1642瀏覽量
148661 -
FMC
+關(guān)注
關(guān)注
0文章
96瀏覽量
19758
發(fā)布評論請先 登錄
相關(guān)推薦
【GD32H757Z海棠派開發(fā)板使用手冊】第四講 FMC-片內(nèi)Flash擦寫讀實(shí)驗(yàn)
![【<b class='flag-5'>GD</b>32H757Z海棠<b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</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>](https://file1.elecfans.com/web2/M00/D0/11/wKgaomYh0jaATN9aAAAg1ojhpwg534.png)
【GD32F470紫藤派開發(fā)板使用手冊】第九講 USART-printf打印實(shí)驗(yàn)
![【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第九<b class='flag-5'>講</b> USART-printf打印<b class='flag-5'>實(shí)驗(yàn)</b>](https://file1.elecfans.com/web2/M00/E5/D2/wKgaomZBd4yALE4KAAAvGTwv8Y8126.png)
【GD32F470紫藤派開發(fā)板使用手冊】第十一講 SPI-SPI NOR FLASH讀寫實(shí)驗(yàn)
![【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第十一講 SPI-SPI NOR <b class='flag-5'>FLASH</b>讀寫<b class='flag-5'>實(shí)驗(yàn)</b>](https://file1.elecfans.com/web2/M00/E6/51/wKgZomZGuYCAbqxgAAAj5ISjOEU463.png)
APT32F102 開發(fā)板使用手冊
【GD32F470紫藤派開發(fā)板使用手冊】第二講 GPIO-按鍵查詢實(shí)驗(yàn)
![【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第二<b class='flag-5'>講</b> GPIO-按鍵查詢<b class='flag-5'>實(shí)驗(yàn)</b>](https://file1.elecfans.com/web2/M00/DE/7F/wKgZomYwZ-2AMDLHAAAaqUkF6cI459.png)
【GD32F470紫藤派開發(fā)板使用手冊】第五講 PMU-低功耗實(shí)驗(yàn)
![【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第五<b class='flag-5'>講</b> PMU-低功耗<b class='flag-5'>實(shí)驗(yàn)</b>](https://file1.elecfans.com/web2/M00/E2/6B/wKgaomY5g96AWdtsAAAkDxDyMcU926.png)
【GD32F470紫藤派開發(fā)板使用手冊】第八講 ADC-規(guī)則組多通道采樣實(shí)驗(yàn)
![【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第八<b class='flag-5'>講</b> ADC-規(guī)則組多通道采樣<b class='flag-5'>實(shí)驗(yàn)</b>](https://file1.elecfans.com/web2/M00/E4/94/wKgZomZAItOAZWmeAAAqAQp_IEg785.png)
【GD32F470紫藤派開發(fā)板使用手冊】第十三講 USB_虛擬鍵盤實(shí)驗(yàn)
![【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b><b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第十三講 USB_虛擬鍵盤<b class='flag-5'>實(shí)驗(yàn)</b>](https://file1.elecfans.com/web2/M00/E6/E6/wKgZomZJXQ-AfXsgAABAaZrUO3I092.png)
【GD32F303紅楓派開發(fā)板使用手冊】第五講 FMC-片內(nèi)Flash擦寫讀實(shí)驗(yàn)
![【<b class='flag-5'>GD32F</b>303紅楓<b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</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>](https://file1.elecfans.com/web2/M00/EB/E3/wKgaomZb036AbrwmAAAy6saV5XI905.png)
【GD32F303紅楓派開發(fā)板使用手冊】第二十講 SPI-SPI NAND FLASH讀寫實(shí)驗(yàn)
![【<b class='flag-5'>GD32F</b>303紅楓<b class='flag-5'>派</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>使用手冊</b>】第二十<b class='flag-5'>講</b> SPI-SPI NAND <b class='flag-5'>FLASH</b>讀寫<b class='flag-5'>實(shí)驗(yàn)</b>](https://file1.elecfans.com/web2/M00/F1/AD/wKgaomZzisiAamI-AABGtAQwDgo073.png)
評論