简介
如果把每个外设都看成独立的个体的话,包括GD32本身。那么时钟就相当于心跳。所以说只要想外设工作,必须先使能其时钟源。
下面主要介绍下系统主频,RTC,看门狗的时钟源,举三反一,其它的问题就对比看下就行了。
时钟树
该图是STM32的时钟树,GD32也差不多,只不过经过锁相环倍频器PLL之后得到108M的SYSCLK,而STM32是72M的频率。
该图是从左往右看,从图中可以看出主要时钟来源有图标的1,2,3,4,分别是:
1:HSI 内部RC振荡器,提供8M时钟频率
2:HSE 外部经过OSC管脚接入的外部时钟,频率范围为4-16M,通过选用8M。1,2都是提供作为系统的时钟源,二选一。
3:LSE 外部时钟源,频率为32.768KHZ,用于RTC时钟源。
4:LSI 内部低速时钟源,用于看门狗时钟源。
主频
主频就是咱们常说的sysclock,如图中间的SYSCLK,他提供整个系统所需的时钟源,当然如果应用到具体的外设,可能已经经过了很多次的分频,图中可以看到AHB,APB1,APB2等分频器。
代码配置逻辑:在GD32的启动文件中我们可以看到如上图所示的部分,先LDR SystemInit之后再跑main函数的。SystemInit函数就是对系统时钟进行初始化的。之后会走到system_clock_config,system_clock_config可以看到选择内部还是外部时钟,并且频率是多少。这里具体寄存器配置不多说,可以看手册,基本不需要修改,顶多改下宏。
RTC
"RTC"是Real Time Clock 的简称,意为实时时钟。实际上就是一个定时器,此处有人肯定有疑问,那RTC掉电是怎么维持数据不变的。这里就涉及到备份区 BKP(RTC模块和时钟配置系统的寄存器是在后备区域的(即BKP),通过BKP后备区域来存储RTC配置的数据可以让其在系统复位或待机模式下唤醒后,RTC里面配置的数据维持不变。),扯远了,这里主要介绍下RTC时钟源。
- 时钟
图中可以看出RTC的时钟来源主要有外部LSE(多为32768),HSE/128(8M/128),LSI(40K)。 - 设置分频
/*
分频计算公式:RTC period = RTCCLK/RTC_PR = (clock)/(psc+1)
例:如果我想要1秒中断一次,选用的时钟为32.768khz,分频就应该设置为32767:
*/
void rtc_prescaler_set(uint32_t psc);
- 中断函数
因为RTC只是个定时器,时间的处理需要我们实时更新,RTC的中断函数是:RTC_IRQHandler (根据上面设置的周期产生中断)