日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)篇) 第20章 GD32的存儲結(jié)構(gòu)

發(fā)布者:SparklingRiver最新更新時間:2024-11-04 來源: elecfans關(guān)鍵字:GD32  開發(fā)實(shí)戰(zhàn)  存儲結(jié)構(gòu) 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

開發(fā)環(huán)境:

MDK:Keil 5.30

開發(fā)板:GD32F207I-EVAL

MCU:GD32F207IK


1 GD32存儲結(jié)構(gòu)的工作原理

1.1 Cortex-M內(nèi)核的存儲器映射

存儲器映射是指把芯片中或芯片外的FLASH,RAM,外設(shè),BOOTBLOCK等進(jìn)行統(tǒng)一編址。即用地址來表示對象。這個地址絕大多數(shù)是由廠家規(guī)定好的,用戶只能用而不能改。用戶只能在掛外部RAM或FLASH的情況下可進(jìn)行自定義。

如下圖,是Cortex-M3存儲器映射結(jié)構(gòu)圖。

1684499765582h595y8083z

Cortex-M3是32位的內(nèi)核,因此其PC指針可以指向2^32=4G的地址空間,也就是0x0000_0000 - 0xFFFF_FFFF這一大塊空間。根據(jù)圖中描述,Cortex-M3內(nèi)核將0x0000_0000 - 0xFFFF_FFFF這塊4G大小的空間分成8大塊:代碼、SRAM、外設(shè)、外部RAM、外部設(shè)備、專用外設(shè)總線-內(nèi)部、專用外設(shè)總線-外部、特定廠商等,因此使用該內(nèi)核的設(shè)計者必須按照這個進(jìn)行各自芯片的存儲器結(jié)構(gòu)設(shè)計。

1.2 GD32存儲器結(jié)構(gòu)

首先,我們對比一下Cortex-M3存儲器結(jié)構(gòu)和GD32存儲器結(jié)構(gòu):

C:\\Users\\BruceOu\\Desktop\\11.jpg

圖中可以很清晰的看到,GD32的存儲器結(jié)構(gòu)和Cortex-M3的很相似,不同的是,GD32加入了很多實(shí)際的東西,如:Flash、SRAM等。只有加入了這些東西,才能成為一個擁有實(shí)際意義的、可以工作的處理芯片-GD32。

GD32的存儲器地址空間被劃分為大小相等的8塊區(qū)域,每塊區(qū)域大小為512MB。

對GD32存儲器知識的掌握,實(shí)際上就是對Flash和SRAM這兩個區(qū)域知識的掌握。


2 FLASH讀寫數(shù)據(jù)

2.1 GD32的Flash

GD32的Flash,嚴(yán)格說,應(yīng)該是Flash模塊。該Flash模塊包括:Flash主存儲區(qū)(Main memory)、Flash信息區(qū)(Information block),以及Flash存儲接口寄存器區(qū)(Flash memory interface)。三個組成部分分別在0x0000 0000 - 0xFFFF FFFF不同的區(qū)域,GD32F2的Flash結(jié)構(gòu)如下表所示。

1684499766584ucx37erq24

【注】信息塊存儲了boot loader,不能被用戶編程或擦除。

GD32的閃存模塊由:主存儲閃存塊、信息塊和選項字節(jié)塊3部分組成。

主存儲器 ,該部分用來存放代碼和數(shù)據(jù)常數(shù)(如加const類型的數(shù)據(jù))。對于主存儲閃存容量不多于512KB的GD32F20x_CL,閃存頁大小為2KB。對于主存儲閃存容量不少于768KB的GD32F20x_CL,使用了兩片閃存;前512KB容量在第一片閃存(bank0)中,后續(xù)的容量在第二片閃存(bank1)中。其中bank0的閃存頁大小為2KB, bank1的閃存頁大小為4KB。主存儲閃存的每頁都可以單獨(dú)擦除。

