STM32基础篇(三)------滴答定时器

滴答定时器简介

SysTick定时器(STK)

处理器有一个24位系统定时器SysTick,它从重新加载值倒计时到零,在下一个时钟沿重新加载(换行)LOAD寄存器中的值,然后对后续时钟倒计时。当处理器暂停调试时,计数器不会递减。

注意这一句:它从重新加载值倒计时到零。意思是我们可以设置一个加载数值,它会冲我们设置的这个价值数值递减。

可以看到AHB的时钟为72MHz,每秒中有72,000,000(7200万)个时钟脉冲。1s=1000ms,1ms = 1000us,则1s = 1000000。则1us会有72个时钟脉冲。

滴答定时器实现延时

可以看到滴答定时器共有下面4个寄存器:

1、SysTick控制和状态寄存器(STK_CTRL)

2、SysTick重新加载值寄存器(STK_LOAD)

3、SysTick当前值寄存器(STK_VAL)

4、SysTick校准值寄存器(STK_CALIB)

STK_CALIB 暂时不需要关注,后续i章节中会解释。

1、STK_CTRL寄存器

可以看到STK_CTRL寄存器中,可编程的有4位分别是COUNTFLAG、CLKSOURCE、TICKINT、ENABLE。

COUNTFLAG:如果自上次读取以来定时器计数到 0,则返回 1。

CLKSOURCE:时钟源选择

       0:AHB/8

       1:处理器时钟 (AHB)

TICKINT : SysTick 异常请求启用

       0:倒计时至零不会断言 SysTick 异常请求

       1:倒计时至零会断言 SysTick 异常请求。

       注意:软件可以使用 COUNTFLAG 来确定 SysTick 是否曾计数至零。

ENABLE : 启用计数器。当 ENABLE 设置为 1 时,计数器从 LOAD 寄存器加载 RELOAD 值,然后倒数。当达到 0 时,它将 COUNTFLAG 设置为 1,并根据 TICKINT 的值可选地断言 SysTick。然后它再次加载 RELOAD值,并开始计数。

       0:计数器禁用

       1:计数器启用

2、SysTick重新加载值寄存器(STK_LOAD)

RELOAD :LOAD 寄存器指定计数器启用时以及计数器达到 0 时加载到 VAL 寄存器中的起始值。

计算 RELOAD 值

RELOAD 值可以是 0x00000001-0x00FFFFFF 范围内的任意值。起始值为 0 是可能的,但没有任何效果,因为 SysTick 异常请求和 COUNTFLAG 在从 1 计数到 0 时被激活。

RELOAD 值根据其用途计算:

1、要生成周期为 N 个处理器时钟周期的多发定时器,请使用 RELOAD 值 N-1。例如,如果每 100 个时钟脉冲需要一次 SysTick 中断,则将RELOAD 设置为 99。

2、要在 N 个处理器时钟周期延迟后发出单个 SysTick 中断,请使用值 N 的RELOAD。例如,如果在 400 个时钟脉冲后需要一次 SysTick 中断,则将 RELOAD 设置为 400。

3、SysTick当前值寄存器(STK_VAL)

CURRENT23:0:当前计数器值,VAL 寄存器包含 SysTick 计数器的当前值。

读取返回 SysTick 计数器的当前值。

写入任何值都会将该字段清除为 0,并且还会将 STK_CTRL 寄存器中的 COUNTFLAG 位清除为 0。

   通过STK_VAL寄存器可以获取当前的计数值,但是向STK_VAL写入任何数值都会将STK_VAL清空,并且会将STK_CTRL寄存器中的COUNTFLAG清0。STK_CTRL寄存器可以控制滴答定时器的开启或关闭,STK_LOAD 寄存器可以设置计数的最大值。

实现Delay_us

c 复制代码
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置计数最大值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

滴答定时器中断

这部分在后续的中断章节中讲述。

相关推荐
我是一棵无人问荆的小草19 小时前
stm32f103单片机的NVIC分组2介绍
stm32·单片机·嵌入式硬件
紫幽20 小时前
从 0 用 Vue 做屏并生成 LVGL 单片机代码(完整源码备忘)
前端·单片机
智者知已应修善业20 小时前
【51单片机数码管逐位显示1-8余位不亮】2024-10-23
c语言·经验分享·笔记·嵌入式硬件·51单片机
Be for thing21 小时前
【嵌入式成长3】STC89C51外部中断|中断原理、寄存器、中断服务函数
单片机·嵌入式硬件·学习
科芯创展1 天前
1A,5.5VIN,同步升降压恒流芯片,XZ3442
单片机
恒锐丰-罗生1 天前
率能半导体 SS6840 单通道 H 桥电机驱动芯片深度解析
驱动开发·嵌入式硬件·硬件工程
9稳1 天前
基于PLC的小车运料装卸控制系统设计
开发语言·网络·数据库·单片机·嵌入式硬件
拾知_H1 天前
STM32+FreeRTOS基础配置
stm32·嵌入式硬件·freertos
智购科技自动贩卖机1 天前
自动售货机硬件主控方案选型实战:单片机、树莓派、ESP32怎么选?
人工智能·单片机·嵌入式硬件·物联网·网络协议·yolo·架构
LCG元1 天前
STM32 多通道 ADC + DMA 采集实战:数据错位、读数跳动的根因与滤波选型
stm32·单片机·嵌入式硬件