那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

12.1.FMC 基礎知識

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

輸入圖片說明

12.2.FMC 功能

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

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

具有安全保護狀態,可阻止對代碼或數據的非法讀訪問;

相關術語說明

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

大容量產品指 Flash 容量為 256K 至 512K 字節之間的 系列; 超大容量產品指 Flash 容量為 768K 至 3072K 字節之間的系列。

GD32F10X/F30X 系列容量匯總

輸入圖片說明

不同容量工程選擇說明,固件庫是通過宏定義來區分的。

輸入圖片說明

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

輸入圖片說明

讀操作 閃存可以像普通存儲空間一樣直接尋址訪問。對閃存取指令和取數據分別使用 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);

頁擦除

FMC 的頁擦除功能使得主存儲閃存的頁內容初始化為高電平。 每一頁都可以被獨立擦除,而不影響其他頁內容。

FMC 擦除頁步驟如下:

? 確保 FMC_CTLx 寄存器不處于鎖定狀態;

? 檢查 FMC_STATx 寄存器的 BUSY 位來判定閃存是否正處于擦寫訪問狀態,若 BUSY 位為 1,則需等待該操作結束, BUSY 位變為 0;

? 置位 FMC_CTLx 寄存器的 PER 位;

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

? 通過將 FMC_CTLx 寄存器的 START 位置 1 來發送頁擦除命令到 FMC;

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

? 如果需要,使用 DBUS 讀并驗證該頁是否擦除成功。

輸入圖片說明

整片擦除

FMC 提供了整片擦除功能可以初始化主存儲閃存塊的內容。當設置 MER0 為 1 時,擦除過程僅作用于 Bank0,當設置 MER1 為 1 時,擦除過程僅作用于 Bank1,當設置 MER0 和 MER1 為 1 時,擦除過程作用于整片閃存。

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

? 確保 FMC_CTLx 寄存器不處于鎖定狀態;

? 等待 FMC_STATx 寄存器的 BUSY 位變為 0;

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

? 通過將 FMC_CTLx 寄存器的 START 位置 1 來發送整片擦除命令到 FMC;

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

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

輸入圖片說明

字編程操作

FMC 提供了一個 64 位、32 位整字/16 位半字編程功能,用來修改主存儲閃存塊內容。

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

? 確保 FMC_CTLx 寄存器不處于鎖定狀態;

? 等待 FMC_STATx 寄存器的 BUSY 位變為 0;

? 置位 FMC_CTLx 寄存器的 PG 位;

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

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

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

輸入圖片說明

可選字節塊擦除

FMC 提供了一個擦除功能用來初始化閃存中的可選字節塊。

可選字節塊擦除過程如下所示。

? 確保 FMC_CTL0 寄存器不處于鎖定狀態;

? 等待 FMC_STAT0 寄存器的 BUSY 位變為 0;

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

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

? 置位 FMC_CTL0 寄存器的 OBER 位;

? 通過將 FMC_CTL0 寄存器的 START 位置 1 來發送可選字節塊擦除命令到 FMC;

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

? 如果需要,使用 DBUS 讀并驗證是否擦除成功。當可選字節塊擦除成功執行, FMC_STAT 寄存器的 ENDF 位置位。若 FMC_CTL0 寄存器的 ENDIE 位被置 1, FMC 將觸發一個中斷。

可選字節塊編程

FMC 提供了一個 32 位整字/16 位半字編程功能,可用來修改可選字節塊內容。可選字節塊共有8 對可選字節。每對可選字節的高字節是低字節的補。當低字節被修改時, FMC 自動生成該選項字節的高字節。

字節塊編程操作過程如下。

? 確保 FMC_CTL0 寄存器不處于鎖定狀態;

? 等待 FMC_STAT0 寄存器的 BUSY 位變為 0;

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

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

? 置位 FMC_CTL0 寄存器的 OBPG 位;

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

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

可選字節塊說明

