RM新时代网站-首页

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

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

3天內不再提示

GD32開發(fā)實戰(zhàn)指南(基礎篇) 第20章 GD32的存儲結構

嵌入式大雜燴 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2023-06-03 09:12 ? 次閱讀

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

MDK:Keil 5.30

開發(fā)板:GD32F207I-EVAL

MCU:GD32F207IK

1 GD32存儲結構的工作原理

1.1 Cortex-M內核的存儲器映射

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

如下圖,是Cortex-M3存儲器映射結構圖。

1684499765582h595y8083z

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

1.2 GD32存儲器結構

首先,我們對比一下Cortex-M3存儲器結構和GD32存儲器結構:

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

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

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

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

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

2.1 GD32的Flash

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

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。主存儲閃存的每頁都可以單獨擦除。

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

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

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

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

下面對GD32的存儲器進行總結。

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

圖中淡藍色就是你需要知道的。

  • Peripherals:外設的存儲器映射,對該區(qū)域操作,就是對相應的外設進行操作;
  • SRAM:運行時臨時存放代碼的地方;
  • Flash:存放代碼的地方;
  • System Memory:GD32出廠時自帶的你只能使用,不能寫或擦除;
  • Option Bytes:可以按照用戶的需要進行配置(如配置看門狗硬件實現(xiàn)還是軟件實現(xiàn));

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

2.2 FLASH讀寫實現(xiàn)

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

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

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

1.Flash解鎖操作

2.清除Flash標志

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();
    //清除標志位
    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語言的知識點。

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

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