__信息__塊,是用來存儲GD自帶的啟動程序,用于串口下載,當(dāng)B0接3.3V,B1接GND時,運(yùn)行的就這部分代碼,用戶選擇字節(jié),則一般用于配置保護(hù)等功能。

選項字節(jié)塊 ,該部分用于控制閃存儲器讀取等,是整個閃存儲器的控制機(jī)構(gòu)。

對于主存儲器和信息塊的寫入有內(nèi)嵌的閃存編程管理;編程與擦除的高壓由內(nèi)部產(chǎn)生。

在執(zhí)行閃存寫操作時,任何對閃存的讀操作都會鎖定總線,在寫完成后才能正確進(jìn)行,在進(jìn)行讀取或擦除操作時,不能進(jìn)行代碼或者數(shù)據(jù)的讀取操作。

下面對GD32的存儲器進(jìn)行總結(jié)。

C:\\Users\\ouxiaolong\\Desktop\\zaszddf.jpg

圖中淡藍(lán)色就是你需要知道的。

  • Peripherals:外設(shè)的存儲器映射,對該區(qū)域操作,就是對相應(yīng)的外設(shè)進(jìn)行操作;

  • SRAM:運(yùn)行時臨時存放代碼的地方;

  • Flash:存放代碼的地方;

  • System Memory:GD32出廠時自帶的你只能使用,不能寫或擦除;

  • Option Bytes:可以按照用戶的需要進(jìn)行配置(如配置看門狗為硬件實(shí)現(xiàn)還是軟件實(shí)現(xiàn));

今后,你的編寫代碼、程序運(yùn)行、寄存器設(shè)置、ICP、IAP都依靠這些東西。


2.2 FLASH讀寫實(shí)現(xiàn)

GD32F20x 系列產(chǎn)品的片上 Flash 起始地址時 0x0800 0000,最大容量可達(dá) 3072 KB。讀操作為 0 等待,可支持字節(jié)、半字(16 bits)和字(32 bits)訪問。 Flash 編程以半字(16 bits)或字(32bits)為單位。擦除可以以頁(page)為單位,也可以進(jìn)行全片擦除(information blocks 除外)。

Flash的寄存器有很多,當(dāng)時GD的工程師已經(jīng)封裝好了,直接用就可以,我這里就不在貼出來了。

Flash操作很簡單,我們將數(shù)據(jù)寫入到Flash中,再將其讀出來。主要有以下步驟:

1.Flash解鎖操作

2.清除Flash標(biāo)志

3.頁擦除

4.讀寫操作

5.鎖定

核心代碼如下:

#define FLASH_ADR 0x0807F800


/**

  * @brief  flash test

  * @param  WriteAddr, InData

  * @retval OutData

  */

uint32_t flash_test(uint32_t WriteAddr, uint32_t InData)

{

    uint32_t OutData = 0;


    //解鎖

    fmc_unlock();

    //清除標(biāo)志位

    fmc_flag_clear(FMC_FLAG_BANK0_PGERR | FMC_FLAG_BANK0_WPERR | FMC_FLAG_BANK0_END | FMC_FLAG_BANK1_PGERR | FMC_FLAG_BANK1_WPERR | 

    FMC_FLAG_BANK1_END);

    //要擦出頁的起始地址

    fmc_page_erase(WriteAddr);

    //寫數(shù)據(jù)

    fmc_word_program(WriteAddr, InData);


    //鎖定

    fmc_lock();


    OutData=(*(__IO uint32_t*)(WriteAddr));

    return OutData;

}

程序就不講了,這里需要注意一個C語言的知識點(diǎn)。


OutData=(*(__IO uint32_t*)(WriteAddr));


這一句很多新手很懵逼,也就是從一個地址中讀取數(shù)據(jù),多看看指針相關(guān)的知識就好理解了。

主函數(shù)如下:

/*

    brief      main function

    param[in]  none

    param[out] none

    retval     none

*/

