0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

聚沃科技 ? 2024-08-21 09:56 ? 次閱讀

12.1.FMC 基礎(chǔ)知識(shí)

閃存控制器(FMC),提供了片上閃存需要的所有功能。FMC 也提供了頁(yè)擦除,整片擦除,以及32 位整字或 16 位半字編程閃存等操作。 GD32 MCU 支持不同類型編程的具體說(shuō)明如下表 GD32 MCU 不同系列編程區(qū)別所示。

輸入圖片說(shuō)明

12.2.FMC 功能

支持 32 位整字或 16 位半字編程,頁(yè)擦除和整片擦除操作;

支持 CPU 執(zhí)行指令零等待區(qū)域(code area)和非零等待區(qū)域(data area); 大小為 16 字節(jié)的可選字節(jié)塊可根據(jù)用戶需求配置;

具有安全保護(hù)狀態(tài),可阻止對(duì)代碼或數(shù)據(jù)的非法讀訪問;

相關(guān)術(shù)語(yǔ)說(shuō)明

GD32F10x 和 F30x 分別有 MD(中容量) 、HD(大容量)、XD(超大容量) 、CL(互聯(lián)型)系列,不同的系列外設(shè)資源有差異,使用固件庫(kù)(Firmware)也要作相應(yīng)的選擇和定義。 中容量產(chǎn)品指Flash 容量為小于 256K 字節(jié)的系列;

大容量產(chǎn)品指 Flash 容量為 256K 至 512K 字節(jié)之間的 系列; 超大容量產(chǎn)品指 Flash 容量為 768K 至 3072K 字節(jié)之間的系列。

GD32F10X/F30X 系列容量匯總

輸入圖片說(shuō)明

不同容量工程選擇說(shuō)明,固件庫(kù)是通過宏定義來(lái)區(qū)分的。

輸入圖片說(shuō)明

不同的系列 MCU flash 架構(gòu)不一樣,其中 GD32F 系列的 MCU flash 分 code area 和 data area, code area CPU 執(zhí)行指令是零等待, GD32E 系列 flash 不分 code area 和 data are,但都要插入等待周期。 GD32 系列 Code area&Data area 匯總

輸入圖片說(shuō)明

讀操作 閃存可以像普通存儲(chǔ)空間一樣直接尋址訪問。對(duì)閃存取指令和取數(shù)據(jù)分別使用 CPU 的 IBUS 或 DBUS總線。

代碼操作如:

uint32_t readflash[3] readflash [0] = *(__IO uint32_t*)(0x8004000); readflash [1] = *(__IO uint32_t*)((0x8004004); readflash [2] = *(__IO uint32_t*)((0x8004008);

頁(yè)擦除

FMC 的頁(yè)擦除功能使得主存儲(chǔ)閃存的頁(yè)內(nèi)容初始化為高電平。 每一頁(yè)都可以被獨(dú)立擦除,而不影響其他頁(yè)內(nèi)容。

FMC 擦除頁(yè)步驟如下:

? 確保 FMC_CTLx 寄存器不處于鎖定狀態(tài);

? 檢查 FMC_STATx 寄存器的 BUSY 位來(lái)判定閃存是否正處于擦寫訪問狀態(tài),若 BUSY 位為 1,則需等待該操作結(jié)束, BUSY 位變?yōu)?0;

? 置位 FMC_CTLx 寄存器的 PER 位;

? 將待擦除頁(yè)的絕對(duì)地址( 0x08XX XXXX)寫到 FMC_ADDRx 寄存器;

? 通過將 FMC_CTLx 寄存器的 START 位置 1 來(lái)發(fā)送頁(yè)擦除命令到 FMC;

? 等待擦除指令執(zhí)行完畢, FMC_STATx 寄存器的 BUSY 位清 0;

? 如果需要,使用 DBUS 讀并驗(yàn)證該頁(yè)是否擦除成功。

輸入圖片說(shuō)明

整片擦除

FMC 提供了整片擦除功能可以初始化主存儲(chǔ)閃存塊的內(nèi)容。當(dāng)設(shè)置 MER0 為 1 時(shí),擦除過程僅作用于 Bank0,當(dāng)設(shè)置 MER1 為 1 時(shí),擦除過程僅作用于 Bank1,當(dāng)設(shè)置 MER0 和 MER1 為 1 時(shí),擦除過程作用于整片閃存。

整片擦除操作,寄存器設(shè)置具體步驟如下:

? 確保 FMC_CTLx 寄存器不處于鎖定狀態(tài);

? 等待 FMC_STATx 寄存器的 BUSY 位變?yōu)?0;

