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);
修改以后发现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,好杯具!!! 另外,关于串口乱码的问题,给我的答复是修改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; } 这个不是兼容stm32吗 需要修改时钟吗? 记得刚刚开始的时候,就是使用stm32的库 需要修改的地方不多吧。 完全兼容STM32系列的 现在国产芯片很多了,可选择性也多了 与芯片对应的列表吗 高主频108MHz,这个确实可以。 国产mcu优于stm32了。 现在国产芯片没有价格优势了。
页:
[1]