int main(void)

{

    uint32_t InData = 12345678;

    uint32_t OutData;


    // systick init

    sysTick_init();


    //usart init 115200 8-N-1

    com_init(COM1, 115200, 0, 1);


    // led1 init

    led_init(LED1);


    printf('InData = %d\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n',InData);


    // flash test

    OutData= flash_test(FLASH_ADR, InData);


    printf('OutData = %d\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n',OutData);


    if(OutData == InData)

    {

        printf('Flash test success !\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n');

    }

    else

    {

        printf('Flash test fail !\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n');

    }

    while(1)

    {

        led_on(LED1);   // 亮

        delay_ms(1000);

        led_off(LED1);   // 滅 

        delay_ms(1000);

    }

}


2.3 實(shí)驗結(jié)果

將程序邊看一完成后下載到板子中,通過串口助手,按下板子的復(fù)位按鍵可以看到如下現(xiàn)象。

168449976724761wuxzkxp2

3 SRAM啟動

3.1 GD32的啟動模式

首先要回顧一下GD32的啟動模式,因為啟動模式?jīng)Q定了向量表的位置,GD32有三種啟動模式:

1)主閃存存儲器(Main Flash)啟動:從GD32內(nèi)置的Flash啟動(0x0800 0000-0x0807 FFFF),一般我們使用JTAG或者SWD模式下載程序時,就是下載到這個里面,重啟后也直接從這啟動程序。以0x08000000 對應(yīng)的內(nèi)存為例,則該塊內(nèi)存既可以通過0x00000000 操作也可以通過0x08000000 操作,且都是操作的同一塊內(nèi)存。

2)系統(tǒng)存儲器(System Memory)啟動:從系統(tǒng)存儲器啟動(0x1FFFF000 - 0x1FFF F7FF),這種模式啟動的程序功能是由廠家設(shè)置的。一般來說,我們選用這種啟動模式時,是為了從串口下載程序,因為在廠家提供的ISP程序中,提供了串口下載程序的固件,可以通過這個ISP程序?qū)⒂脩舫绦蛳螺d到系統(tǒng)的Flash中。以0x1FFFFFF0對應(yīng)的內(nèi)存為例,則該塊內(nèi)存既可以通過0x00000000 操作也可以通過0x1FFFFFF0操作,且都是操作的同一塊內(nèi)存。

3)片上SRAM啟動:從內(nèi)置SRAM啟動(0x2000 0000-0x3FFFFFFF),既然是SRAM,自然也就沒有程序存儲的能力了,這個模式一般用于程序調(diào)試。SRAM 只能通過0x20000000進(jìn)行操作,與上述兩者不同。從SRAM 啟動時,需要在應(yīng)用程序初始化代碼中重新設(shè)置向量表的位置。

用戶可以通過設(shè)置BOOT0和BOOT1的引腳電平狀態(tài),來選擇復(fù)位后的啟動模式。如下圖所示:

16844997675999ih3hfv9z9

啟動模式只決定程序燒錄的位置 ,加載完程序之后會有一個重映射(映射到0x00000000地址位置);真正產(chǎn)生復(fù)位信號的時候,CPU還是從開始位置執(zhí)行。

值得注意的是GD32上電復(fù)位以后,代碼區(qū)都是從0x00000000開始的,三種啟動模式只是將各自存儲空間的地址映射到0x00000000中。

3.2 GD32的SRAM

不同類型的Cortex-M單片機(jī)的SRAM大小是不一樣的,但是他們的起始地址都是0x2000 0000,終止地址都是0x2000 0000+其固定的容量大小。

SRAM的理解比較簡單,其作用是用來存取各種動態(tài)的輸入輸出數(shù)據(jù)、中間計算結(jié)果以及與外部存儲器交換的數(shù)據(jù)和暫存數(shù)據(jù)。設(shè)備斷電后,SRAM中存儲的數(shù)據(jù)就會丟失。