? 如果單獨(dú)擦除 Bank0,置位 FMC_CTL0 寄存器的 MER 位。如果單獨(dú)擦除 Bank1,置位 FMC_CTL1 寄存器的 MER 位。如果整片擦除閃存,同時(shí)置位 FMC_CTL0 和 FMC_CTL1 寄存器的 MER 位;

? 通過將 FMC_CTLx 寄存器的 START 位置 1 來(lái)發(fā)送整片擦除命令到 FMC;

? 等待擦除指令執(zhí)行完畢, FMC_STATx 寄存器的 BUSY 位清 0;

? 如果需要,使用 DBUS 讀并驗(yàn)證是否擦除成功。

輸入圖片說(shuō)明

字編程操作

FMC 提供了一個(gè) 64 位、32 位整字/16 位半字編程功能,用來(lái)修改主存儲(chǔ)閃存塊內(nèi)容。

編程操作使用各寄存器流程如下。

? 確保 FMC_CTLx 寄存器不處于鎖定狀態(tài);

? 等待 FMC_STATx 寄存器的 BUSY 位變?yōu)?0;

? 置位 FMC_CTLx 寄存器的 PG 位;

? DBUS 寫一個(gè) 32 位整字/16 位半字到目的絕對(duì)地址(0x08XXXXXX);

? 等待編程指令執(zhí)行完畢, FMC_STATx 寄存器的 BUSY 位清 0;

? 如果需要,使用 DBUS 讀并驗(yàn)證是否編程成功。

輸入圖片說(shuō)明

可選字節(jié)塊擦除

FMC 提供了一個(gè)擦除功能用來(lái)初始化閃存中的可選字節(jié)塊。

可選字節(jié)塊擦除過程如下所示。

? 確保 FMC_CTL0 寄存器不處于鎖定狀態(tài);

? 等待 FMC_STAT0 寄存器的 BUSY 位變?yōu)?0;

? 解鎖 FMC_CTL0 寄存器的可選字節(jié)操作位;

? 等待 FMC_CTL0 寄存器的 OBWEN 位置 1;

? 置位 FMC_CTL0 寄存器的 OBER 位;

? 通過將 FMC_CTL0 寄存器的 START 位置 1 來(lái)發(fā)送可選字節(jié)塊擦除命令到 FMC;

? 等待擦除指令執(zhí)行完畢, FMC_STAT 寄存器的 BUSY 位清 0;

? 如果需要,使用 DBUS 讀并驗(yàn)證是否擦除成功。當(dāng)可選字節(jié)塊擦除成功執(zhí)行, FMC_STAT 寄存器的 ENDF 位置位。若 FMC_CTL0 寄存器的 ENDIE 位被置 1, FMC 將觸發(fā)一個(gè)中斷。

可選字節(jié)塊編程

FMC 提供了一個(gè) 32 位整字/16 位半字編程功能,可用來(lái)修改可選字節(jié)塊內(nèi)容??蛇x字節(jié)塊共有8 對(duì)可選字節(jié)。每對(duì)可選字節(jié)的高字節(jié)是低字節(jié)的補(bǔ)。當(dāng)?shù)妥止?jié)被修改時(shí), FMC 自動(dòng)生成該選項(xiàng)字節(jié)的高字節(jié)。

字節(jié)塊編程操作過程如下。

? 確保 FMC_CTL0 寄存器不處于鎖定狀態(tài);

? 等待 FMC_STAT0 寄存器的 BUSY 位變?yōu)?0;

? 解鎖 FMC_CTL0 寄存器的可選字節(jié)操作位;

? 等待 FMC_CTL0 寄存器的 OBWEN 位置 1;

? 置位 FMC_CTL0 寄存器的 OBPG 位;

? DBUS 寫一個(gè) 32 位整字/16 位半字到目的地址;

? 等待編程指令執(zhí)行完畢, FMC_STAT 寄存器的 BUSY 位清 0;

可選字節(jié)塊說(shuō)明

