在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

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

開發環境:

MDK:Keil 5.30

開發板:GD32F207I-EVAL

MCU:GD32F207IK

1 GD32存儲結構的工作原理

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

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

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

1684499765582h595y8083z

Cortex-M3是32位的內核,因此其PC指針可以指向2^32=4G的地址空間,也就是0x0000_0000 - 0xFFFF_FFFF這一大塊空間。根據圖中描述,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塊區域,每塊區域大小為512MB。

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

2 FLASH讀寫數據

2.1 GD32的Flash

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

1684499766584ucx37erq24

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

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

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

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

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

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

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

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

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

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

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

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

2.2 FLASH讀寫實現

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

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

Flash操作很簡單,我們將數據寫入到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);
    //寫數據
    fmc_word_program(WriteAddr, InData);

    //鎖定
    fmc_lock();

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

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

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

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

主函數如下:

/*
    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 實驗結果

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

168449976724761wuxzkxp2

3 SRAM啟動

3.1 GD32的啟動模式

首先要回顧一下GD32的啟動模式,因為啟動模式決定了向量表的位置,GD32有三種啟動模式:

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

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

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

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

16844997675999ih3hfv9z9

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

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

3.2 GD32的SRAM

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

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

GD32F20x 系列產品的片上 SRAM 起始地址是 0x2000 0000,最大容量可達 384KB,可支持字節、半字(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啟動實現

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

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

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

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

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

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

1.修改內存分配

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

16844997678613pbroii5be

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

1684499768136mcxb3il87a

下面談談SRAM參數的分配,首先確定MCU的RAM大小,筆者使用的MCU是GD32F207,因此SRAM大小是256KB,然后還需要根據程序的編譯大小來分配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空間分配需要根據自己的 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.修改中斷向量表指針

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

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

1684499769910zngknxcfmo

同時在在main函數中添加設置中斷向量表以及系統初化函數。

nvic_vector_table_set(NVIC_VECTTAB_RAM,0x00);

SystemInit();

5.修改啟動模式

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

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

1684499770201dea23o8tko

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

    關注

    10

    文章

    1635

    瀏覽量

    148017
  • 存儲器
    +關注

    關注

    38

    文章

    7492

    瀏覽量

    163829
  • RAM
    RAM
    +關注

    關注

    8

    文章

    1368

    瀏覽量

    114682
  • Cortex-M
    +關注

    關注

    2

    文章

    229

    瀏覽量

    29761
  • GD32
    +關注

    關注

    7

    文章

    403

    瀏覽量

    24351
收藏 人收藏

    評論

    相關推薦

    GD32開發實戰指南(基礎) 14 內部溫度傳感器

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

    GD32開發實戰指南(基礎) 16 RTC

    開發環境: MDK:Keil 5.30 開發板:GD32F207I-EVAL MCU:GD32F207IK 1 RTC工作原理 1.1 RTC簡介
    的頭像 發表于 05-18 22:14 ?7180次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發</b><b class='flag-5'>實戰</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是國內開發的一款單片機,據說開發的人員是來自ST公司的,GD32也是以STM32作為模板做出來的。所以GD32和STM32有
    發表于 08-09 07:03

    什么是GD32

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

    GD32可以替換STM32嗎

    什么是GD32GD32與STM32的區別在哪?GD32可以替換STM32嗎?
    發表于 10-20 07:03

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

    GD32 MCU原理固件庫開發指南這本書內容豐富,囊括了GD32中的所有外設,書中首先介紹了如何使用MDK或IAR軟件搭建GD32工程環境,讓初學者能快速基于工程上手編程。書中主要對
    發表于 03-31 22:11

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

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

    GD32和STM32的區別

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

    GD32移植到STM32開發平臺

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

    STM32、GD32、ESP32的區別

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

    GD32開發實戰指南(基礎) 19 程序加密

    GD32通過讀取芯片唯一ID號來實現程序的保護,防止被抄襲。96位的產品唯一身份標識所提供的參考號碼對任意一個GD32微控制器
    的頭像 發表于 05-20 09:10 ?4154次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發</b><b class='flag-5'>實戰</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是兩種不同的微控制器型號,它們都是國內開發的芯片。GD32系列由國內芯片制造商GigaDevice Semiconductor
    的頭像 發表于 08-16 11:32 ?2468次閱讀

    GD32與STM32兼容嗎?

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

    STM32與GD32橫向對比區別

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

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

    本文是專門為基于GD32 MCU開發的工程設計人員提供,主要介紹了GPIO的功能配置、內部結構以及在不同場景使用時的注意事項,旨在幫助GD32 MCU
    的頭像 發表于 09-07 10:34 ?738次閱讀
    【<b class='flag-5'>GD32</b> MCU入門教程】<b class='flag-5'>GD32</b> MCU GPIO <b class='flag-5'>結構</b>與使用注意事項
    主站蜘蛛池模板: 天堂8资源8在线| 黄 色 成 年人网站| 欧美亚洲综合另类型色妞| 成人毛片一区二区三区| 欧美日韩一区二区不卡| 优优色综合| 免费恐怖片| 免费一级片在线| 东京加勒比| 久久国产伦三级理电影| 色精品视频| 99热久久精品免费精品| 久久亚洲精品玖玖玖玖| 欧美福利二区| 亚洲最大成人在线| 国产精品三级| 日本xxx69| 日韩欧美在线中文字幕| 午夜精品视频在线观看| 日本aaaa毛片在线看| 免费看逼网站| 国产综合成色在线视频| 亚洲国产成a人v在线观看| 波多野结衣在线网址| 69pao强力打造在线| 欧美一区a| 免费福利午夜影视网| 亚洲成人在线网站| www.xxx日本人| 亚洲光棍天堂| 精品一区 二区三区免费毛片| 久久天天躁狠狠躁夜夜呲| 亚洲人成毛片线播放| aaaa视频| 男女午夜剧场| 国产乱辈通伦影片在线播放| 性欧美激情在线观看| 欧美高清一区| 91网站在线看| 女人张开腿 让男人桶个爽 免费观看| 免费福利在线播放|