GD32F20x 系列產(chǎn)品的片上 SRAM 起始地址是 0x2000 0000,最大容量可達(dá) 384KB,可支持字節(jié)、半字(16bits)和字(32bits)訪問。 片上 SRAM 被分為 SRAM0、 SRAM1 和 SRAM2 等三個模塊,且每個模塊都有一個與 AHB 總線矩陣連接的專用接口,這意味著它們可以被同時訪問。

模塊容量地址范圍
SRAM1112KB0x2000 0000 ~
0x2001 BFFF

SRAM216KB0x2001 C000 ~
0x2001 FFFF

SRAM3256KB0x2002 0000 ~
0x2005 FFFF

3.3 片上SRAM啟動實(shí)現(xiàn)

在使用片上SRAM調(diào)試之前,需要了解為何要使用片上SARM來啟動程序,因此GD32的片上Flash的擦寫次數(shù)有限,若超過最大擦除次數(shù)則會損壞內(nèi)部Flash,因此在平時的程序調(diào)試階段,最好使用SRAM啟動。

總的來說,SRAM啟動程序有如下用途:

1.調(diào)試階段,需要頻繁更新程序,可以SRAM啟動,加快調(diào)試,減少flash擦寫損耗

2.程序SWD/JTAG接口已經(jīng)配置為普通端口,程序啟動后無法程序更新,可在SRAM中啟動后,再更新flash程序

3.程序已經(jīng)開啟了讀保護(hù),可在SRAM啟動后,進(jìn)行讀保護(hù)關(guān)閉

片上SRAM啟動實(shí)現(xiàn)的方法很簡單,這里以GDF207+Keil5舉例,實(shí)現(xiàn)方法如下:

1.修改內(nèi)存分配

修改了內(nèi)存分配,也就是修改分散加載文件xxx.sct文件。

16844997678613pbroii5be

修改后再次生成工程,分散文件也會修改。

1684499768136mcxb3il87a

下面談?wù)凷RAM參數(shù)的分配,首先確定MCU的RAM大小,筆者使用的MCU是GD32F207,因此SRAM大小是256KB,然后還需要根據(jù)程序的編譯大小來分配SRAM空間。

1684499768519imq0kzsipv

如果想方便點(diǎn)可以直接看MAP文件。

16844997687846pfdozcr9u

FLASH和RAM的大小分別如下:

Flash = Code + RO Data + RW Data = 3.88KB(3968)

RAM = RW-data + ZI-data=8.07KB(8264)

因此筆者這里分配空間如下:

IROM1地址為0x2000 0000, 大小是0x10000=65536=64kB

IRAM1地址為0x2000 3000, 大小是0x20000=131072=128kB

當(dāng)然啦,SRAM空間分配需要根據(jù)自己的 MCU來決定。

2.修改debug配置

新建RAM.ini文件,配置如下:

/*----------------------------------------------------------------------------

 * Name:    RAM.ini

 * Purpose: RAM Debug Initialization File

 * Note(s):

 *----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------

  Setup()  configure PC & SP for RAM Debug

 *----------------------------------------------------------------------------*/

FUNC void Setup (void) {

  SP = _RDWORD(0x20000000);          // Setup Stack Pointer

  PC = _RDWORD(0x20000004);          // Setup Program Counter

  _WDWORD(0xE000ED08, 0x20000000);   // Setup Vector Table Offset Register

}


FUNC void OnResetExec (void)  {      // executes upon software RESET

  Setup();                           // Setup for Running

}


load %L incremental


Setup();                             // Setup for Running


g, main


然后加載進(jìn)來。

168449976904471crcriy6z

RAM.ini文件主要是初始化SP和PC指針。Cortex-M3復(fù)位時會從0x00000000和0x00000004的相對位置取出MSP初值以及將復(fù)位向量地址賦給PC,在SRAM中的絕對位置就是0x20000000和0x20000004。GD32F207需要手動配置。

