RM新时代网站-首页

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

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

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

GD32開發(fā)實戰(zhàn)指南(基礎篇) 第4章 GD32啟動流程詳解(Keil版)

嵌入式大雜燴 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2023-05-10 09:00 ? 次閱讀

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

MDK:Keil 5.30

開發(fā)板:GD32F207I-EVAL

MCU:GD32F207IK

對于我們常用的桌面操作系統(tǒng)而言,我們在開發(fā)應用時,并不關心系統(tǒng)的初始化,絕大多數(shù)應用程序是在操作系統(tǒng)運行后才開始運行的,操作系統(tǒng)已經(jīng)提供了一個合適的運行環(huán)境,然而對于嵌入式設備而言,在設備上電后,所有的一切都需要由開發(fā)者來設置,這里處理器是沒有堆棧,沒有中斷,更沒有外圍設備,這些工作是需要軟件來指定的,而且不同的CPU類型、不同大小的內(nèi)存和不同種類的外設,其初始化工作都是不同的。本文將以GD32F207IK (基于Cortex-M3)為例進行講解。

在開始正式講解之前,你需要了解ARM寄存器、匯編以及反編譯相關的知識,這些可以參考筆者博文。

深入理解ARM寄存器:https://bruceou.blog.csdn.net/article/details/117866186

ARM匯編入門:https://bruceou.blog.csdn.net/article/details/117897496

Keil反編譯入門(一):https://bruceou.blog.csdn.net/article/details/118314875

Keil反編譯入門(二):https://bruceou.blog.csdn.net/article/details/118400368

下面我們就來具體看一下用戶從Flash啟動GD32的過程,主要講解從上電復位到main函數(shù)的過程。主要有以下步驟:

1.初始化堆棧指針 SP=_initial_sp,初始化 PC 指針=Reset_Handler

2.初始化中斷向量表

3.配置系統(tǒng)時鐘

4.調(diào)用 C 庫函數(shù)_main 初始化用戶堆棧,然后進入 main 函數(shù)。

在開始講解之前,我們需要了解GD32的啟動模式。

1 GD32的啟動模式

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

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

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

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

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

1683641881815mlchzr9x8b

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

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

Bootloader 存放在系統(tǒng)(System)存儲內(nèi),可以在 MCU 啟動后對 Flash 進行再編程。在GD32F20x 系列產(chǎn)品中,Bootloader 通過 USART0 與外界交互。

GD32F20x芯片支持嵌入式引導程序通過多種接口方式來更新Flash??梢杂?或2個USART端口和標準USB端口用于GD32F205xx和GD32F207xx互聯(lián)型產(chǎn)品。如下表所示。

產(chǎn)品線 產(chǎn)品 支持串行外設
互聯(lián)型 GD32F205xx USART0(PA9 PA10)USART1(PD5 PD6)USB(PA9 PA10 PA11 PA12)
GD32F207xx USART0(PA9 PA10)USART1(PD5 PD6)USB(PA9 PA10 PA11 PA12)

2 GD32的啟動文件分析

因為啟動過程主要是由匯編完成的,因此GD32的啟動的大部分內(nèi)容都是在啟動文件里。筆者的啟動文件是startup_gd32f20x_cl.s。

2.1堆棧定義

1. Stack棧

棧的作用是用于局部變量,函數(shù)調(diào)用,函數(shù)形參等的開銷,棧的大小不能超過內(nèi)部SRAM 的大小。當程序較大時,需要修改棧的大小,不然可能會出現(xiàn)的HardFault的錯誤。

1683641882409orde6lxrqu

第43行:表示開辟棧的大小為 0X00000400(1KB),EQU是偽指令,相當于C 中的 define。

第45行:開辟一段可讀可寫數(shù)據(jù)空間,ARER 偽指令表示下面將開始定義一個代碼段或者數(shù)據(jù)段。此處是定義數(shù)據(jù)段。ARER 后面的關鍵字表示這個段的屬性。段名為STACK,可以任意命名;NOINIT 表示不初始化;READWRITE 表示可讀可寫,ALIGN=3,表示按照 8 字節(jié)對齊。

第46行:SPACE 用于分配大小等于 Stack_Size連續(xù)內(nèi)存空間,單位為字節(jié)。

第47行: __initial_sp表示棧頂?shù)刂?。棧是由高向低生長的。

2.Heap堆