每次系統復位后,閃存的可選字節塊被重加載到 FMC_OBSTAT 和 FMC_WP 寄存器,可選字節生效。可選字節的補字節具體為可選字節取反。當可選字節被重裝載時,如果可選字節的補字節和可選字節不匹配, FMC_OBSTAT 寄存器的 OBERR 位將被置 1,可選字節被強制設置為 0xFF。若可選字節和其補字節同為 0xFF,則 OBERR 位不置位。

頁擦除/編程保護

FMC 的頁擦除/編程保護功能可以阻止對閃存的意外操作。當 FMC 對被保護頁進行頁擦除或編程操作時,操作本身無效且 FMC_STAT 寄存器的 WPERR 位將被置 1。如果 WPERR 位被置 1 且 FMC_CTL 寄存器的 ERRIE 位也被置 1 來使能相應的中斷, FMC 將觸發閃存操作出錯中斷,等待 CPU 處理。配置可選字節塊的 WP [31:0]某位為 0 可以單獨使能某幾頁的保護功能。如果在可選字節塊執行了擦除操作,所有的閃存頁擦除和編程保護功能都將失效。當可選字節的 WP 被改變時,需要系統復位使之生效。

12.3.軟件配置說明

FMC 以 Program 配置為例來說明

Demo 一 (flash 編程)

demo 功能說明: MCU 上電啟動后,對 MCU flash 的 0x8004000~ 0x08004800 的 2K 的區域寫 0x01234567 數據,當編寫錯誤的時候,LED 會亮。

軟件配置步驟如下:

1)配置 led 指示燈;

gd_eval_led_init(LED2); gd_eval_led_init(LED3);

2)進行 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 ); //清除標志 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 ); //清除標志 } 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); //不成功的時候 LED2 會亮 break; }else { ptrd++; // 指針地址++ 再進行下一個地址判斷 } } }

  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 );//清除標志 } 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) //判斷寫入的數據是否一致 { lednum = LED3; gd_eval_led_on(lednum); //不相等的時候 LED3 會亮 break; }else { ptrd++; // 指針地址++ 再進行下一個地址判斷 } } }

12.4.FMC 使用注意事項

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

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

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

(4)避免在 erase 或者 program 過程中出現掉電情況,用 flash 作為 eeprom 來用時,需要做好數據備份;

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

教程GD32 MCU方案商聚沃科技原創發布,了解更多GD32 MCU教程,關注聚沃科技官網

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6043

    文章

    44621

    瀏覽量

    638487
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17317

    瀏覽量

    352628
  • 嵌入式
    +關注

    關注

    5092

    文章

    19177

    瀏覽量

    307637
  • FMC
    FMC
    +關注

    關注

    0

    文章

    96

    瀏覽量

    19758
  • 開發板
    +關注

    關注

    25

    文章

    5121

    瀏覽量

    98187