C:\\Users\\BruceOu\\Desktop\\1.png

3.修改下載配置

需要把程序下載到SRAM,修改相應(yīng)的下載地址。

1684499769605bhv2p1ahoz

4.修改中斷向量表指針

由啟動文件可知,程序啟動首先執(zhí)行Reset_Handler函數(shù),SRAM啟動硬件強(qiáng)制將PC指針賦值為0x200001E0,PC指針加1開始執(zhí)行啟動文件,故Reset_Handler函數(shù)的運(yùn)行地址需為0x200001E1才行,否則程序就會跑飛。

因此需要在中斷向量表的末尾添加SPACE 0x96。

1684499769910zngknxcfmo

同時在在main函數(shù)中添加設(shè)置中斷向量表以及系統(tǒng)初化函數(shù)。

nvic_vector_table_set(NVIC_VECTTAB_RAM,0x00);

SystemInit();

5.修改啟動模式

這里選擇SRAM啟動,因此BOOT0->1 BOOT1->1。

最后編譯下載程序,然后就可以運(yùn)行程序了。

1684499770201dea23o8tko


關(guān)鍵字:GD32  開發(fā)實(shí)戰(zhàn)  存儲結(jié)構(gòu) 引用地址:GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)篇) 第20章 GD32的存儲結(jié)構(gòu)

上一篇:GD32 ADC內(nèi)部通道采樣異常原因
下一篇:【GD32 MCU 入門教程】GD32 MCU 常見外設(shè)介紹 (6) ADC 模塊介紹

推薦閱讀最新更新時間:2025-07-11 00:46

