基于寄存器配置STM32SysTick+精准延时案例

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、Systick:系统滴答定时器是什么?

Cortex-M3 的内核中包含一个 SysTick 时钟。SysTick 为一个 24 位递减计数器,SysTick 设定初
值并使能后,每经过 1 个系统时钟周期,计数值就减 1。计数到 0 时,SysTick 计数器自动重装
初值并继续计数,同时内部的 COUNTFLAG 标志会置位,触发中断 (如果中断使能情况下)。

二、相关寄存器:

  1. CTRL控制寄存器(有一个易错点,很重要):

SysTick控制及状态寄存器(地址:0xE000_E010)(32位),由于SysTick的时钟源是固定
(提前配置好的SYSCLK分频后的时钟),所以ST公司将位2设置为了分频选项,0表示8分频,
1表示不分频,一般就是用8分频后的9MHz时钟。

在这里插入图片描述

  1. SysTick:重载数值寄存器:一般设置为 9*微秒 ,8分频后,时钟为9MHz,即1微秒记9个数,所以这个9就是这样来的
    在这里插入图片描述
  2. SysTick当前数值寄存器(地址:0xE000_E018)(24位):一般用不上
    在这里插入图片描述
  3. SysTick校准数值寄存器(地址:0xE000_E01C)(32位):一般用不上
    在这里插入图片描述
  4. SysTick校准数值寄存器(地址:0xE000_E01C)(32位):一般用不上
    在这里插入图片描述

三、延时案例(代码):

#include "stm32f10x.h"


/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	
	SysTick->LOAD = 9 * xus;				//设置定时器重装值,72MHz 8分频后9HMz,即一微秒记9个数
	SysTick->VAL = 0x00;					//清空当前计数值,清空后会自动装入重载值
	SysTick->CTRL = 0x00000001;				//位2设置为0,8分频,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0,第16位为计数标志位,数到0后置1,下次读操作自动置0
	SysTick->CTRL = 0x00000000;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
}

四、总结

使用SYSTICK可以精准的做到微秒级延迟,缺点就是在操作系统中不能用(或者可以用,只是我还不会用),由于操作系统(如FreeRTOS)中用的是SYSTICK作为系统时间片(计时,一般一个时间片1ms),所以在有操作系统的情况下,不能用SYSTICK计时,可以选用软件计时或者TIM计时。对于裸机来说,SYSTICK即方便又精准。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的喷火龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值