收藏 人收藏

    評論

    相關推薦

    GD32 MCU移植

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

    GD32MCU介紹

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

    GD32 MCU原理及固件庫開發指南》+讀后感

    、調試工具,再到庫函數的使用、各個外設的程序實現,不僅有原理的介紹,還有實踐的歷程。這本書聚焦在GD32 MCU基本原理和固件庫上,重點在于對固件庫API的
    發表于 06-06 21:52

    兆易創新GD32 MCU選型手冊,適用于GD32全系列MCU

    兆易創新GD32MCU選型手冊,適用于GD32全系列MCUGD32MCU選型手冊,適用于GD32全系列MCU
    發表于 10-19 17:26 ?49次下載

    你了解GD32 MCU的命名規則嗎

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

    GD32 MCU的選項字節是什么?

    GD32 MCU的選項字節是什么,有什么功能呢?選項字節被誤篡改如何回復?
    的頭像 發表于 01-17 09:42 ?1499次閱讀
    <b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b>的選項字節是什么?

    不同型號的GD32 MCU如何區分?

    大家是否碰到過以下應用場景:同一套軟件代碼希望跑在不同型號的GD32 MCU中,但有些地方需要根據MCU型號進行調整?或者上位機或其他MCUGD3
    的頭像 發表于 01-27 09:32 ?1063次閱讀
    不同型號的<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b>如何區分?

    GD32 MCU ISP失敗的原因

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

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

    GD32系列為通用型MCU,所以開發環境也可以使用通用型的IDE,目前使用較多的是KEIL、IAR、 GCC和Embedded Builder,客戶可以根據個人喜好來選擇相應的開發環境。
    的頭像 發表于 08-08 15:01 ?1432次閱讀
    【<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> 開發環境搭建(1)使用Keil開發<b class='flag-5'>GD32</b>

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

    GD32系列為通用型MCU,所以開發環境也可以使用通用型的IDE,目前使用較多的是KEIL、IAR、 GCC和Embedded Builder,客戶可以根據個人喜好來選擇相應的開發環境。
    的頭像 發表于 08-08 15:40 ?813次閱讀
    【<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> 開發環境搭建(2)使用 IAR 開發 <b class='flag-5'>GD32</b>

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

    GD32系列為通用型MCU,所以開發環境也可以使用通用型的IDE,目前使用較多的是KEIL、IAR、 GCC和Embedded Builder,客戶可以根據個人喜好來選擇相應的開發環境。
    的頭像 發表于 08-08 16:03 ?1132次閱讀
    【<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> 開發環境搭建(3)使用 Embedded Builder 開發 <b class='flag-5'>GD32</b>

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

    ISP:In System Programing,在系統編程,通過MCU片內的引導程序進行Flash編程。 GD32片內有一個只讀信息塊,用于存放引導裝載程序,引導程序在MCU出廠前就會提前燒錄好
    的頭像 發表于 08-08 16:20 ?1147次閱讀
    【<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> 燒錄說明(1)ISP 燒錄

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

    GD32 MCU內部提供了一個RTC(實時時鐘)模塊,通過RTC可以實現日歷時鐘、鬧鐘等功能。RTC也可以用于深度睡眠或待機模式的低功耗喚醒。不同系列的GD32
    的頭像 發表于 08-23 09:18 ?578次閱讀
    【<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'>常見外設</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 使用方法
    的頭像 發表于 08-25 09:24 ?738次閱讀
    【<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 結構與使用注意事項

    本文是專門為基于GD32 MCU開發的工程設計人員提供,主要介紹了GPIO的功能配置、內部結構以及在不同場景使用時的注意事項,旨在幫助GD32 MC
    的頭像 發表于 09-07 10:34 ?913次閱讀
    【<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 結構與使用注意事項
    网上赌球| 澳门百家乐现场真人版| 太阳城百家乐杀猪吗| 百家乐破解赌戏玩| 大发888娱 太阳城| 蒲城县| 赌场百家乐官网规则| 百家乐官网必知技巧| 澳门百家乐免费开户| 皇城百家乐娱乐城| 红利来| 澳门赌百家乐官网能赢钱吗| 24山吉凶视频| 金都百家乐的玩法技巧和规则 | 波音百家乐官网现金网投注平台排名导航 | 百家乐官网技巧看路| 将军百家乐官网的玩法技巧和规则| 大东方百家乐游戏| 博彩百家乐五2013124预测| 沙龙国际在线| 玩百家乐官网澳门368娱乐城| 马牌百家乐现金网| 大发888娱乐城官方| 百家乐官网实战案例| 玩百家乐官网怎么能赢呢| 至尊百家乐娱乐场开户注册| 38坊| 现金百家乐官网下载| 木棉百家乐的玩法技巧和规则 | 澳门百家乐官网十大缆| 百家乐天天乐娱乐场| 娱乐城申请送奖金| 金城百家乐官网买卖路| 百家乐庄闲排列| 东乡| 网上百家乐的技巧| 宝博娱乐城开户| 百家乐官网外套| 同花顺百家乐娱乐城| 慈溪市| 百家乐优博娱乐城|