历史上的今天
今天是:2025年05月18日(星期日)
2018年05月18日 | STM32 SysTick 精确延时(非中断方式)
2018-05-18 来源:eefocus
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);
}
上一篇: STM32单片机(4) 独立看门狗实验
史海拾趣
|
涡轮增压器可以不改变发动机的排量而提高其动力性能,但却存在涡轮滞后现象。为了提高其加速性能,减少涡轮滞后,必须降低旋转体的惯性矩,而最有效的办法是减轻旋转体的质量。因此,许多国家都进行了轻量化新材料的开发研究工作。 1 ...… 查看全部问答> |
|
MRC指令格式为: MRC条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2 MCR指令用于将写处理器寄存器中的数据传送到ARM处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常,其中协处理器 ...… 查看全部问答> |
|
error LNK2001: unresolved external symbol CLSID_RemoteDataAccess Linking... RDAExamDlg.obj : error LNK2001: unresolved external symbol CLSID_RemoteDataAccess RDAExamDlg.obj : error LNK2001: unresolved external symbol IID_ISSCERDA ARMV4IDbg/RDAExam.exe : fatal error LNK1120: 2 unresolved exte ...… 查看全部问答> |
|
我在WinCE5.0下进行网络通信(多播通信),需要禁用回环输出。 调用以下函数: //设置套接字选项,禁止多播数据包回环回馈 /* const int loopback = 0; result = setsockopt(UDPMulticast,IPPROTO_I ...… 查看全部问答> |
|
我的液晶是LM3033DFW,显示不正常,汉字不正常,光标移动,相应的汉字不出现,即使出现也是不争取的乱码 我的液晶是LM3033DFW,显示不正常,汉字不正常,光标移动,相应的汉字不出现,即使出现也是不争取的乱码,我的数据口每接上拉电阻,我用的是STC的STC12C5A32S2,他的数据口有弱上拉功能,会是这个原因吗,哪位遇见过,给说一下,谢谢… 查看全部问答> |
|
百分求救:wdm USB驱动,两个device总是会互相影响 我的电脑上连了两个USB serial class的device,现在一个拔线之后,另一个的write urb传输也会fail掉,请问各位高手是什么原因? 我看到在OnWriteInterrupt里面两个device object都返回fail,但是我只拔出了一个USB device啊。 NTSTATUS StartWri ...… 查看全部问答> |
|
时间控制器的设计 1. 内容 用89S52单片机设计一个时间控制器,有8位数码管显示年月日及时分秒,具有日历 和时钟功能,有一路输出控制电灯,有一路输出控制蜂鸣器,可以设置年月日及时分秒,可以设置一张时间表,该时间表记录什么时间开、关电灯,什 ...… 查看全部问答> |