堆主要用來動態(tài)內(nèi)存的分配,像 malloc()函數(shù)申請的內(nèi)存就在堆中。

1683641882719oqfmaee7b6

開辟堆的大小為 0X00000200(512 字節(jié)),名字為 HEAP,NOINIT 即不初始化,可讀可寫,8字節(jié)對齊。__heap_base 表示對的起始地址,__heap_limit 表示堆的結(jié)束地址。

2.2 向量表

向量表是一個WORD( 32 位整數(shù))數(shù)組,每個下標對應一種異常,該下標元素的值則是該 ESR 的入口地址。向量表在地址空間中的位置是可以設置的,通過 NVIC 中的一個重定位寄存器來指出向量表的地址。在復位后,該寄存器的值為 0。因此,在地址 0 (即 FLASH 地址 0)處必須包含一張向量表,用于初始時的異常分配。

值得注意的是這里有個另類:0號類型并不是什么入口地址,而是給出了復位后 MSP 的初值,后面會具體講解。

1683641883090tmtw4q1vno

……

1683641883526mqpa7bs3u8

第66行:定義一塊代碼段,段名字是RESET,READONLY 表示只讀。

第67-69行:使用EXPORT將3個標識符申明為可被外部引用,聲明 __Vectors、__Vectors_End 和__Vectors_Size 具有全局屬性。這幾個變量在Keil分散加載時會用到。

第71行:__Vectors 表示向量表起始地址,DCD 表示分配 1 個 4 字節(jié)的空間。每行 DCD 都會生成一個 4 字節(jié)的二進制代碼,中斷向量表 存放的實際上是中斷服務程序的入口地址。當異常(也即是中斷事件)發(fā)生時,CPU 的中斷系統(tǒng)會將相應的入口地址賦值給 PC 程序計數(shù)器,之后就開始執(zhí)行中斷服務程序。在60行之后,依次定義了中斷服務程序的入口地址。

第179行:__Vectors_End 為向量表結(jié)束地址。

第181行:__Vectors_Size則是向量表的大小,向量表的大小是通過__Vectors 和__Vectors_End 相減得到的。

上述向量表可以在《GD32F20x_User_Manual_EN_Rev2.4》中找到的,筆者這里只截取了部分。

1683641883886t45biqjfm6

筆者只截取了部分。

2.3 復位程序

復位程序是系統(tǒng)上電后執(zhí)行的第一個程序,復位程序也是中斷程序,只是這個程序比較特殊,因此單獨提出來講解。

1683641884378vy8wfxquf8

第186行:定義了一個服務程序,PROC表示程序的開始。

第187行:使用EXPORT將Reset_Handler申明為可被外部引用,后面WEAK表示弱定義,如果外部文件定義了該標號則首先引用該標號,如果外部文件沒有聲明也不會出錯。這里表示復位程序可以由用戶在其他文件重新實現(xiàn)。

第188-189行:表示該標號來自外部文件,SystemInit()是一個庫函數(shù),在system_gd32f10x.c中定義的,__main 是一個標準的 C 庫函數(shù),主要作用是初始化用戶堆棧,這個是由編譯器完成的,該函數(shù)最終會調(diào)用我們自己寫的main函數(shù),從而進入C世界中。

