系列文章目录
Github开源地址
从头开始写STM32F103C8T6驱动库(一)——STM32CubeMX创建并调整工程结构
从头开始写STM32F103C8T6驱动库(二)——编写系统初始化程序,配置时钟树
从头开始写STM32F103C8T6驱动库(三)——编写GPIO驱动
从头开始写STM32F103C8T6驱动库(四)——编写延时函数,详解Systick
文章目录
- 系列文章目录
- 前言
-
- 1.Systick定时器介绍
- 2.Systick定时器使用方法
- 3.编写微秒延时程序(delay_us)
- 4.编写毫秒延时程序(delay_ms)
- 5.编写测试程序
前言
上一章我们编写了GPIO驱动函数,但是如果我们想使用GPIO来实现一个流水灯的话还需要一个延时函数,今天我们就来写一下使用Systick实现的系统延时函数
1.Systick定时器介绍
Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的Cortex‐M3芯片都带有这个定时
器,软件在不同 CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(FCLK,
CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。 Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
2.Systick定时器使用方法
该定时器的时钟源可以是内部时钟(FCLK,
CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。不过, STCLK的
具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视
芯片的器件手册来决定选择什么作为时钟源。
——————————————————————————————节选自Cortex‐M3 权威指南
而STM32上所指的STCLK是
RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。通过对SysTick
控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTick时钟。
——————————————————————————————节选自STM32F10xxx参考手册
从上图可以看出SysTick重装载数值寄存器所能写入的最大值为2^24因为没有”uint24″这个数据类型所以我们需要用uint32类型来声明传入参数,但是输入范围必须限制在 0 ~ 2^24
- 对输入参数做单边限幅
- 载入定时器所要计数的值
现在有一个问题就是我们需要向重装载数值寄存器写入多少才是我们想要的时间呢br> 回顾刚才我们所说的,我们使用Systick默认的外部时钟作为时钟源,而在STM32中RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。
这里还需要回顾一下第二章我们所配置的时钟树,详情可见:
从头开始写STM32F103C8T6驱动库(二)——编写系统初始化程序,配置时钟树
4.编写毫秒延时程序(delay_ms)
ms延时要注意计数器数值范围问题,我们可以算一下最大计时时间
2^24 = 16,777,216 / 9,000,000Hz = 1.864135s
也就是说毫秒延时最大为1864ms
具体方法和微妙延时大同小异,代码如下:5.编写测试程序
我们来简单写一个闪灯程序,发现小灯是可以已10Hz频率在闪烁,说明我们的延时数运行正确。
来源:_满心欢喜_
声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!