首页 » 通讯 » GD32芯片移植完全攻略_分频_串口

GD32芯片移植完全攻略_分频_串口

神尊大人 2024-11-18 16:55:34 0

扫一扫用手机浏览

文章目录 [+]

修正往后创造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[tmp]; / 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[tmp]; / 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[tmp]; / 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[tmp]; / ADCCLK clock frequency / RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc;}

大概意思是判断一个标识位,如果有那个标识位,则采取另一条公式来打算倍频。
暂时预测那个标识位是GD32专用。
但是这样办理不了我的问题,我们的MF系统采取的是寄存器设定波特率,根本就没有利用库函数。
我就想理清思路搞清楚这里为什么要这样修正,然后我依葫芦画瓢同样操作寄存器。
结果我失落败了,这里的17跟上面的15同样莫名其妙,不过+17比下面原来的+2刚好多了15,看来有什么关系。
就以0x20000000作为切入口,查看它在RCC->CFGR中的用场。

GD32芯片移植完全攻略_分频_串口 GD32芯片移植完全攻略_分频_串口 通讯

果真是GD32专用,0x20000000是第29位保留位。
小飞以为这一位跟前面的15有关,那么我们考试测验把前面分频利用的0x08000000改为0x20000000试试

GD32芯片移植完全攻略_分频_串口 GD32芯片移植完全攻略_分频_串口 通讯
(图片来自网络侵删)

RCC->CFGR |= (uint32_t)(0x20000000 | RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL12);

这个时候系统跑起来了,串口没有乱码,但是USB口不能利用,当然了,USB在108MHz不能用呀。
这样子算是办理了串口乱码这个问题。
但是有个非常奇怪的问题,Keil调试看到系统时钟是48MHz,通过寄存器换算也是,百思不得其解!
花哥提醒,Keil的RCC调试界面是为STM32准备的,看GD32的分外频率可能不准。
实在关键就在于这个29位,由于它的存在,导致RCC_GetClocksFreq函数打算108MHz分频时忽略了29位,从而得到48MHz,也便是8M/212,那个15不见了。
因此,GD32新手须要修正RCC_GetClocksFreq是为了让频率打算结果为108MHz,从而办理串口乱码问题。
而我用0x0800000分频的时候,MCU实际事情在48MHz,然后在串口那里打算波特率的时候,我利用了108MHz。
两者犯了不同的缺点,导致了相同的结果,然后歪打正着办理了这个问题。
之前很多人让我等比例换算频率,108M是72M的1.5倍,然后在波特率那里也这样算。
但是我不服气,由于F407是168M,也是这个公式。
结论表明:串口乱码的关键是打算波特率的频率必须与实际MCU频率符合!
对付MF系统来说,不能利用USB是不可体谅的,于是我们测试96MHz和120MHz,分别12倍频和15倍频,USB分别2分频和2.5分频,非常好算!
通过Keil调试创造系统成功事情在96MHz和120MHz,但是显示的USB频率有时是64MHz,有时是96MHz/80MHz/120MHz,很是莫名其妙!
PC无法创造USB设备,非常忧郁!
后来无意中清空一次芯片Flash后才明白,原来是TinyBooter事情在120MHz已经启动,但是TinyCLR还跑在72MHz,导致创造不了USB。
重新编译TinyCLR到120MHz后办理问题,创造USB。
并且,在刷写TinyCLR的时候,速率明显加快,大概100k Byte/s实际上这些问题可能不是很难,但是官方没有统一的详细的文档(没有说清楚为什么那样子改)。
事后在网上创造一个信息:

Q:GD32F105/107系列MCU 配置为108MHz有何不同?A:通过Clock configuration register (RCC_CFGR) 中,第21:18位为PLLMUL[3:0],再结合第29位PLLMUL[4]组成5 位的位域来确定PLL 倍频系数,即通过软件配置来定义PLL 的倍频系数,且PLL 输出频率绝对不得超过最高主频(108MHz)。

真是坑爹呀,有木有???120MHz主频,加上Flash零等待,性能提升该当不止50%了吧,对付性能不敷的MF来说,可是极大的利好!
至于是否稳定,咱不懂,直接装上流水线试试!

End.

标签:

相关文章