一、简介
本实验默认主频设置的是72Mhz,具体请参考“GD32F103时钟树配置分析”
GD32F103时钟配置分析_gd32f130 定时器-CSDN博客
SystemCoreClock,这个变量默认是72000000
SysTick:也叫系统滴答定时器(也就是周期性溢出的时基定时器)
SysTick是一个24为的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值。只要把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。
二、寄存器介绍如下
2.1、基础寄存器描述
2.2、中断寄存器描述
这里“悬起”可以理解为暂停或阻止SysTick定时器的计数。当SysTick定时器被悬起时,它会停止当前的计数操作,不再产生新的定时器中断(直到它被重新启动)。
2.3、介绍
CM3允许为SysTick提供两个时钟源以供选择。第一个是内核的“自由运行时钟”FCLK。“自由”表现在它不来自系统时钟HCLK,因此在系统时钟停止时FCLK也继续运行。第二个是一个外部的参考时钟。但是使用外部时钟时,因为它在内部是通过FCLK来采样的,因此其周期必须至少是FCLK的两倍(采样定理)。很多情况下芯片厂商都会忽略此外部参考时钟,因此通常不可用。通过检查校准寄存器的位[31](NOREF),可以判定是否有可用的外部时钟源,而芯片厂商则必须把该引线连接至正确的电平。
当SysTick定时器从1计到0时,它将把COUNTFLAG位;而下述方法可以清零:
读取SysTick控制及状态寄存器(STCSR)
往SysTick当前值寄存器(STCVR)中写任何数据
其他请参考“Cortex M3权威指南(中文).pdf”
三、初始化SysTick定时器
3.1、用最简单的方式让SysTick工作起来
更具上面寄存器描述我们其实只需要打开“控制及状态寄存器的使能位(ENABLE)就可以了”,但是这里有一个问题,由于我们重载数值寄存器的复位值为0,所以只打开使能位,SysTick定时器无意义,所以我们最少需要打开“控制及状态寄存器位[0](ENABLE)”和给"重装载数值寄存器写一个1-0xffffff的值"
下面我们来试一下用最少的操作让SysTick工作起来
结构体介绍
这里我们可以看到我们使用SysTick_Config函数进行配置,配置完成后,一直在systick_config的while循环中倒计时,每次计数到0时,就会把SysTick->LOAD中的值再次给SysTick->VAL,这里可以看出“SysTick控制及状态寄存器”和“SysTick重装载数值寄存器”和我们设置的一样。
这里为什么SysTick->CTRL是控制及状态寄存器,因为SysTick的地址是0xE000 E010,所以SysTick->CTRL=0xE000 E010,由于SysTick_Type结构体的每个变量都是4字节,所以SysTick->LOAD=0xE000 E010+0x04=0xE000 E014也就是“从装载数值寄存器”
问题1:这里有个问题,为什么上述说外部时钟我们可以思考一下,我们设置的是外部时钟源(STCLK),外部时钟源是多少呢,又是从什么地方来的呢?这个问题我会在最后面说清楚。
3.2、常见的SysTick初始化
我们根据程序计算我们主频是72Mhz 也就是1秒钟有72MHz个脉冲,如果我们要延时1ms应该给“SysTick重装载数值寄存器”写入多少呢
由于主频是72Mhz,所以1S/72Mhz≈0.0138889微妙,我们延时1ms,1000/0.0138889=71999.94个脉冲,所以SystemCoreClock/1000就等于1ms一次中断。
问题2:但是根据时钟树那里明明有一个8分频,但是为什么没有起作用呢。
四、问题解答和补充
因为ST公司把“SysTick控制及状态寄存器”的CLKSOURCE的时钟选择位修改成了分频系数选择,具体查看如下寄存器:
问题1:因为CLKSOURCE被ST公司修改了,所以选择外部时钟源,其实就是使能了SysTick的分频 72MHz/8=9MHz
问题2:如果需要启用8分频只需要把CLKSOURCE设置为0就行了
参考:GD 32 系統Systick定时器_gd32 systick-CSDN博客
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_44501991/article/details/143285081
|