使用系统定时器SysTick实现精确延时微秒和毫秒函数

简介: 使用系统定时器SysTick实现精确延时微秒和毫秒函数

640.jpg


SysTick定时器简介

SysTick定时器是存在于系统内核的一个滴答定时器,只要是ARM Cortex-M0/M3/M4/M7内核的MCU都包含这个定时器,它是一个24位的递减定时器,当计数到 0 时,将从RELOAD 寄存器中自动重装载定时初值,开始新一轮计数。使用内核的SysTick定时器来实现延时,可以不占用系统定时器,由于和MCU外设无关,所以代码的移植,在不同厂家的Cortex-M内核MCU之间,可以很方便的实现。而东芝的这款TT_M3HQ开发板使用的TMPM3HQFDFG芯片,正好是ARM Cortex-M3内核,所以以前使用的延时函数,可以直接拿过来使用,无需任何修改。


精确延时函数的实现

在core_cm3.h文件中,有这样一个SysTickConfig函数:

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
  {
    return (1UL);                                                   /* Reload value impossible */
  }
  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
  return (0UL);                                                     /* Function successful */
}


通过后面的注释也可以看出,这是对SysTick定时器进行初始化,配置初始计数值,使能中断,使能定时器等。对应的中断函数为:

void SysTick_Handler(void)
{   


这个默认是空的,需要我们自己来实现。

如果SysTick初始化为:

SysTick_Config(SystemCoreClock / 1000);     //定时1ms


即SysTick定时器每1ms中断一次,如果我们定义全局变量,然后在中断函数中,让此变量递减,而在延时函数中,一直判断此变量是否减到了0,那么这样就实现了一个延时毫秒的函数。同理改变定时器的计数值为:

SysTick_Config(SystemCoreClock / 1000000);  //定时1us


那么就实现了每1us中断一次,所以延时微秒和延时毫秒函数的实现:

uint32_t fac_us=0;                          //us延时倍乘数
uint32_t fac_ms=0;                          //ms延时倍乘数,在ucos下,代表每个节拍的ms数
void delay_init(void)
{
    SystemCoreClockUpdate();        //可以省略
}
void SysTick_Handler(void)
{
    if(fac_us) fac_us--;
    if(fac_ms) fac_ms--;
}
void delay_us(uint32_t nus)
{   
    SysTick_Config(SystemCoreClock / 1000000);  //定时1us
    fac_us = nus;
    while(fac_us != 0);  
}
void delay_ms(uint32_t nms)
{                 
    SysTick_Config(SystemCoreClock / 1000);     //定时1ms
    fac_ms = nms;
    while(fac_ms != 0);             
}


在使用延时函数之前,只需要进行系统时钟的更新即可,当然也可以不更新,因为在程序之前之前,系统启动文件中已经执行了系统时钟更新。


总结

由于SysTick定时器是所有的ARM Cortex-M内核MCU都有的一个定时器,所以以上延时微秒和延时毫秒的函数适用于任何 Cortex-M内核的MCU。有了精确延时函数,那么使用通用GPIO软件模拟一些通信协议,如IIC、SPI等串行协议,就可以驱动很多硬件设备了,如EEPROM、温湿度传感器、显示屏等等。




目录
相关文章
|
人工智能 自然语言处理 算法
国产新型AI编程助手—DevChat AI插件在VSCode中的应用
国产新型AI编程助手—DevChat AI插件在VSCode中的应用
1235 0
|
11月前
|
存储 人工智能 Android开发
为什么微信发送的APP安装不了,.apk转化为.apk.1
微信发送的APP文件常被改为.apk.1格式导致无法安装,推荐使用夸克或QQ浏览器解决。
1778 14
|
算法
数论基础一一同余定理
同余定理是数论中的重要概念,用于判断两数对同一模数的余数是否相同,记作 \(a \equiv b \ (\text{mod } m)\)。其核心性质包括加减性和乘性,广泛应用于优化前缀和相关问题。本文通过三道例题详细解析同余定理的应用:1)蓝“k倍区间”,利用哈希表记录余数出现次数,将时间复杂度从 \(O(n^2)\) 降至 \(O(n+k)\);2)题“Subsequences Summing to Sevens S”,通过正序与倒序遍历寻找最长区间;3)AtCoder D题“Pedometer”,断环为链结合同余定理解决环形步数统计问题。这些实例展示了同余定理在算法竞赛中的高效应用。
598 0
|
机器学习/深度学习 人工智能 自然语言处理
解决RAG检索瓶颈:RAPL线图转换让知识图谱检索准确率提升40%
本文探讨了RAPL框架,一种创新的人工智能架构,用于改进知识图谱环境下的检索增强生成系统。RAPL通过线图转换和合理化监督技术,构建高效且可泛化的检索器,显著提升大型语言模型在知识问答中的准确性和可解释性。文章分析了现有RAG系统的缺陷,即最短路径并非总是合理路径,并提出RAPL的三步解决方案:利用大型语言模型生成高质量训练数据、将知识图谱转换为线图以实现基于路径的推理,以及通过双向图神经网络进行路径检索。实验结果表明,RAPL不仅提高了检索精度,还缩小了小型与大型语言模型间的性能差距,推动了更高效、透明的AI系统发展。
307 4
解决RAG检索瓶颈:RAPL线图转换让知识图谱检索准确率提升40%
|
监控 数据可视化 搜索推荐
有哪些好用的流程管理工具?帮你快速搞定复杂工作流程
在职场中,流程管理是企业高效运转的核心。本文测评了五款热门流程管理工具:板栗看板、Trello、Asana、Jira 和 Notion,从功能、易用性和适用场景等方面进行全面分析,帮助你选择最适合的工具,提升团队协作和项目管理效率。
700 0
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
489 10
|
API 语音技术
基于Asterisk和TTS/ASR语音识别的配置示例
本文介绍了如何在Asterisk服务器上配置TTS(文本转语音)和ASR(自动语音识别)引擎,包括安装Asterisk、选择并配置TTS和ASR引擎、编辑Asterisk配置文件以实现语音识别和合成的功能,以及测试配置的有效性。具体步骤涉及下载安装包、编辑配置文件、设置API密钥等。
1110 1
|
机器人 测试技术 数据库
聊一聊,Python自动化测试框架
在Python语言系中,有很多可用的自动化测试框架,比如早期大多数人会选用 unittest+HTMLTestRunner、Nose等,最近几年比较常用的有Robot Framework,Robot Framework它是Python下一款非常通用的测试框架,采用扩展插件的机制可以帮助我们实现几乎任何类型的自动化测试工作,如接口自动化测试、App自动化测试、Web UI自动化测试等。
1174 0
|
程序员
stm32f407探索者开发板(二十一)——窗口看门狗
stm32f407探索者开发板(二十一)——窗口看门狗
896 0

热门文章

最新文章