第190行:這是一條匯編指令,表示從存儲器中加載SystemInit到一個寄存器R0的地址中。R0~R3 寄存器通常用于函數(shù)入?yún)⒊鰠⒒蜃映绦蛘{(diào)用。

第191行:匯編指令,表示跳轉(zhuǎn)到寄存器R0的地址,并根據(jù)寄存器的 LSE 確定處理器的狀態(tài),還要把跳轉(zhuǎn)前的下條指令地址保存到 LR。

第192行:和190行是一個意思,表示從存儲器中加載__main到一個寄存器R0的地址中。

第193行:和191稍微不同,這里跳轉(zhuǎn)到至指定寄存器的地址后,不會返回。

第194行:和PROC是對應的,表示程序的結(jié)束。

值得注意的是,這里的__main和C語言中的main()不是一樣東西,__main是C lib中的函數(shù),也就是在Keil中自帶的;而main()函數(shù)是C的入口,main()會被__main調(diào)用。

2.4 中斷服務程序

我們平時要使用哪個中斷,就需要編寫相應的中斷服務程序,只是啟動文件把這些函數(shù)留出來了,但是內(nèi)容都是空的,真正的中斷復服務程序需要我們在外部的 C 文件里面重新實現(xiàn),這里只是提前占了一個位置罷了。

1683641884727o0ylahugyn

這部分沒啥好說的,和服務程序類似的,只需要注意‘B .’語句,B表示跳轉(zhuǎn),這里跳轉(zhuǎn)到一個‘.’,即表示無線循環(huán)。

2.5 堆棧初始化

堆棧初始化是由一個IF條件來實現(xiàn)的,MICROLIB的定義與否決定了堆棧的初始化方式。

這個定義是在Options->Target中設置的。

1683641885080sccy5y5lo8

如果沒有定義__MICROLIB , 則會使用雙段存儲器模式,且聲明了__user_initial_stackheap 具有全局屬性,這需要開發(fā)者自己來初始化堆棧。

16836418854676v6ytnwdkw

這部分也沒啥講的,需要注意的是,ALIGN表示對指令或者數(shù)據(jù)存放的地址進行對齊,缺省表示4字節(jié)對齊。

2.6 其他

16836418858143n0lz7qxcr

第62行:PRESERVE8 用于指定當前文件的堆棧按照 8 字節(jié)對齊。

第63行:THUMB 表示后面指令兼容 THUMB 指令?,F(xiàn)在 Cortex-M 系列的都使用 THUMB-2 指令集,THUMB-2 是 32 位的,兼容 16 位和 32 位的指令,是 THUMB 的超集。

3 GD32的啟動流程實例分析

有了前面的分析,接下來就來具體看看GD32啟動流程的具體內(nèi)容。

3.1初始化SP、PC、向量表

當系統(tǒng)復位后,處理器首先讀取向量表中的前兩個字(8 個字節(jié)),第一個字存入 MSP,第二個字為復位向量,也就是程序執(zhí)行的起始地址。

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

這里通過J-Flash打開hex文件。

16836418864610367kqtder

硬件這時自動從0x0800 0000位置處讀取數(shù)據(jù)賦給棧指針SP,然后自動從0x0800 0004位置處讀取數(shù)據(jù)賦給PC,完成了復位操作,SP= 0x0200 2008,PC = 0x0800 01BD。

初始化SP、PC緊接著就初始化向量表,如果感覺看HEX文件抽象,我們看看反匯編文件吧。

16836418868297f6cfzsiqn

是不是更容易些,是不是和《GD32F20x_User_Manual_EN_Rev2.4》中的向量表對應起來了。其實看反匯編文件更好理解GD32的啟動流程,只是有些抽象。

生成反匯編的方法如下。

在KEIL的User選項中,如下圖添加這兩項:

fromelf --bin --output=GD32F207I_EVAL.bin ../Output/GD32F207I_EVAL.axf

fromelf --text -a -c --output=GD32F207I_EVAL.dis ../Output/GD32F207I_EVAL.axf

然后重新編譯,即可得到二進制文件GD32F207I_EVAL.bin(以后會分析)、反匯編文件GD32F207I_EVAL.dis。

如下圖所示:

1683641887165zms87otk87

3.2 設置系統(tǒng)時鐘

細心的朋友可能發(fā)現(xiàn),PC=0x080001BD,這里表明MCU運行的是THUMB模式,最低位為1表示為THUMB狀態(tài)。然后在反匯編文件中卻是這樣的:

1683641887552cchwcd1pxd

當然也可通過硬件調(diào)試來確認上面的分析:

16836418879176yj9y2lm3i

接下來就會進入SystemInit函數(shù)中。

1683641888886y6tbag6gzh

SystemInit函數(shù)內(nèi)容如下:

/*!
    \\\\\\\\brief      setup the micro-controller system, initialize the system
    \\\\\\\\param[in]  none
    \\\\\\\\param[out] none
    \\\\\\\\retval     none
*/
void SystemInit(void)
{
    /* reset the RCC clock configuration to the default reset state */
    /* enable IRC8M */
    RCU_CTL |= RCU_CTL_IRC8MEN;

    RCU_CFG0 &= ~RCU_CFG0_SCS;
    /* reset HXTALEN, CKMEN, PLLEN bits */
    RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN);

    /* reset SCS, AHBPSC, APB1PSC, APB2PSC, ADCPSC, CKOUT0SEL bits */
    RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC |
                  RCU_CFG0_ADCPSC | RCU_CFG0_ADCPSC_2 | RCU_CFG0_CKOUT0SEL);

    /* reset HXTALEN, CKMEN, PLLEN bits */
    RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN);

    /* Reset HXTALBPS bit */
    RCU_CTL &= ~(RCU_CTL_HXTALBPS);

    /* reset PLLSEL, PREDV0_LSB, PLLMF, USBFSPSC bits */
    RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF |
                  RCU_CFG0_USBFSPSC | RCU_CFG0_PLLMF_4);

    /* reset PLL1EN and PLL2EN bits */
    RCU_CTL &= ~(RCU_CTL_PLL1EN | RCU_CTL_PLL2EN);

    /* reset CFG1 register */
    RCU_CFG1 = 0x00000000U;

    /* reset INT register */
    RCU_INT = 0x00FF0000U;

    /* reset CFG2 register */
    RCU_CFG2 = 0x00000000U;

    /* reset PLLTCTL register */
    RCU_PLLTCTL &= (~RCU_PLLTCTL_PLLTEN);

    /* reset PLLTINT register */
    RCU_PLLTINT = 0x00400000U;

    /* reset PLLTCFG register */
    RCU_PLLTCFG = 0x20003010U;

    /* configure the system clock source, PLL multiplier, AHB/APBx prescalers and flash settings */
    system_clock_config();
}

