时钟树与SysTick

时钟树

8ef6c6d7017a4921b5ab17bd6e2139f2.png

看时钟树的方法

看时钟树要从核心位置CK_SYS系统时钟来看,它分为前半段和后半段,前半段通常与硬件相关,包括振荡器、PLL等时钟生成器;而后半段则涉及总线相关的时钟信号,如AHB、APB等总线的分频或倍频。(预分频器[~Prescaler]可以配置AHB、APB2和APB1域的时钟频率。AHB、APB2、APB1域的最高时钟频率分别为120MHz、120MHz、60MHz)

时钟树的组成部分

1.振荡器:包括外部晶体振荡器和内部RC振荡器,用于提供基础的时钟源。

2.锁相环(PLL):将输入的低频时钟信号倍频至高频,供CPU和其他高速外设使用。

3.时钟源选择逻辑:允许动态选择和切换不同的时钟源。

4.外设时钟门控:控制对外设模块的时钟供应,以节省功耗。

38efcd96df3742dfafb02317a3665f08.png

从这张图可以看出,它这种操作保证了所有定时器的时钟源都是120MHz。但是像其他这些APB1,APB2上这些设备PCL K1...那就不一定了。

◼ 4到32MHz外部高速晶体振荡器(HXTAL)
◼ 内部8MHz RC振荡器(IRC8M)
◼ 内部48MHz RC振荡器(IRC48M)
◼ 32,768 Hz外部低速晶体振荡器(LXTAL)--->CK_RTC
◼ 内部40KHz RC振荡器(IRC40K)--->CK_FWDGT(看门狗)

SysTick(滴答定时器)

SysTick 定时器是一个内置的系统时钟,在 ARM Cortex-M 处理器中用于产生周期性的中断来实现系统时钟滴答计数或延时功能。

SysTick的选择

  1. RCU通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。
  2. 通过对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次方)而且还是向下计数.....

25145b5f94b74512a13b43232bd55760.png


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,就能找到相关的函数。2b636809a1c04a00b294edf5c732a9d3.png

注意:找到相应的函数后,要看它具体属于哪个库函数,从图可以看出它属于 MISC库函数,知道后 在工程中的HAL文件夹中加入misc.c文件(引用c文件),做完这个后还要 在CMSIS中的gd32f30x_libopt.h文件中"#include "gd32f30x_misc.h"加进来(引用头文件)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值