[研电赛技术支持] GD32F103 sysTick学习

[复制链接]
1540|2
 楼主| tpgf 发表于 2024-10-29 12:09 | 显示全部楼层 |阅读模式
一、简介
本实验默认主频设置的是72Mhz,具体请参考“GD32F103时钟树配置分析”

GD32F103时钟配置分析_gd32f130 定时器-CSDN博客

SystemCoreClock,这个变量默认是72000000

SysTick:也叫系统滴答定时器(也就是周期性溢出的时基定时器)

SysTick是一个24为的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值。只要把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。

6735067205ffc1b7be.png

二、寄存器介绍如下
2.1、基础寄存器描述

416467205ff415b06.png

2.2、中断寄存器描述

4752667205febb6bde.png

这里“悬起”可以理解为暂停或阻止SysTick定时器的计数。当SysTick定时器被悬起时,它会停止当前的计数操作,不再产生新的定时器中断(直到它被重新启动)。

7392367205fe615bc9.png

9480067205fe24648d.png

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工作起来

结构体介绍

8657467205fd857995.png

1237967205fd0e1636.png

2431567205fcbbfe26.png


这里我们可以看到我们使用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初始化

3517667205fc54d8f2.png

2482967205fbf213f7.png

我们根据程序计算我们主频是72Mhz 也就是1秒钟有72MHz个脉冲,如果我们要延时1ms应该给“SysTick重装载数值寄存器”写入多少呢

由于主频是72Mhz,所以1S/72Mhz≈0.0138889微妙,我们延时1ms,1000/0.0138889=71999.94个脉冲,所以SystemCoreClock/1000就等于1ms一次中断。

问题2:但是根据时钟树那里明明有一个8分频,但是为什么没有起作用呢。



四、问题解答和补充
因为ST公司把“SysTick控制及状态寄存器”的CLKSOURCE的时钟选择位修改成了分频系数选择,具体查看如下寄存器:

826267205fb857cca.png


问题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

4096367205eb05a1d8.png
8604767205ebbe4dee.png
6817467205ec2c5578.png
1858867205ed9a5bc9.png
3676867205ed2497da.png
6737067205ef34b97f.png
423867205efb179fb.png
265167205f01cb1ed.png
5889067205f09525de.png
3320667205f0ea048a.png
3328967205f175d6fb.png
2648867205f1b4e422.png
5606967205f206e942.png
8497367205f291ff9b.png
yangjiaxu 发表于 2024-10-29 15:25 | 显示全部楼层
话说,GD的系统滴答定时器和ST的滴答定时器逻辑和配置原理都是一样的吧
星辰大海不退缩 发表于 2024-10-31 11:22 | 显示全部楼层
系统滴答定时器使用很方便
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2384

主题

17635

帖子

21

粉丝
快速回复 在线客服 返回列表 返回顶部