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

【GD32H757Z海棠派開發板使用手冊】第四講 FMC-片內Flash擦寫讀實驗

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

4.1實驗內容

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

  • FMC控制器原理;

  • FMC擦寫讀操作;

4.2實驗原理

4.2.1FMC控制器原理

FMC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32H7XX系列MCU中,具有高達3840KB字節的片上閃存可用于存儲指令或數據。FMC也提供了扇區擦除和整片擦除操作以及編程操作。

Flash讀取可以支持64字節雙字、32位整字、16位半字或字節讀操作;Flash編程可以支持64位雙字、32位整字編程;Flash擦除支持扇區擦除和整片擦除操作。

Flash具有僅執行的專用代碼讀保護區域,便于芯片代碼保護以及二次合作開發。

FMC框圖如下所示,FMC支持用以訪問代碼或數據的64位AXI接口以及用以訪問寄存器的32位AHB從機接口。

wKgZomYh0M2ASXBaAABWBI1KHf8769.png

閃存包括3840KB字節主閃存,分為960個扇區,扇區大小為4KB,和64KB用于引導加載程序的信息塊。主存儲閃存的每個扇區都可以單獨擦除 。

wKgZomYh0NmADs3jAACHzfMnsTQ573.png

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

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

4.2.2Flash擦除操作原理

Flash擦除可分為塊擦除以及整片擦除,如下圖所示,扇區擦除時間典型值為100ms,整片擦除也根據容量大小會有差異。

wKgaomYh0PGAK-fYAAEQucyDXmc569.png

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

wKgZomYh0P6AaAOHAABYIxnVQHU429.png

4.2.3Flash寫入編程操作原理

GD32H7系列MCU可支持64位雙字/32位整字編程,如下圖所示,Flash 32位整字編程時間典型值為1us。

wKgaomYh0PGAK-fYAAEQucyDXmc569.png


有關Flash編程實現函數如下表所示。

wKgaomYh0SuAdNZjAACGC3qGvsg217.png


4.2.4Flash讀取操作原理

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

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

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

4.3硬件設計

本例程不涉及硬件電路

4.4代碼解析

4.4.1Flash寫入多字節函數

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

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,data_lengh_word=data_lengh/4;
int32_t data_earse_num;
uint32_t* pbuff=(uint32_t*)data_buf;

if(data_lengh%4 !=0)
{
data_lengh_word++;
}


fmc_unlock(); /* 解鎖FMC */
/* 清除錯誤標志 */
fmc_flag_clear(FMC_FLAG_WPERR);
fmc_flag_clear(FMC_FLAG_PGSERR);
fmc_flag_clear(FMC_FLAG_RPERR);
fmc_flag_clear(FMC_FLAG_RSERR);
fmc_flag_clear(FMC_FLAG_ECCCOR);
fmc_flag_clear(FMC_FLAG_ECCDET);
fmc_flag_clear(FMC_FLAG_OBMERR);

erase_addr = write_start_addr;
data_earse_num = data_lengh;

if(write_start_addr%FLAG_PAGE_SIZE == 0) /* 若寫入地址為頁起始地址 */
{
for(;data_earse_num>0;)
{
fmc_sector_erase(erase_addr);
/* 清除錯誤標志 */
fmc_flag_clear(FMC_FLAG_WPERR);
fmc_flag_clear(FMC_FLAG_PGSERR);
fmc_flag_clear(FMC_FLAG_RPERR);
fmc_flag_clear(FMC_FLAG_RSERR);
fmc_flag_clear(FMC_FLAG_ECCCOR);
fmc_flag_clear(FMC_FLAG_ECCDET);
fmc_flag_clear(FMC_FLAG_OBMERR);
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_sector_erase(erase_addr);
/* 清除錯誤標志 */
fmc_flag_clear(FMC_FLAG_WPERR);
fmc_flag_clear(FMC_FLAG_PGSERR);
fmc_flag_clear(FMC_FLAG_RPERR);
fmc_flag_clear(FMC_FLAG_RSERR);
fmc_flag_clear(FMC_FLAG_ECCCOR);
fmc_flag_clear(FMC_FLAG_ECCDET);
fmc_flag_clear(FMC_FLAG_OBMERR);
erase_addr+=FLAG_PAGE_SIZE;
data_earse_num-=FLAG_PAGE_SIZE;
}
}

/* 寫入數據 */
write_addr = write_start_addr;

for(data_write_num = 0; data_write_num{
fmc_word_program(write_addr, pbuff[data_write_num]);
/* 清除錯誤標志 */
fmc_flag_clear(FMC_FLAG_WPERR);
fmc_flag_clear(FMC_FLAG_PGSERR);
fmc_flag_clear(FMC_FLAG_RPERR);
fmc_flag_clear(FMC_FLAG_RSERR);
fmc_flag_clear(FMC_FLAG_ECCCOR);
fmc_flag_clear(FMC_FLAG_ECCDET);
fmc_flag_clear(FMC_FLAG_OBMERR);

write_addr+=4;
}
fmc_lock();
}

4.4.2Flash讀取數據函數

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

C
uint8_t fmc_read_data(uint32_t write_read_addr)
{
return *(uint8_t *)write_read_addr;
}

4.4.3主函數

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

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.rn');
printf_log('Write data to internal Flash.rn');
fmc_write_data(WRITE_START_ADDR,write_data,sizeof(write_data)); /* 向WRITE_START_ADDR地址寫入10個雙字節數據 */
printf_log('Read data from internal Flash.rn');
for(read_num=0;read_num{
read_data[read_num] = fmc_read_data(WRITE_START_ADDR+read_num); /* 從WRITE_START_ADDR讀取10個雙字節數據 */
}
printf_log('Verify the written and read data.rn');
for(i_num=0;i_num{
/* 校驗數據 */
if(read_data[i_num]!=write_data[i_num])
{
/* 校驗數據出錯 */
printf_log('Error in verifying data.rn');
printf_log('Turn on LED1.rn');
bsp_led_on(&LED1);
while(1);
}else{
}
}
/* 校驗數據成功 */
printf_log('Turn on LED1.rn');
bsp_led_on(&LED1);
printf_log('Verify that the data is correct and that the written and read data are consistent.rn');

while (1)
{
}
}

4.5實驗結果

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


關鍵字:FMC  片內Flash 引用地址:【GD32H757Z海棠派開發板使用手冊】第四講 FMC-片內Flash擦寫讀實驗

上一篇:【GD32F303紅楓派開發板使用手冊】第六講 PMU-低功耗實驗講
下一篇:【GD32H757Z海棠派開發板使用手冊】第五講 PMU-低功耗實驗

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

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 富平县| 沛县| 阜新市| 垫江县| 仙桃市| 乌鲁木齐县| 杭锦旗| 定结县| 靖西县| 乃东县| 读书| 宿迁市| 西安市| 离岛区| 韩城市| 武胜县| 丁青县| 和政县| 兴海县| 竹北市| 贡山| 阿勒泰市| 香格里拉县| 安阳县| 余干县| 南平市| 拜城县| 蒲城县| 咸宁市| 齐河县| 临清市| 唐山市| 塔城市| 南充市| 天门市| 北辰区| 楚雄市| 蕲春县| 镇宁| 沾益县| 福安市|