<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > GD32F103替換STM32F103需要注意的地方

GD32F103替換STM32F103需要注意的地方

作者: 時(shí)間:2024-01-29 來(lái)源:趣味硬件 收藏

查了下GD的手冊和一些論壇中使用過(guò)的大佬發(fā)布的帖子,替換需要注意的地方總結如下:

本文引用地址:http://dyxdggzs.com/article/202401/455180.htm

一、相同點(diǎn)


1) 、外圍引腳定義: 相同型號的管腳定義相同

2) 、Cortex M3 內核: 內核 R1P1 版本, STM32F205 內核 R2P1, GD32 內核 R2P1 版本,此內核已經(jīng)修復了 R1P1 的一些 bug

3)、 芯片內部寄存器, 外部 IP 寄存器地址 : 邏輯地址相同,主要是根據 STM32 的寄存器和物理地址,做得正向研發(fā).

4) 、函數庫文件: 函數庫相同,優(yōu)化需要更改頭文件

5) 、編譯工具: 完全相同 例如:keil MDK、IAR

6)、 型號命名方式: 完全相同

二、外圍硬件區別

1) 、電壓范圍(ADC): GD32F: 2.6-3.6V STM32F: 2.0-3.6V(外部電壓) GD32F: 1.2V(內核電壓)STM32F: 1.8V(內核電壓)

2)、 BOOT 0 管腳: Flash 程序運行時(shí),BOOT0 在 STM32 上可懸空,GD32 必須外部下拉(從 Flash 運行,BOOT0 必須下拉地)

3)、 ESD 參數: STM32 人體模式 2KV,空氣模式 500V GD32 人體模式 4KV(內測 5KV),空氣模式 10KV(內測 15KV)


三. 內部結構差別

1) 、啟動(dòng)時(shí)間: GD32 啟動(dòng)時(shí)間相同,由于 GD 運行稍快,需要延長(cháng)上電時(shí)間 配置(2ms)

2) 、主頻時(shí)鐘: GD32F10 系列主頻 108MHZ STM32F10 系列主頻 72MHZ

3)、 Flash 擦除時(shí)間: GD32 是 60ms/page,STM 30ms/page

4) 、FLASH 容量: GD32 最大容量 3M Byte

5)、 SRAM 空間: 系列、GD32F105107 大容量系列 SRAM 96K

6)、 VB 外擴總線(xiàn) FSMC:GD32 100PIN 配置總線(xiàn)輸出,STM32 144PIN 并且 256k 以上 才配置總線(xiàn)輸出

四. 功耗區別(以 128k 以下容量的作為參考)

1) 、睡眠模式 Sleep: GD32F: 12.4mA STM32F10X: 7.5mA

2) 、深度睡眠模式 Deep Sleep: GD32F: 1.4mA STM32F10X: 24uA

3)、 待機模式 Stand By: GD32F: 10.5uA STM32F10X: 3.4uA

4) 、運行功耗: GD32F: 32.4mA/72M STM32F10X: 52mA/72M

五、硬件替換要注意的地方

從上面的介紹中,我們可以看出,系列和系列是兼容的,但也需要一些注意的地方。

1、BOOT0必須接10K下拉或接GND,ST可懸空,這點(diǎn)很重要。

2、RC復位電路必須要有,否則MCU可能不能正常工作,ST的有時(shí)候可以不要。

3、有時(shí)候發(fā)現用仿真器連接不上。因為GD的swd接口驅動(dòng)能力比ST弱,可以有如下幾種方式解決:

a、線(xiàn)盡可能短一些;

b、降低SWD通訊速率;

c、SWDIO接10k上拉,SWCLK接10k下拉。

4、使用電池供電等,注意GD的工作電壓,例如跌落到2.0V~2.6V區間,ST還能工作,GD可能無(wú)法啟動(dòng)或工作異常。

四、使用ST標準庫開(kāi)發(fā)需要修改的地方

1、GD對時(shí)序要求嚴格,配置外設需要先打開(kāi)時(shí)鐘,再進(jìn)行外設配置,否則可能導致外設無(wú)法配置成功;ST的可以先配置在開(kāi)時(shí)鐘。

2、修改外部晶振起振超時(shí)時(shí)間,不用外部晶振可跳過(guò)這步。

原因:GD與ST的啟動(dòng)時(shí)間存在差異,為了讓GD MCU更準確復位。

修改:

將宏定義:#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)修改為:#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF)

