精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

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

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

12.1.FMC 基礎(chǔ)知識

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

輸入圖片說明

12.2.FMC 功能

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

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

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

相關(guān)術(shù)語說明

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

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

GD32F10X/F30X 系列容量匯總

輸入圖片說明

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

輸入圖片說明

不同的系列 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 匯總

輸入圖片說明

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

頁擦除

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

FMC 擦除頁步驟如下:

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

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

? 置位 FMC_CTLx 寄存器的 PER 位;

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

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

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

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

輸入圖片說明

整片擦除

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

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

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

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

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

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

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

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

輸入圖片說明

字編程操作

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

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

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

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

? 置位 FMC_CTLx 寄存器的 PG 位;

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

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

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

輸入圖片說明

可選字節(jié)塊擦除

FMC 提供了一個擦除功能用來初始化閃存中的可選字節(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 來發(fā)送可選字節(jié)塊擦除命令到 FMC;

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

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

可選字節(jié)塊編程

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

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

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

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

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

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

? 置位 FMC_CTL0 寄存器的 OBPG 位;

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

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

可選字節(jié)塊說明

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

頁擦除/編程保護

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

12.3.軟件配置說明

FMC 以 Program 配置為例來說明

Demo 一 (flash 編程)

demo 功能說明: MCU 上電啟動后,對 MCU flash 的 0x8004000~ 0x08004800 的 2K 的區(qū)域?qū)?0x01234567 數(shù)據(jù),當編寫錯誤的時候,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) //判斷寫入的數(shù)據(jù)是否一致 { 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 過程中出現(xiàn)掉電情況,用 flash 作為 eeprom 來用時,需要做好數(shù)據(jù)備份;

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

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

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

    關(guān)注

    6017

    文章

    44269

    瀏覽量

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

    關(guān)注

    146

    文章

    16520

    瀏覽量

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

    關(guān)注

    5031

    文章

    18683

    瀏覽量

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

    關(guān)注

    0

    文章

    83

    瀏覽量

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

    關(guān)注

    25

    文章

    4704

    瀏覽量

    95749
收藏 人收藏

    評論

    相關(guān)推薦

    GD32 MCU移植

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

    GD32MCU介紹

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

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

    GD32 MCU原理固件庫開發(fā)指南這本書內(nèi)容豐富,囊括了GD32中的所有外設(shè),書中首先介紹了如何使用MDK或IAR軟件搭建
    發(fā)表于 03-31 22:11

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

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

    推出采用GD32 RISC-V的MCU

    推出采用GD32 RISC-V的MCU ppt分享
    發(fā)表于 07-14 17:15 ?0次下載

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

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

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

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

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

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

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

    大家是否碰到過以下應(yīng)用場景:同一套軟件代碼希望跑在不同型號的GD32 MCU中,但有些地方需要根據(jù)MCU型號進行調(diào)整?或者上位機或其他MCUGD3
    的頭像 發(fā)表于 01-27 09:32 ?708次閱讀
    不同型號的<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 ?1078次閱讀
    <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ù)個人喜好來選擇相應(yīng)的開發(fā)環(huán)境。
    的頭像 發(fā)表于 08-08 15:01 ?291次閱讀
    【<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ù)個人喜好來選擇相應(yīng)的開發(fā)環(huán)境。
    的頭像 發(fā)表于 08-08 15:40 ?171次閱讀
    【<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ù)個人喜好來選擇相應(yīng)的開發(fā)環(huán)境。
    的頭像 發(fā)表于 08-08 16:03 ?312次閱讀
    【<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 燒錄說明(1)ISP 燒錄

    ISP:In System Programing,在系統(tǒng)編程,通過MCU片內(nèi)的引導程序進行Flash編程。 GD32片內(nèi)有一個只讀信息塊,用于存放引導裝載程序,引導程序在MCU出廠前就會提前燒錄好
    的頭像 發(fā)表于 08-08 16:20 ?218次閱讀
    【<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 常見外設(shè)介紹(14)RTC 模塊介紹

    GD32 MCU內(nèi)部提供了一個RTC(實時時鐘)模塊,通過RTC可以實現(xiàn)日歷時鐘、鬧鐘等功能。RTC也可以用于深度睡眠或待機模式的低功耗喚醒。不同系列的GD32
    的頭像 發(fā)表于 08-23 09:18 ?56次閱讀
    【<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>