主函數(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 實驗結果

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

168449976724761wuxzkxp2

3 SRAM啟動

3.1 GD32的啟動模式

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

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

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

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

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

16844997675999ih3hfv9z9

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

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

3.2 GD32的SRAM

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

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

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

模塊 容量 地址范圍
SRAM1 112KB 0x2000 0000 ~
0x2001 BFFF
SRAM2 16KB 0x2001 C000 ~
0x2001 FFFF
SRAM3 256KB 0x2002 0000 ~
0x2005 FFFF

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

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

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

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

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

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

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

1.修改內存分配

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

16844997678613pbroii5be

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

1684499768136mcxb3il87a

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

1684499768519imq0kzsipv

如果想方便點可以直接看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

當然啦,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

然后加載進來。

168449976904471crcriy6z

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

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

3.修改下載配置

需要把程序下載到SRAM,修改相應的下載地址。

1684499769605bhv2p1ahoz

4.修改中斷向量表指針

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

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

1684499769910zngknxcfmo

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

nvic_vector_table_set(NVIC_VECTTAB_RAM,0x00);

SystemInit();

5.修改啟動模式

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

最后編譯下載程序,然后就可以運行程序了。

1684499770201dea23o8tko

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

    關注

    10

    文章

    1633

    瀏覽量

    147939
  • 存儲器
    +關注

    關注

    38

    文章

    7484

    瀏覽量

    163760
  • RAM
    RAM
    +關注

    關注

    8

    文章

    1368

    瀏覽量

    114640
  • Cortex-M
    +關注

    關注

    2

    文章

    229

    瀏覽量

    29752
  • GD32
    +關注

    關注

    7

    文章

    403

    瀏覽量

    24326
收藏 人收藏

    評論

    相關推薦

    GD32開發(fā)實戰(zhàn)指南(基礎) 14 內部溫度傳感器

    GD32 有一個內部的溫度傳感器,可以用來測量 CPU 及周圍的溫度(TA)。該溫度傳感器在內部和 ADCx_IN16 輸入通道相連接,此通道把傳感器輸出的電壓轉換成數(shù)字值。溫度傳感器模擬輸入
    的頭像 發(fā)表于 05-17 08:58 ?5335次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實戰(zhàn)</b><b class='flag-5'>指南</b>(基礎<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>14<b class='flag-5'>章</b> 內部溫度傳感器

    GD32開發(fā)實戰(zhàn)指南(基礎) 16 RTC

    開發(fā)環(huán)境: MDK:Keil 5.30 開發(fā)板:GD32F207I-EVAL MCU:GD32F207IK 1 RTC工作原理 1.1 RTC簡介
    的頭像 發(fā)表于 05-18 22:14 ?7151次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實戰(zhàn)</b><b class='flag-5'>指南</b>(基礎<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>16<b class='flag-5'>章</b> RTC

    GD32和STM32有哪些不同的地方

    一、前言GD32是國內開發(fā)的一款單片機,據(jù)說開發(fā)的人員是來自ST公司的,GD32也是以STM32作為模板做出來的。所以GD32和STM32有
    發(fā)表于 08-09 07:03

    什么是GD32

    一、前言什么GD32?GD32是國內開發(fā)的一款單片機,據(jù)說開發(fā)的人員是來自ST公司的,GD32也是以STM32作為模板做出來的。所以
    發(fā)表于 08-12 07:46

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

    。 2介紹GD32 MCU快速入門與開發(fā)平臺搭建的方法,包括對軟硬件開發(fā)平臺、調試工具、GD32
    發(fā)表于 06-06 21:52

    GD32和STM32的區(qū)別

    一、前言GD32是國內開發(fā)的一款單片機,據(jù)說開發(fā)的人員是來自ST公司的,GD32也是以STM32作為模板做出來的。所以GD32和STM32有
    發(fā)表于 11-18 20:51 ?47次下載
    <b class='flag-5'>GD32</b>和STM32的區(qū)別

    GD32移植到STM32開發(fā)平臺

    GD32移植到STM32開發(fā)平臺
    發(fā)表于 12-02 14:51 ?28次下載
    <b class='flag-5'>GD32</b>移植到STM32<b class='flag-5'>開發(fā)</b>平臺

    GD32選型手冊

    GD32選型手冊
    發(fā)表于 06-17 14:49 ?67次下載

    STM32、GD32、ESP32的區(qū)別

    GD32 是國產(chǎn)單片機,據(jù)說開發(fā)人員來自ST公司,GD32 也是以 STM32 作為模板做出來的。所以 GD32 和 STM32 有很多地方都是一樣的,不過
    的頭像 發(fā)表于 04-12 09:51 ?3069次閱讀

    GD32開發(fā)實戰(zhàn)指南(基礎) 19 程序加密

    GD32通過讀取芯片唯一ID號來實現(xiàn)程序的保護,防止被抄襲。96位的產(chǎn)品唯一身份標識所提供的參考號碼對任意一個GD32微控制器
    的頭像 發(fā)表于 05-20 09:10 ?4139次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實戰(zhàn)</b><b class='flag-5'>指南</b>(基礎<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>19<b class='flag-5'>章</b> 程序加密

    GD32和AT32哪個好?

    GD32和AT32哪個好? GD32和AT32是兩種不同的微控制器型號,它們都是國內開發(fā)的芯片。GD32系列由國內芯片制造商GigaDevice Semiconductor
    的頭像 發(fā)表于 08-16 11:32 ?2439次閱讀

    GD32與STM32兼容嗎?

    GD32與STM32兼容嗎? GD32與STM32是兩個不同的微控制器系列,是由兩個不同的公司設計和生產(chǎn)的。GD32系列是由國內的長沙國芯微電子設計和生產(chǎn)的,而STM32系列則是由歐洲
    的頭像 發(fā)表于 08-16 11:32 ?2911次閱讀

    STM32與GD32橫向對比區(qū)別

    GD32 是國產(chǎn)單片機,據(jù)說開發(fā)人員來自ST公司,GD32 也是以 STM32 作為模板做出來的。所以 GD32 和 STM32 有很多地方都是一樣的
    的頭像 發(fā)表于 09-13 11:47 ?3619次閱讀
    STM32與<b class='flag-5'>GD32</b>橫向對比區(qū)別

    GD32如何替換STM32?

    GD32如何替換STM32?
    的頭像 發(fā)表于 09-18 10:58 ?2207次閱讀
    <b class='flag-5'>GD32</b>如何替換STM32?

    GD32 MCU入門教程】GD32 MCU GPIO 結構與使用注意事項

    本文是專門為基于GD32 MCU開發(fā)的工程設計人員提供,主要介紹了GPIO的功能配置、內部結構以及在不同場景使用時的注意事項,旨在幫助GD32 MCU
    的頭像 發(fā)表于 09-07 10:34 ?719次閱讀
    【<b class='flag-5'>GD32</b> MCU入門教程】<b class='flag-5'>GD32</b> MCU GPIO <b class='flag-5'>結構</b>與使用注意事項
    RM新时代网站-首页