GD32 MCU進(jìn)入低功耗模式導(dǎo)致無法再進(jìn)行程序下載怎么辦?
很多朋友在調(diào)試GD32 MCU的低功耗模式時會遇到一個問題:程序中讓MCU進(jìn)入了Sleep、Deepsleep或者Standby模式,之后MCU就無法再下載程序了。這是因為在低功耗模式下,MCU的SW口和JTAG口是無法訪問的。比如下面的程序就會導(dǎo)致該問題發(fā)生: 該main函數(shù)中第一步是打開PMU時鐘,然后馬上讓MCU進(jìn)入Deepsleep模式,當(dāng)你想要再次下載程序時,IDE會有如下錯誤提示(不同IDE報錯不同): 遇到這種情況怎么辦呢?難道只能重新?lián)Q一顆芯片了?不不不,其實(shí)有方法解決這個問題的。 方法一: GD32 MCU的啟動模式根據(jù)芯片上的BOOT0和BOOT1腳是可以選擇三種模式: 一般情況下,BOOT0需
[單片機(jī)]
<font color='red'>GD32</font> MCU進(jìn)入低功耗模式導(dǎo)致無法再進(jìn)行程序下載怎么辦?
gd32的全系列芯片有哪些?
近年來,在嵌入式市場不斷發(fā)展的背景下,越來越多的芯片公司開始進(jìn)入嵌入式領(lǐng)域,并推出了一系列嵌入式芯片產(chǎn)品。而***廠商嘉應(yīng)(Gray-Chip)的GD32系列芯片就是其中的一員,采用了ARM Cortex-M3內(nèi)核,并且整個系列不斷擴(kuò)充中。 那么,GD32系列芯片究竟都有哪些呢?下面我們就來一一介紹。 1、GD32F107系列芯片 GD32F107系列芯片是嘉應(yīng)的第一代Cortex-M3內(nèi)核MCU,也是嘉應(yīng)MCU家族中最基礎(chǔ)的一款芯片。目前主要是應(yīng)用在家用電器、醫(yī)療設(shè)備、工控儀器和儀表設(shè)備、車載娛樂等領(lǐng)域。 2、GD32F103系列芯片 GD32F103系列芯片和STM32F103系列芯片外形是一樣的,但是嘉應(yīng)的芯片在價格上相對更
[單片機(jī)]
都是32位MCU,ESP32、GD32、STM32有什么區(qū)別
01 三款MCU簡介 STM32:意法半導(dǎo)體在 2007 年 6 月 11 日發(fā)布的產(chǎn)品,32位單片機(jī)(不多介紹了,懂得都懂)。 GD32:兆易創(chuàng)新 2013 年發(fā)布的產(chǎn)品,在芯片開發(fā)、配置、命名上基本模仿 STM32,甚至 GPIO 和 STM32 都是 pin to pin 的,封裝不改焊上去直接用。有時候 STM32 的源碼不修改,重新編譯燒寫到 GD32 上就可以跑。當(dāng)然也有很多不同,比如串口驅(qū)動、USB 、庫文件等。 ESP32:樂鑫公司 2017 年開發(fā)的產(chǎn)品,和 STM32、GD32 不同,ESP32 主要面向物聯(lián)網(wǎng)領(lǐng)域,支持功能很多,但引出 GPIO pin 腳很少,因此大多數(shù) GPIO 都有很多復(fù)用功能。出廠
[單片機(jī)]
都是32位MCU,ESP32、<font color='red'>GD32</font>、STM32有什么區(qū)別
GD32 MCU 榮獲 Embedded Award 2020 最佳硬件產(chǎn)品大獎
兆易創(chuàng)新GD32 MCU于德國紐倫堡參加了今年首個國際頂級展會—Embedded World 2020,GD32VF103系列RISC-V內(nèi)核MCU在硬件領(lǐng)域提名中脫穎而出并贏得冠軍,一舉捧得年度全場唯一的最佳硬件產(chǎn)品大獎! 兆易創(chuàng)新 GD32 MCU是中國高性能32位通用微控制器市場的領(lǐng)跑者,中國最大的Arm? Cortex?-M MCU家族,7年來先后推出了中國第一個Arm? Cortex?-M3、 Cortex?-M4、 Cortex?-M23內(nèi)核通用MCU產(chǎn)品系列以及全球第一個開源指令集架構(gòu)RISC-V內(nèi)核32位通用MCU產(chǎn)品,并同步為全球用戶提供專業(yè)靈活的技術(shù)支持與交付服務(wù)。 紐倫堡Embedded Worl
[嵌入式]
<font color='red'>GD32</font> MCU 榮獲 Embedded Award 2020 最佳硬件產(chǎn)品大獎
兆易創(chuàng)新推出GD32G5系列Cortex?-M33內(nèi)核高性能MCU,全面激發(fā)工業(yè)應(yīng)用創(chuàng)新活力
中國北京(2024年11月13日)—— 業(yè)界領(lǐng)先的半導(dǎo)體器件供應(yīng)商兆易創(chuàng)新GigaDevice(股票代碼 603986)宣布,正式推出基于Arm? Cortex?-M33內(nèi)核的GD32G5系列高性能微控制器。 GD32G5系列MCU憑借出色的處理性能、豐富多樣的數(shù)字模擬接口資源以及強(qiáng)化的安全性能,可廣泛適用于數(shù)字電源、充電樁、儲能逆變、變頻器、伺服電機(jī)、光通信等多元化場景。該系列全新產(chǎn)品組合提供LQFP、QFN、WLCSP等7種封裝共14個型號,現(xiàn)已開放樣片和開發(fā)板卡申請,12月起正式量產(chǎn)供貨。 GD32G5系列Cortex?-M33內(nèi)核高性能MCU 強(qiáng)勁性能賦能工業(yè)市場 GD32G5系列MCU采用Arm? C
[嵌入式]
兆易創(chuàng)新推出GD32G5系列Cortex?-M33內(nèi)核高性能MCU,全面激發(fā)工業(yè)應(yīng)用創(chuàng)新活力
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved