stm32实现毫秒ms微秒us级延时

上一篇文章简单捋了一下32时钟初始化的过程,对systick嘀嗒定时器有了一定的了解吧

实现方法有很多种,推荐一个博客:https://blog.csdn.net/u011878611/article/details/107304203/

我自己在此基础上实现的贴一下,就当存档了(主要参考上面这个博客完成的,向大佬致敬)

【有一点需要注意:使用systick自定义了延时函数,HAL库定义的HAL_Delay就不能用了,因为已经改变了systick的配置,HAL_Delay也是依靠systick来工作的】

delay.c

#include "delay.h"void delay_ms(uint32_t nms)
{//法2:没有最大时延限制uint32_t i = 0;SysTick_Config(SystemCoreClock / 1000);//1ms置位一次for(i = 0; i < nms; i++){while(!( SysTick->CTRL&(1<<16) ));}SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器//法1:最大延时为:nms<=1864ms        uint32_t ms_ = SystemCoreClock / 1000U;    //ms级延时基数uint32_t us_ = ms_ / 1000U;                               //us级延时基数   SysTick->LOAD=(uint32_t)nms*ms_ - 1;                //时间加载,SysTick->LOAD为24位寄存器,所以,最大延时为:nms<=1864ms           SysTick->VAL=0x00;                                         //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;     //开始倒数   while(!( SysTick->CTRL&(1<<16) ));                    //等待时间到达     SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器SysTick->VAL =0X00;                                              //清空计数器}void delay_us(uint32_t nus)
{//法2:没有最大时延限制,但是SystemCoreClock不能太低,32M不行,64M或更高可以(具体临界值多少没有测量)//具体原因应该是频率太低,导致while循环里面还没有识别到标志位置位,该标志位就被systick清除了uint32_t i = 0;SysTick_Config(SystemCoreClock / 1000000);//1us置位一次for(i = 0; i < nus; i++){while(!( SysTick->CTRL&(1<<16) ));}SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;     //关闭计数器//法1:最大延时为:nus<=1864135us,低频率也行uint32_t ms_ = SystemCoreClock / 1000U;    //ms级延时基数uint32_t us_ = ms_ / 1000U;                           //us级延时基数SysTick->LOAD=(uint32_t)nus*us_-1;                     //时间加载,SysTick->LOAD为24位寄存器,所以,最大延时为:nus<=1864135us            SysTick->VAL=0x00;                                         //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;     //开始倒数    while(!( SysTick->CTRL&(1<<16) ));                   //等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器SysTick->VAL =0X00;                                              //清空计数器 }

总结:

  • 知识呀,不用真的会忘的。就像这个systick,我之前读过的《Cortex-M3权威指南》里面是有介绍的,但是要实现ms、us延时的时候一点印象都没有,如果不是在网上找到了别人用systick,我还想着傻傻的用定时器去做延时呢哈哈。暂且原谅自己吧,谁不会忘呢?用到了再学呗!冲冲冲!

使用过程中遇到的问题:

  • 自定义延时改变了systick的配置,甚至用过之后关闭了计时器,那么系统时钟会不会受到影响呢?比如函数超时检测,用的就是以systick为1ms为时基的
  • systick用作时基的方式:配置了中断,每次中断就调用HAL_IncTick()来为一个全局变量+1,需要用到时间时,读取这个值两次即可得到时间差
  • 现在把systick定时器关了,HAL_GetTick()函数获取的uwTick数值一直是不变的了,所以永远不会超时!!经测试确实如此!

为了实现定时函数,把其他函数需要使用的时基关闭了??

  • 一种解决方法:延时使用完毕后把systick配置为原始状态,只是在使用延时的时候占用systick。经测试,可行!
  • 更改后的配置如下:
void delay_ms(uint32_t nms)
{//法2:没有最大时延限制uint32_t i = 0;SysTick_Config(SystemCoreClock / 1000);//1ms置位一次for(i = 0; i < nms; i++){while(!( SysTick->CTRL&(1<<16) ));}//SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;      //关闭计数器HAL_InitTick(uwTickPrio);//将systick配置为系统最初配置的状态(这个函数在HAL_RCC_ClockConfig()函数的最下面拷过来的)}

stm32实现毫秒ms微秒us级延时相关推荐

  1. python实现亚毫秒(微秒)级延时

    python实现亚毫秒(微秒)级延时 python的常用延时函数为time.sleep,最小延时精度为0.001秒,即time.sleep(0.001)延时为1毫秒,在windows10操作系统下,逻 ...

  2. STM32 CubeMX如何生成微秒(us)级延时

    会自动在tim.c里面生成代码,如下: /* Includes ------------------------------------------------------------------*/ ...

  3. ms和us级延时函数的实现

    ms和us级延时函数的实现 2020 Sept. 8th 用sysTick实现延时 寄存器说明参考火哥(膜拜)的这篇博客:第18章 SysTick-系统定时器 用中断输出: //调用core_cmX. ...

  4. 一、STM32用HAL库实现uS级延时

    一.应用场景 STM32CubeMX可视化初始化配置,结合 HAL 库,给STM32软件开发提高了效率,但 HAL 库封装的延时函数目前仅支持 mS 级别的延时,日常很多情况下会用到 uS延时,比如I ...

  5. 秒(s) 毫秒(ms) 微秒(μs) 纳秒(ns) 皮秒(ps)及Java获得

    Date date=new Date();  long hm=date.getTime(); //获取毫秒 或者 毫秒级:System.currentTimeMillis() 纳秒级: System. ...

  6. 时钟周期及秒(s) 毫秒(ms) 微秒(μs) 纳秒(ns) 皮秒(ps)之间转换

    1秒=1000毫秒(ms)  1毫秒=1/1,000秒(s)  1秒=1,000,000 微秒(μs)  1微秒=1/1,000,000秒(s)  1秒=1,000,000,000 纳秒(ns)  1 ...

  7. 区别:秒s、毫秒ms、微秒μs、纳秒ns、皮秒ps、飞秒fs每两级之间的换算以及之间的关系

    时间在线换算 点我 秒.毫秒.微秒.纳秒.皮秒.飞秒每两级之间的均为1000 汉语单位 英语单位 之间关系 进率换算(和秒s的关系换算) 秒 s 1 s=1000ms =10^3ms 1s 毫秒 ms ...

  8. 无需另配定时器在STM32 HAL下实现微秒级延时(兼容FreeRTOS)

    目录 前言 一.代码部分 二.使用和验证 1.引入头文件 2.初始化 3.使用和验证 三.可移植性 总结 前言 接触HAL库差不多两年了,一直苦于HAL库没有自带微秒级的延时,网上的前辈们给出的解决方 ...

  9. stm32实现Systick的毫秒级延时和微妙级延时

    学习目标: stm32实现Systick的毫秒级延时和微妙级延时 学习内容: 1.Systick 工作原理 Systick(系统定时器)是ARM Cortex M3/M4 内核的一个外设,因为所有的C ...

最新文章

  1. Visual C++ 2012编译器更新(预览版)发布
  2. 经典排序算法 - 冒泡和快排总结
  3. Android 实现文件上传功能(upload)
  4. 当要将其他类型转成String类型时候 看String的方法
  5. ubuntu运行Faster R-CNN
  6. Python习题10
  7. 「递归」第3集 | 向善的信念,让技术自带光芒
  8. jenkins没安装git报错
  9. spring注解-声明式事务
  10. openstack租户管理_几大OpenStack的精华问答 | OpenStack都有哪些基础服务?
  11. php jwt使用案例,PHP JWT初识及其简单示例
  12. 老男孩Linux67期第一课
  13. excel英文自动翻译成中文教程
  14. stm32正点原子和普中或是野火哪个好?
  15. php合成flv,用php将任何格式视频转为flv
  16. iPhone X电池性能如何:双电池与无线充电的博弈
  17. (十二)苏世民:我的经验和教训:苏世民带领黑石走向巅峰的十大管理原则
  18. Window 的标志
  19. java google map_java如何通过google map api实现地址解析
  20. NFT火力暂停,休息一下?

热门文章

  1. 如何在word 插入矢量图
  2. 【博文汇总】Java程序设计语言
  3. 怎么更改计算机 盘符名称,怎么更改盘符,windows修改盘符方法
  4. lower_bound()/upper_bound()函数(C++)
  5. String ends with?
  6. 【Matlab】牛顿迭代法实现
  7. OMAPL138 + SPARTAN6 DSP+ARM+FPGA开发例程
  8. 关于JS中的内存溢出与内存泄漏
  9. 行人重识别(Person re-identification)概述
  10. C# 事件函数参数(object sender, EventArgs e)