前面部分是配置時鐘的,具體參考手冊吧。

/*!
    \\\\\\\\brief      configure the system clock to 120M by PLL which selects HXTAL(8M) as its clock source
    \\\\\\\\param[in]  none
    \\\\\\\\param[out] none
    \\\\\\\\retval     none
*/
static void system_clock_120m_hxtal(void)
{
    uint32_t timeout = 0U;
    uint32_t stab_flag = 0U;

    /* enable HXTAL */
    RCU_CTL |= RCU_CTL_HXTALEN;

    /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */
    do {
        timeout++;
        stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);
    } while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));

    /* if fail */
    if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)) {
        while(1) {
        }
    }

    /* HXTAL is stable */
    /* AHB = SYSCLK */
    RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
    /* APB2 = AHB/1 */
    RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;
    /* APB1 = AHB/2 */
    RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;

    /* CK_PLL = (CK_PREDIV0) * 10 = 120 MHz */
    RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLSEL);
    RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL10);

    /* CK_PREDIV0 = (CK_HXTAL) / 5 * 12 /5 = 12 MHz */
    RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0);
    RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL12 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV5);

    /* enable PLL1 */
    RCU_CTL |= RCU_CTL_PLL1EN;
    /* wait till PLL1 is ready */
    while((RCU_CTL & RCU_CTL_PLL1STB) == 0U) {
    }

    /* enable PLL */
    RCU_CTL |= RCU_CTL_PLLEN;

    /* wait until PLL is stable */
    while(0U == (RCU_CTL & RCU_CTL_PLLSTB)) {
    }

    /* select PLL as system clock */
    RCU_CFG0 &= ~RCU_CFG0_SCS;
    RCU_CFG0 |= RCU_CKSYSSRC_PLL;

    /* wait until PLL is selected as system clock */
    while(0U == (RCU_CFG0 & RCU_SCSS_PLL)) {
    }
}

3.3 初始化堆棧并進入main

執(zhí)行指令LDR R0, =__main,然后就跳轉(zhuǎn)到__main程序段運行,當然這里指標準庫的__main函數(shù)。

1683641889235szq3xsjq27

這中間初始化了棧區(qū)。

1683641889700udrb5u9tx7

這段代碼是個循環(huán)(BCC 0x080001e6),實際運行時候循環(huán)了兩次。第一次運行的時候,讀取“加載數(shù)據(jù)段的函數(shù)”的地址并跳轉(zhuǎn)到該函數(shù)處運行(注意加載已初始化數(shù)據(jù)段和未初始化數(shù)據(jù)段用的是同一個函數(shù));第二次運行的時候,讀取“初始化棧的函數(shù)”的地址并跳轉(zhuǎn)到該函數(shù)處運行。

最后就進入C文件的main函數(shù)中,至此,啟動過程到此結(jié)束。

最后,總結(jié)下GD32 從flash的啟動流程。