每次系統(tǒng)復(fù)位后,閃存的可選字節(jié)塊被重加載到 FMC_OBSTAT 和 FMC_WP 寄存器,可選字節(jié)生效??蛇x字節(jié)的補(bǔ)字節(jié)具體為可選字節(jié)取反。當(dāng)可選字節(jié)被重裝載時(shí),如果可選字節(jié)的補(bǔ)字節(jié)和可選字節(jié)不匹配, FMC_OBSTAT 寄存器的 OBERR 位將被置 1,可選字節(jié)被強(qiáng)制設(shè)置為 0xFF。若可選字節(jié)和其補(bǔ)字節(jié)同為 0xFF,則 OBERR 位不置位。

頁(yè)擦除/編程保護(hù)

FMC 的頁(yè)擦除/編程保護(hù)功能可以阻止對(duì)閃存的意外操作。當(dāng) FMC 對(duì)被保護(hù)頁(yè)進(jìn)行頁(yè)擦除或編程操作時(shí),操作本身無(wú)效且 FMC_STAT 寄存器的 WPERR 位將被置 1。如果 WPERR 位被置 1 且 FMC_CTL 寄存器的 ERRIE 位也被置 1 來(lái)使能相應(yīng)的中斷, FMC 將觸發(fā)閃存操作出錯(cuò)中斷,等待 CPU 處理。配置可選字節(jié)塊的 WP [31:0]某位為 0 可以單獨(dú)使能某幾頁(yè)的保護(hù)功能。如果在可選字節(jié)塊執(zhí)行了擦除操作,所有的閃存頁(yè)擦除和編程保護(hù)功能都將失效。當(dāng)可選字節(jié)的 WP 被改變時(shí),需要系統(tǒng)復(fù)位使之生效。

12.3.軟件配置說(shuō)明

FMC 以 Program 配置為例來(lái)說(shuō)明

Demo 一 (flash 編程)

demo 功能說(shuō)明: MCU 上電啟動(dòng)后,對(duì) MCU flash 的 0x8004000~ 0x08004800 的 2K 的區(qū)域?qū)?0x01234567 數(shù)據(jù),當(dāng)編寫錯(cuò)誤的時(shí)候,LED 會(huì)亮。

軟件配置步驟如下:

1)配置 led 指示燈;

gd_eval_led_init(LED2); gd_eval_led_init(LED3);

2)進(jìn)行 page erase

