0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实现STM32软件精确时间的方法(附源码)

精通单片机与嵌入式 来源:精通单片机与嵌入式 2023-05-08 09:46 次阅读

问题

在进行开发时,程序中常常需要延时一段时间,很多人都会使用Delay(N), N为需要延时的时间(通常为毫秒级)。 通常实现Delay(N)函数的方法为:

for(i = 0; i <= x; i ++);//x --- 对应于N毫秒的循环

对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行for循环时,要实现N毫秒的x值非常大,而且由于系统频率的宽广,很难计算出延时N毫秒的精确值。

针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)。

解决方法

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

在STM32的应用中,使用Cortex-M3内核的SysTick作为定时时钟,设定每一毫秒产生一次中断,在中断处理函数里对N减一,在Delay(N)函数中循环检测N是否为0,不为0则进行循环等待;若为0则关闭SysTick时钟,退出函数。

这样的好处就是:延迟时间将不随系统时钟频率改变。

源代码

初始化相关模块:

SysTick_SetReload(9000); // 设定SysTick达到1ms计数结束
SysTick_ITConfig(ENABLE); // 使能SysTick中断

说明:外部晶振为8MHz,系统时钟为72MHz, SysTick的频率9MHz,SysTick产生1ms的中断

中断处理 :

void SysTickHandler (void)
{
if(TimingDelay!=0x00)
{
  TimingDelay--;
}
}

注意:全局变量TimingDelay必须定义为volatile。

延时代码:

void Delay(u32 nTime) 
{
  SysTick_CounterCmd(SysTick_Counter_Enable); // 使能SysTick计数器
  TimingDelay = nTime; // 读取延时时间
  while(TimingDelay != 0); // 判断延时是否结束
  SysTick_CounterCmd(SysTick_Counter_Disable); // 关闭SysTick计数器
  SysTick_CounterCmd(SysTick_Counter_Clear); // 清除SysTick计数器
}
应用代码
Delay(300); // 延时 300ms
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1372

    浏览量

    40289
  • STM32
    +关注

    关注

    2270

    文章

    10900

    浏览量

    355965
  • 微处理器
    +关注

    关注

    11

    文章

    2263

    浏览量

    82443
  • 计数器
    +关注

    关注

    32

    文章

    2256

    浏览量

    94559
  • 函数
    +关注

    关注

    3

    文章

    4331

    浏览量

    62604

原文标题:【软件】实现STM32软件精确时间的方法(附源码)

文章出处:【微信号:精通单片机与嵌入式,微信公众号:精通单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    发一个超声波测量距离的应用,自己做的,源码

    一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2; 测距模块在电子人单片机开发板 上已成功实现。下面
    发表于 03-04 16:37

    使用MCU内核寄存器实现毫秒级精确延时的方法

    使用MCU内核寄存器实现毫秒级精确延时的方法在进行STM32进行开发时,使用到延时函数的频率非常高,但HAL库只提供了毫秒级的延时函数,最小延时时间
    发表于 08-12 06:53

    stm32使用基本定时器实现精确延时

    stm32中,系统滴答定时器可以实现精确的延时,但有时需要使用基本定时器实现精确延时,保证接下来采取的
    发表于 08-16 07:32

    STM32和TFT彩屏显示图片程序(取模软件)免费下载

    本文档的主要内容详细介绍的是STM32和TFT彩屏显示图片程序(取模软件)免费下载。
    发表于 09-19 17:21 175次下载
    <b class='flag-5'>STM32</b>和TFT彩屏显示图片程序(<b class='flag-5'>附</b>取模<b class='flag-5'>软件</b>)免费下载

    基于STM32、FreeRTOS 实现硬件看门狗+软件看门狗监测多任务的方法

    基于STM32、FreeRTOS实现硬件看门狗+软件看门狗监测多任务的方法
    的头像 发表于 03-12 10:11 9391次阅读

    蜂鸣器播放音乐设计与实现源码

    蜂鸣器播放音乐设计与实现源码
    发表于 04-24 11:00 90次下载
    蜂鸣器播放音乐设计与<b class='flag-5'>实现</b>(<b class='flag-5'>附</b><b class='flag-5'>源码</b>)

    基于51单片机的图书管理系统实现与设计(源码)

    基于51单片机的图书管理系统实现与设计(源码)
    发表于 04-26 10:52 18次下载

    RC663全协议NFC读卡模块资料最新STM32单片机DEMO软件源码资料

    RC663全协议NFC读卡模块资料最新STM32单片机DEMO软件源码资料(单片机解密)-RC663全协议NFC读卡模块资料最新STM32单片机DEMO
    发表于 07-22 13:04 113次下载
    RC663全协议NFC读卡模块资料最新<b class='flag-5'>STM32</b>单片机DEMO<b class='flag-5'>软件</b><b class='flag-5'>源码</b>资料

    STM32单片机SysTick实现精确延时

    STM32单片机SysTick实现精确延时
    发表于 11-23 18:21 11次下载
    <b class='flag-5'>STM32</b>单片机SysTick<b class='flag-5'>实现</b><b class='flag-5'>精确</b>延时

    STM32语音控制小车(文末代码)

    STM32语音控制小车(文末代码)
    发表于 12-03 09:21 28次下载
    <b class='flag-5'>STM32</b>语音控制小车(文末<b class='flag-5'>附</b>代码)

    STM32学习之STM32cubeMX软件安装与使用(STM32cubeMX5.2.1下载地址)

    STM32学习之STM32cubeMX软件安装与使用(STM32cubeMX5.2.1下载地址)
    发表于 12-07 11:51 28次下载
    <b class='flag-5'>STM32</b>学习之<b class='flag-5'>STM32</b>cubeMX<b class='flag-5'>软件</b>安装与使用(<b class='flag-5'>附</b><b class='flag-5'>STM32</b>cubeMX5.2.1下载地址)

    QMC5883L磁力计介绍(硬件+软件)(STM32程序~~~)

    QMC5883L磁力计介绍(硬件+软件)(STM32程序~~~)
    发表于 12-08 10:51 83次下载
    QMC5883L磁力计介绍(硬件+<b class='flag-5'>软件</b>)(<b class='flag-5'>附</b><b class='flag-5'>STM32</b>程序~~~)

    STM32实现毫秒级精确延时的方法

    使用MCU内核寄存器实现毫秒级精确延时的方法在进行STM32进行开发时,使用到延时函数的频率非常高,但HAL库只提供了毫秒级的延时函数,最小延时时间
    发表于 12-09 13:06 21次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>实现</b>毫秒级<b class='flag-5'>精确</b>延时的<b class='flag-5'>方法</b>

    cpu224 stm32源码,226 PLC STM32单片机源码

    cpu224 stm32源码,226 PLC STM32单片机源码
    发表于 12-20 18:43 76次下载
    cpu224 <b class='flag-5'>stm32</b><b class='flag-5'>源码</b>,226 PLC <b class='flag-5'>STM32</b>单片机<b class='flag-5'>源码</b>

    STM32入门:软件 SPI 源码分享

    软件 SPI 源码分享项目需求,只需要软件 SPI 的写入功能,后面有时间了再把读取功能补上。spi.h//spi.h#ifndef __SPI_H#define __SPI_H#in
    发表于 12-22 19:24 11次下载
    <b class='flag-5'>STM32</b>入门:<b class='flag-5'>软件</b> SPI <b class='flag-5'>源码</b>分享