时钟树
看时钟树的方法
看时钟树要从核心位置CK_SYS系统时钟来看,它分为前半段和后半段,前半段通常与硬件相关,包括振荡器、PLL等时钟生成器;而后半段则涉及总线相关的时钟信号,如AHB、APB等总线的分频或倍频。(预分频器[~Prescaler]可以配置AHB、APB2和APB1域的时钟频率。AHB、APB2、APB1域的最高时钟频率分别为120MHz、120MHz、60MHz)
时钟树的组成部分
1.振荡器:包括外部晶体振荡器和内部RC振荡器,用于提供基础的时钟源。
2.锁相环(PLL):将输入的低频时钟信号倍频至高频,供CPU和其他高速外设使用。
3.时钟源选择逻辑:允许动态选择和切换不同的时钟源。
4.外设时钟门控:控制对外设模块的时钟供应,以节省功耗。
从这张图可以看出,它这种操作保证了所有定时器的时钟源都是120MHz。但是像其他这些APB1,APB2上这些设备PCL K1...那就不一定了。
SysTick(滴答定时器)
SysTick 定时器是一个内置的系统时钟,在 ARM Cortex-M 处理器中用于产生周期性的中断来实现系统时钟滴答计数或延时功能。
SysTick的选择
- RCU通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。
- 通过对SysTick控制和状态寄存器的设置,可选择上述时钟或AHB (HCLK) 时钟作为SysTick时钟。(可以÷8也可以不÷8,÷8就是15MHz,不÷8就是120MHz, 下面这函数默认是不除8的)
SysTick_config函数:
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) {
if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1);
/*检查传入的 ticks 参数减去1后是否大于 SysTick_LOAD_RELOAD_Msk 定义的最大重载值,如果大于则返回1,表示重载值不合法 。*/
SysTick->LOAD = ticks - 1; /*将 ticks 参数减去1后的值写入 SysTick->LOAD 寄存器,即设置 SysTick 定时器的重载值。*/
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /*使用 NVIC_SetPriority 函数设置 SysTick_IRQn 中断的优先级,这里设置为优先级最大值减1。*/
SysTick->VAL = 0; /*将 SysTick->VAL 寄存器值置为0,即清零 SysTick 定时器的计数器值。*/
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
return (0);
}
/* 将 SysTick->CTRL 寄存器设置为 SysTick_CTRL_CLKSOURCE_Msk、SysTick_CTRL_TICKINT_Msk 和 SysTick_CTRL_ENABLE_Msk 的按位或运算结果,即设置时钟源为处理器时钟,使能 SysTick 中断和使能 SysTick 定时器。最后返回0,表示函数执行成功。
这段代码是用于配置 Cortex-M 系列微处理器的 SysTick 定时器的函数。 总的来说,这段代码的作用是配置 SysTick 定时器的重载值、时钟源、使能中断和定时器,并设置相关中断优先级,以实现定时器功能。
检查SysTick位数
注意:查看数据手册|检查SysTick是不是32位,一查它不是32位是24位(即最大值为2的24次方)而且还是向下计数.....
SysTick_Config的参数
其实就是一个时钟次数,叫systick重装定时器的值。意思就是我要多少个1/fosc 时间后中断一下。根据学过的物理中的时间与频率的公式:fosc=1/T T=1/fosc ,fosc为Systick的频率。如果STSystick时钟频率为:72MHz,每次的时间为:T=1/72MHz。1秒钟为:1/(每次的时间)=1/(1/72MHz)=72 000 000次。1MHz是:1000 000。反过来讲。SysTick_Config(72000)代表:72000*(1/72MHz)=1/1000=1(ms)。即定时为1ms。如果需要1S则可以通一设置一个全局变量,然后定初值得为1000,这样每个systick中断一次,这个全局变量减1,减到0,即systick中断1000次,时间为:1ms1000=1S。从而实现1S的定时。 因为SysTick定时器是:24位的,最大定时时间为:2的24次方(1/72MHz)的时间,这里Systick频率为:72MHz的情况下。
SysTick的HAL库
我们需要使用SysTick的HAL库需要打开GD32F303固体库使用指南
(在GD32F30x_Firmware_Library_V2.2.0文件夹中),然后搜索SysTick,就能找到相关的函数。