void fmc_erase_pages(void) { uint32_t EraseCounter; fmc_unlock(); //FMC 解鎖 fmc_flag_clear(FMC_FLAG_BANK0_END | FMC_FLAG_BANK0_WPERR | FMC_FLAG_BANK0_PGERR ); //清除標(biāo)志 for(EraseCounter = 0; EraseCounter < PageNum; EraseCounter++){ fmc_page_erase(FMC_WRITE_START_ADDR + (FMC_PAGE_SIZE * EraseCounter)); //page 擦除 fmc_flag_clear(FMC_FLAG_BANK0_END | FMC_FLAG_BANK0_WPERR | FMC_FLAG_BANK0_PGERR ); //清除標(biāo)志 } fmc_lock(); //FMC 加鎖 }

  1. page erase 檢查

void fmc_erase_pages_check(void) { uint32_t i; ptrd = (uint32_t *)FMC_WRITE_START_ADDR;//將寫地址賦值指針 for(i = 0; i < WordNum; i++) { if(0xFFFFFFFF != (*ptrd)) //判斷地址是否擦除成功 { lednum = LED2; gd_eval_led_on(lednum); //不成功的時(shí)候 LED2 會(huì)亮 break; }else { ptrd++; // 指針地址++ 再進(jìn)行下一個(gè)地址判斷 } } }

  1. flash 編程

void fmc_program(void) { fmc_unlock(); //FMC 解鎖 address = FMC_WRITE_START_ADDR; while(address < FMC_WRITE_END_ADDR){ fmc_word_program(address, data0); //word 編程 address += 4; fmc_flag_clear(FMC_FLAG_BANK0_END | FMC_FLAG_BANK0_WPERR | FMC_FLAG_BANK0_PGERR );//清除標(biāo)志 } fmc_lock(); //FMC 加鎖 }

  1. 字編程檢查

void fmc_program_check(void) { uint32_t i; ptrd = (uint32_t *)FMC_WRITE_START_ADDR; //將寫地址賦值指針 for(i = 0; i < WordNum; i++) { if((*ptrd) != data0) //判斷寫入的數(shù)據(jù)是否一致 { lednum = LED3; gd_eval_led_on(lednum); //不相等的時(shí)候 LED3 會(huì)亮 break; }else { ptrd++; // 指針地址++ 再進(jìn)行下一個(gè)地址判斷 } } }

12.4.FMC 使用注意事項(xiàng)

(1)操作 flash 之前需要 fmc_unlock();

(2)flash 編程之前需要 page 擦除;

(3)Page erase 和 program 之前需要先清空標(biāo)志位;

(4)避免在 erase 或者 program 過程中出現(xiàn)掉電情況,用 flash 作為 eeprom 來(lái)用時(shí),需要做好數(shù)據(jù)備份;

(5)在擦除 code data flash 過程中,擦除的優(yōu)先級(jí)最高,此時(shí)任何中斷都不響應(yīng)。這時(shí)需要注意 MCU 與外界通訊時(shí),數(shù)據(jù)丟失情況。

教程GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6026

    文章

    44450

    瀏覽量

    630747
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16784

    瀏覽量

    349315
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18904

    瀏覽量

    300692
  • FMC
    FMC
    +關(guān)注

    關(guān)注

    0

    文章

    87

    瀏覽量

    19634
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4833

    瀏覽量

    96819
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GD32 MCU移植

    gd32是一款國(guó)產(chǎn)單片機(jī)。該芯片在很多方面和STM32有異曲同工之處。資料不是很多! GD32外設(shè)方面、和STM32沒有多大區(qū)別。 只是需要注意資源的引腳分配。雖然和STM32使用方式一樣、但是也存在
    發(fā)表于 03-23 13:40

    GD32MCU介紹

    其實(shí)兆芯的MCU為了兼容ST,外設(shè)的寄存器設(shè)計(jì)與ST保持一致了。比如GD32VF103或者GD32E103系列的USBFS這個(gè)外設(shè),基本等同
    發(fā)表于 11-01 06:03

    GD32 MCU原理及固件庫(kù)開發(fā)指南》+讀后感

    、調(diào)試工具,再到庫(kù)函數(shù)的使用、各個(gè)外設(shè)的程序?qū)崿F(xiàn),不僅有原理的介紹,還有實(shí)踐的歷程。這本書聚焦在GD32 MCU基本原理和固件庫(kù)上,重點(diǎn)在于對(duì)固件庫(kù)API的
    發(fā)表于 06-06 21:52

    兆易創(chuàng)新GD32 MCU選型手冊(cè),適用于GD32全系列MCU

    兆易創(chuàng)新GD32MCU選型手冊(cè),適用于GD32全系列MCUGD32MCU選型手冊(cè),適用于GD32全系列MCU
    發(fā)表于 10-19 17:26 ?48次下載

    你了解GD32 MCU的命名規(guī)則嗎

    下面為大家介紹GD32 MCU的通用命名規(guī)則,以GD32F303ZGT6為例,其中,GD32代表GD32
    的頭像 發(fā)表于 01-13 09:38 ?3268次閱讀
    你了解<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b>的命名規(guī)則嗎

    GD32 MCU的選項(xiàng)字節(jié)是什么?

    GD32 MCU的選項(xiàng)字節(jié)是什么,有什么功能呢?選項(xiàng)字節(jié)被誤篡改如何回復(fù)?
    的頭像 發(fā)表于 01-17 09:42 ?1111次閱讀
    <b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b>的選項(xiàng)字節(jié)是什么?

    不同型號(hào)的GD32 MCU如何區(qū)分?

    大家是否碰到過以下應(yīng)用場(chǎng)景:同一套軟件代碼希望跑在不同型號(hào)的GD32 MCU中,但有些地方需要根據(jù)MCU型號(hào)進(jìn)行調(diào)整?或者上位機(jī)或其他MCUGD3
    的頭像 發(fā)表于 01-27 09:32 ?868次閱讀
    不同型號(hào)的<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b>如何區(qū)分?

    GD32 MCU ISP失敗的原因

    玩過GD32的小伙伴們都知道,GD32 MCU支持ISP,即在系統(tǒng)編程,前面的常見問題也給大家講過什么是ISP,什么是IAP?那有沒有小伙伴遇到過ISP失敗的情況,失敗的原因是什么呢?
    的頭像 發(fā)表于 02-28 09:23 ?1298次閱讀
    <b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> ISP失敗的原因

    GD32 MCU 入門教程】一、GD32 MCU 開發(fā)環(huán)境搭建(1)使用Keil開發(fā)GD32

    GD32系列為通用型MCU,所以開發(fā)環(huán)境也可以使用通用型的IDE,目前使用較多的是KEIL、IAR、 GCC和Embedded Builder,客戶可以根據(jù)個(gè)人喜好來(lái)選擇相應(yīng)的開發(fā)環(huán)境。
    的頭像 發(fā)表于 08-08 15:01 ?763次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】一、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 開發(fā)環(huán)境搭建(1)使用Keil開發(fā)<b class='flag-5'>GD32</b>

    GD32 MCU 入門教程】一、GD32 MCU 開發(fā)環(huán)境搭建(2)使用 IAR 開發(fā) GD32

    GD32系列為通用型MCU,所以開發(fā)環(huán)境也可以使用通用型的IDE,目前使用較多的是KEIL、IAR、 GCC和Embedded Builder,客戶可以根據(jù)個(gè)人喜好來(lái)選擇相應(yīng)的開發(fā)環(huán)境。
    的頭像 發(fā)表于 08-08 15:40 ?468次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】一、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 開發(fā)環(huán)境搭建(2)使用 IAR 開發(fā) <b class='flag-5'>GD32</b>

    GD32 MCU 入門教程】一、GD32 MCU 開發(fā)環(huán)境搭建(3)使用 Embedded Builder 開發(fā) GD32

    GD32系列為通用型MCU,所以開發(fā)環(huán)境也可以使用通用型的IDE,目前使用較多的是KEIL、IAR、 GCC和Embedded Builder,客戶可以根據(jù)個(gè)人喜好來(lái)選擇相應(yīng)的開發(fā)環(huán)境。
    的頭像 發(fā)表于 08-08 16:03 ?623次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】一、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 開發(fā)環(huán)境搭建(3)使用 Embedded Builder 開發(fā) <b class='flag-5'>GD32</b>

    GD32 MCU 入門教程】二、GD32 MCU 燒錄說(shuō)明(1)ISP 燒錄

    ISP:In System Programing,在系統(tǒng)編程,通過MCU片內(nèi)的引導(dǎo)程序進(jìn)行Flash編程。 GD32片內(nèi)有一個(gè)只讀信息塊,用于存放引導(dǎo)裝載程序,引導(dǎo)程序在MCU出廠前就會(huì)提前燒錄好
    的頭像 發(fā)表于 08-08 16:20 ?547次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】二、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 燒錄說(shuō)明(1)ISP 燒錄

    GD32 MCU 入門教程GD32 MCU 常見外設(shè)介紹(14)RTC 模塊介紹

    GD32 MCU內(nèi)部提供了一個(gè)RTC(實(shí)時(shí)時(shí)鐘)模塊,通過RTC可以實(shí)現(xiàn)日歷時(shí)鐘、鬧鐘等功能。RTC也可以用于深度睡眠或待機(jī)模式的低功耗喚醒。不同系列的GD32
    的頭像 發(fā)表于 08-23 09:18 ?299次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>常見外設(shè)</b><b class='flag-5'>介紹</b>(14)RTC <b class='flag-5'>模塊</b><b class='flag-5'>介紹</b>

    GD32 MCU 入門教程GD32 MCU FPU 使用方法

    GD32 MCU FPU 使用方法
    的頭像 發(fā)表于 08-25 09:24 ?314次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> FPU 使用方法

    GD32 MCU入門教程GD32 MCU GPIO 結(jié)構(gòu)與使用注意事項(xiàng)

    本文是專門為基于GD32 MCU開發(fā)的工程設(shè)計(jì)人員提供,主要介紹了GPIO的功能配置、內(nèi)部結(jié)構(gòu)以及在不同場(chǎng)景使用時(shí)的注意事項(xiàng),旨在幫助GD32 MC
    的頭像 發(fā)表于 09-07 10:34 ?408次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b><b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> GPIO 結(jié)構(gòu)與使用注意事項(xiàng)