wailian1265k 发表于 2021-12-28 23:06

GD32芯片移植完全攻略

GD32是国产兆易创新公司生产的完全兼容STM32系列的Cortex-M3处理器,具有几大亮点:
1,高主频108MHz。性能提升30%以上,可超频到120MHz
2,Flash零等待。STM32的72MHz需要两个等待,其实兆易创新公司本来就是做Flash起家的,具有gFlash专利
3,采用ARM Cortex-M3新内核R2p1。STM32采用R1p1,带有一些缺陷
4,性价比高。GD32比对应的STM32芯片一般便宜20%,某些芯片便宜30%以上

收到样片GD32F103VET6后,替换STM32F103VET6,写入最新版本TinyBooter和MF固件,以及MF测试例程,全部一次性通过!
兼容性非常好。
不过我们不能满足于此,MF固件默认跑在72MHz主频,Flash还是使用两个等待,我们需要测试更高速度!
于是根据官方的资料,修改主频为108MHz,Flash为零等待。
RCC->CFGR |= (uint32_t)(0x08000000 | RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL12);

wailian1265k 发表于 2021-12-28 23:07

修改以后发现USB无法识别,串口一团糟!
上面是网上能找到的最多的资料,意思是HSE/2*(12+15),除以2和12都可以理解,15哪里冒出来的就实在不懂了。

请求官方技术支持,几分钟后得到邮件回复。
大意是108MHz无法分频得到USB所需要的48MHz,STM32本来支持1分频和1.5分配,然后GD32在这方面扩展了2分频和2.5分配。所以,如果想要使用USB,要么降频到96MHz,要么超频到120MHz,这样分别使用2分频和2.5分配即可得到USB所需要的48MHz。
这就说明GD32无法在标准108MHz下使用USB,好杯具!!!

wailian1265k 发表于 2021-12-28 23:08

另外,关于串口乱码的问题,给我的答复是修改RCC_GetClocksFreq函数:
void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
{
uint32_t tmp = 0, pllmull = 0, pllsource = 0, presc = 0;   /* Get SYSCLK source -------------------------------------------------------*/   tmp = RCC->CFGR & CFGR_SWS_Mask;   switch (tmp)   {   case 0x00:/* HSI used as system clock */       RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;       break;   case 0x04:/* HSE used as system clock */       RCC_Clocks->SYSCLK_Frequency = HSE_VALUE;       break;   case 0x08:/* PLL used as system clock */       /* Get PLL clock source and multiplication factor ----------------------*/       pllmull = RCC->CFGR &((uint32_t)0x203C0000);       pllsource = RCC->CFGR & CFGR_PLLSRC_Mask;            if(((pllmull)&(0x20000000)) != 0)         pllmull = (((pllmull)&(0x003C0000)) >> 18) + 17;       else         pllmull = ( pllmull >> 18) +2;            if (pllsource == 0x00)       {/* HSI oscillator clock divided by 2 selected as PLL clock entry */         RCC_Clocks->SYSCLK_Frequency = (HSI_VALUE >> 1) * pllmull;       }       else       {         /* HSE selected as PLL clock entry */         if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (uint32_t)RESET)         {/* HSE oscillator clock divided by 2 */         RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE >> 1) * pllmull;         }         else         {         RCC_Clocks->SYSCLK_Frequency = HSE_VALUE * pllmull;         }       }       break;   default:       RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;       break;   }   /* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/   /* Get HCLK prescaler */   tmp = RCC->CFGR & CFGR_HPRE_Set_Mask;   tmp = tmp >> 4;   presc = APBAHBPrescTable;   /* HCLK clock frequency */   RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;   /* Get PCLK1 prescaler */   tmp = RCC->CFGR & CFGR_PPRE1_Set_Mask;   tmp = tmp >> 8;   presc = APBAHBPrescTable;   /* PCLK1 clock frequency */   RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc;   /* Get PCLK2 prescaler */   tmp = RCC->CFGR & CFGR_PPRE2_Set_Mask;   tmp = tmp >> 11;   presc = APBAHBPrescTable;   /* PCLK2 clock frequency */   RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc;   /* Get ADCCLK prescaler */   tmp = RCC->CFGR & CFGR_ADCPRE_Set_Mask; tmp = (tmp >> 14)+(tmp >> 26);   presc = ADCPrescTable;   /* ADCCLK clock frequency */   RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc; }

pixhw 发表于 2022-1-2 17:43

这个不是兼容stm32吗   

hudi008 发表于 2022-1-2 17:43

需要修改时钟吗?   

lzmm 发表于 2022-1-2 17:43

记得刚刚开始的时候,就是使用stm32的库   

minzisc 发表于 2022-1-2 17:43

需要修改的地方不多吧。   

selongli 发表于 2022-1-2 17:43

完全兼容STM32系列的   

fentianyou 发表于 2022-1-2 17:44

现在国产芯片很多了,可选择性也多了

xiaoyaodz 发表于 2022-1-2 17:44

与芯片对应的列表吗   

sdlls 发表于 2022-1-2 17:44

高主频108MHz,这个确实可以。

febgxu 发表于 2022-1-2 17:44

国产mcu优于stm32了。   

kkzz 发表于 2022-1-2 17:45

现在国产芯片没有价格优势了。
页: [1]
查看完整版本: GD32芯片移植完全攻略