GD32F407的时钟学习记录
起因: 因工作原因,使用到了国产的GD32F407,顺便学习了下他们的时钟,构成,这里简单讲一下ADC,CAN,SPI的时钟配置问题。
一.GD32F407的时钟全局
这张时序图里面最重要的是时钟AHB,APB1,APB2。
我们的主板在制作时所用的外部晶振为8MHz经过先分频后倍频后,得到了Systemclock,然后再进行一些操作得到AHB,APB1,APB2等时钟
二.我们程序里面的时钟
打开我们的工程,打开
system_gd32f4xx.c
文件可以看到这里定义的系统时钟为168MHz
#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL (uint32_t)(168000000)
而在下面的定义中
/* HXTAL is stable */
/* AHB = SYSCLK */
RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
/* APB2 = AHB/2 */
RCU_CFG0 |= RCU_APB2_CKAHB_DIV2;
/* APB1 = AHB/4 */
RCU_CFG0 |= RCU_APB1_CKAHB_DIV4;
所以:
AHB=168MHz
APB1=42MHz
APB2=84MHz
三.各模块的时钟
3.1 ADC
在时序图里面ADC的时钟源有两个可选
AHB或APB2,翻看手册中ADC模块时钟的介绍
它的意思是当我们选择AHB作为时钟源时,可以选择5/6/10/20分频,当外部时钟最大为200MHz时,那么:
ADC最大频率=AHB/5=40MHZ
当我们选择APB2作为时钟源时我们可以选择2/4/6/8分频
ADC部分的频率我们可以通过代码修改
我们所选的CLK2_DIV6所以是APB2时钟6分频
此时ADC的时钟频率=84/6=14MHz
可供选择的分频有很多
3.2 SPI
在手册中可以看到
SPI 的时钟来自AHB时钟,其时钟频率为168MHz
在程序中配置了其分频
那么程序中SPI的实际频率为=168/32=5.25MHz
可修改的分频有
3.3 CAN
由手册可知:
APB1的最高时钟是50MHz
而实际情况下,我们这块板子APB1的时钟为42MHz.
在手册中波特率计算公式如下:
注:
tq 是时间片
在程序中设置对应的波特率
所以
CANbps=Fpclk/((Tseg1+1)+(Tseg2+1)+1)
CANbps=42000000/8/(16+4+1)=250K