MCU上電后從0x0800 0000處讀取棧頂?shù)刂凡⒈4?,然后?x0800 0004讀取中斷向量表的起始地址,這就是復位程序的入口地址,接著跳轉(zhuǎn)到復位程序入口處,初始向量表,然后設置時鐘,設置堆棧,最后跳轉(zhuǎn)到C空間的main函數(shù),即進入用戶程序。

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

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

    關注

    146

    文章

    17123

    瀏覽量

    350975
  • 開發(fā)板
    +關注

    關注

    25

    文章

    5032

    瀏覽量

    97371
  • keil
    +關注

    關注

    68

    文章

    1212

    瀏覽量

    166839
  • Cortex-M
    +關注

    關注

    2

    文章

    229

    瀏覽量

    29752
  • GD32
    +關注

    關注

    7

    文章

    403

    瀏覽量

    24326
收藏 人收藏

    評論

    相關推薦

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

    GD32 有一個內(nèi)部的溫度傳感器,可以用來測量 CPU 及周圍的溫度(TA)。該溫度傳感器在內(nèi)部和 ADCx_IN16 輸入通道相連接,此通道把傳感器輸出的電壓轉(zhuǎn)換成數(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> 內(nèi)部溫度傳感器

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

    開發(fā)環(huán)境: MDK:Keil 5.30 開發(fā)板:GD32F207I-EVAL MCU:GD32F207IK 1 RTC工作原理 1.1 RT
    的頭像 發(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是國內(nèi)開發(fā)的一款單片機,據(jù)說開發(fā)的人員是來自ST公司的,GD32也是以STM32作為模板做出來的。所以GD32和STM32有
    發(fā)表于 08-09 07:03

    什么是GD32

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

    GD32芯片包添加步驟有哪些

    **GD32芯片包添加步驟**GD32開發(fā)環(huán)境可以有多個選擇,常見的開發(fā)編譯環(huán)境有:Keil4,keil
    發(fā)表于 11-22 08:30

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

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

    GD32單片機開發(fā)環(huán)境搭建(Keil5安裝)

    GD32單片機開發(fā)環(huán)境搭建(Keil5安裝)
    發(fā)表于 11-13 14:36 ?40次下載
    <b class='flag-5'>GD32</b>單片機<b class='flag-5'>開發(fā)</b>環(huán)境搭建(<b class='flag-5'>Keil</b>5安裝)

    GD32F系列單片機開發(fā)總結(jié)(二):GD32芯片包添加步驟

    **GD32芯片包添加步驟**GD32開發(fā)環(huán)境可以有多個選擇,常見的開發(fā)編譯環(huán)境有:Keil4,keil
    發(fā)表于 11-13 17:21 ?37次下載
    <b class='flag-5'>GD</b>32F系列單片機<b class='flag-5'>開發(fā)</b>總結(jié)(二):<b class='flag-5'>GD32</b>芯片包添加步驟

    GD32和STM32的區(qū)別

    一、前言GD32是國內(nèi)開發(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開發(fā)實戰(zhàn)指南(基礎) 19 程序加密

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

    GD32與STM32兼容嗎?

    的STMicroelectronics公司設計和生產(chǎn)的。 雖然GD32與STM32都是基于ARM Cortex-M內(nèi)核的微控制器,但是它們并不完全兼容。由于兩個公司的設計和生產(chǎn)流程不同,GD32系列和STM32系列
    的頭像 發(fā)表于 08-16 11:32 ?2911次閱讀

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

    GD32系列為通用型MCU,所以開發(fā)環(huán)境也可以使用通用型的IDE,目前使用較多的是KEIL、IAR、 GCC和Embedded Builder,客戶可以根據(jù)個人喜好來選擇相應的開發(fā)環(huán)境
    的頭像 發(fā)表于 08-08 15:01 ?1161次閱讀
    【<b class='flag-5'>GD32</b> MCU 入門教程】一、<b class='flag-5'>GD32</b> MCU <b class='flag-5'>開發(fā)</b>環(huán)境搭建(1)使用<b class='flag-5'>Keil</b><b class='flag-5'>開發(fā)</b><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ù)個人喜好來選擇相應的開發(fā)環(huán)境
    的頭像 發(fā)表于 08-08 15:40 ?680次閱讀
    【<b class='flag-5'>GD32</b> MCU 入門教程】一、<b class='flag-5'>GD32</b> MCU <b class='flag-5'>開發(fā)</b>環(huán)境搭建(2)使用 IAR <b class='flag-5'>開發(fā)</b> <b class='flag-5'>GD32</b>
    RM新时代网站-首页