3、GD32F10X flash取值零等待,而ST需要2個(gè)等待周期,因此,一些精確延時(shí)或者模擬IIC或SPI的代碼可能需要修改。

原因:GD32采用專(zhuān)利技術(shù)提高了相同工作頻率下的代碼執行速度。

修改:如果使用for或while循環(huán)做精確定時(shí)的,定時(shí)會(huì )由于代碼執行速度加快而使循環(huán)的時(shí)間變短,因此需要仿真重新計算設計延時(shí)。使用Timer定時(shí)器無(wú)影響。

4、在代碼中設置讀保護,如果使用外部工具讀保護比如JFLASH或脫機燒錄器設置,可跳過(guò)此步驟。

在寫(xiě)完KEY序列后,需要讀該位確認key已生效,修改如下:


總共需要修改如下四個(gè)函數:

FLASH_Status FLASH_EraseOptionBytes(void);FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);uint32_t FLASH_GetWriteProtectionOptionByte(void);FlagStatus FLASH_GetReadOutProtectionStatus(void);

5、GD與ST在flash的Erase和Program時(shí)間上有差異,修改如下:


6、需求flash大于256K注意,小于256K可以忽略這項。

與ST不同,GD的flash存在分區的概念,前256K,CPU執行指令零等待,稱(chēng)code區,此范圍外稱(chēng)為dataZ區。兩者在擦寫(xiě)操作上沒(méi)有區別,但在讀操作時(shí)間上存在較大差別,code區代碼取值零等待,data區執行代碼有較大延遲,代碼執行效率比code區慢一個(gè)數量級,因此data區通常不建議運行對實(shí)時(shí)性要求高的代碼,為解決這個(gè)問(wèn)題,可以使用分散加載的方法,比如把初始化代碼,圖片代碼等放到data區。

7、ADC采集

a> ADC通道要配置成模擬輸入,芯片默認是浮空輸入,如果不配成模擬輸入,ST的可以正常采集,GD不行

b> ADC時(shí)鐘沒(méi)有手動(dòng)分頻最大運行頻率14Mhz以?xún)?,ST可以正常采集,GD不行。

c> ADC使能后需要加不少于20us延時(shí)。

d> 采樣精度不如STM32f103,GD32f103存在這個(gè)問(wèn)題,如果對ADC精度要求不高可以選用,可以選用PIN TO PIN 兼容F103系列的GD32E103和GD32F303系列解決。

總結:至此,經(jīng)過(guò)以上修改,不使用USB和網(wǎng)絡(luò )等復雜協(xié)議的代碼,就可以使用ST的代碼操作了。

PS:GD的主頻支持108MHz,有時(shí)候需要提供主頻,提供一個(gè)96MHZ的參考:

static void SetSysClockTo96(void){
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC,ENABLE);
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC,!ENABLE);	
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
  /* Enable HSE */    
  RCC->CR |= ((uint32_t)RCC_CR_HSEON); 
  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));for(StartUpCounter=0;StartUpCounter<0x1fff;StartUpCounter++);  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    

 
    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;    
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
        
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);  
    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }    
   
    /* PLL configuration: PLLCLK = PREDIV1 * 12 = 96 MHz */ 
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 
                            RCC_CFGR_PLLMULL12); 
#else    #if 0
    /*  PLL configuration: PLLCLK = HSE * 12 = 96 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));																				for(StartUpCounter=0;StartUpCounter<0x1fff;StartUpCounter++);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL12);#else//	RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |//                                        RCC_CFGR_PLLMULL));
																				
	//RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE|(1<<17));
	//RCC->CFGR &= ~(RCC_CFGR_PLLMULL);
	//RCC->CFGR |= (uint32_t)(1<<27u);
	RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | (1<<27)|(7<<18)|(1<<17));#endif#endif /* STM32F10X_CL */

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }    for(StartUpCounter=0;StartUpCounter<0x1fff;StartUpCounter++);    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    
		for(StartUpCounter=0;StartUpCounter<0x200;StartUpCounter++);		for(StartUpCounter=0;StartUpCounter<0x1fff;StartUpCounter++);    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
    }
  }  else
  { /* If HSE fails to start-up, the application will have wrong clock 
         configuration. User can add here some code to deal with this error */
  }
}

還是希望國產(chǎn)芯片能越做越好,早日實(shí)現國產(chǎn)化,這樣就不怕人家卡脖子了!




關(guān)鍵詞: GD32F103 STM32F103 單片機

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>