STM32 SysTick 精确延时(非中断方式)

SysTick是Cortex-M内核自带的一个24位定时器,所以我们可以在core_cm3.h或core_cm4.h头文件中看到它的寄存器定义和配置函数SysTick_Config()。SysTick的功能非常简单,仅仅提供一个时基功能,支持中断请求,因此它的寄存器寥寥无几。

以下是手册上对SysTick寄存器的介绍:


CTRL为控制寄存器:

ENABLE:使能位

TICKINT: 中断的开关,当计数溢出且TICKINT=1时SysTick将发出中断申请。

CLKSOURCE:时钟选择位,CLKSOURCE=1时选择系统时钟,如果是M3则为72MHz,M4则为168MHz。否侧选择外部时钟作为时钟源。

COUNTFLAG: 溢出标志位,计数到0时置1,而且硬件自动清零。

LOAD为重载值寄存器:

当计数到0时SysTick自动将此寄存器的值加载到VAL寄存器中。注意它是24位的,所以最大值为0XFFFFFF。

VAL为当前值寄存器:

SysTick是从上往下计数的,所以此寄存器的值是递减的。

那么,了解了SysTick的寄存器之后就可以配置它了。首先将CLKSOURCE位置1,选择系统时钟作为时钟源,以M4内核为例,就是168MHz。为了让SysTick每1us溢出一次,就须要把重载值设置为167(168-1)。当需要延时n(us)时,就将ENABLE位置1,让SysTick开始计时,然后等待n次COUNTFLAG标志之后退出就行了。

下面是示例代码:

#include "delay.h"

void delay_config(void)
{
	SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;		//时钟源为系统时钟168MHz
	SysTick->LOAD = 167;					//重载值为168-1,每1us溢出一次
}

void delay_ms(vu32 nTime)
{
	nTime *= 1000;
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;		//使能SysTick,开始计数
	while(nTime--){
		while((SysTick->CTRL&0X010000) == 0);		//等待COUNTFLAG标志位置1
	}
	SysTick->CTRL &= (~SysTick_CTRL_ENABLE_Msk);		//失能SysTick,停止计数
}

void delay_us(vu32 nTime)
{
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
	while(nTime--){
		while((SysTick->CTRL&0X010000) == 0);
	}
	SysTick->CTRL &= (~SysTick_CTRL_ENABLE_Msk);
}


  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值