STM32 SysTick定时器实现精确延时方法
需积分: 0 123 浏览量
更新于2024-08-05
收藏 2KB TXT 举报
"STM32通过SysTick定时器实现精确延时的方法,涉及STM32微控制器、SysTick定时器的配置以及微秒和毫秒级延时的计算与实现。"
在嵌入式开发中,尤其是在实时系统中,精确的延时控制是至关重要的。STM32系列微控制器内置了SysTick定时器,它是一个24位的递减计数器,常用于实现系统的实时调度和延时功能。本资源主要讲解如何利用SysTick定时器在STM32上实现微秒和毫秒级别的精确延时。
首先,SysTick定时器的配置是通过SysTick_CLKSourceConfig()函数完成的。在这个例子中,选择了时钟源为HCLK分频后的时钟,即HCLK/8。通常,STM32的系统时钟SystemCoreClock默认为72MHz,因此分频后得到的SysTick时钟频率为9MHz(72MHz / 8)。这样设置后,SysTick每过1个时钟周期会减1,直到计数器归零。
为了计算出延时所需的计数值,我们需要定义两个变量fac_us和fac_ms。fac_us表示1微秒需要的计数次数,fac_ms表示1毫秒需要的计数次数。这些值可以通过SystemCoreClock和预设的SysTick时钟频率计算得出。例如,在72MHz系统时钟下,fac_us为9(因为9 * 1us = 72MHz / 9MHz),fac_ms为9000(因为9000 * 1ms = 72MHz / 9MHz)。
延时函数delay_init()用于初始化这些变量和SysTick定时器。这个函数中,将SysTick的时钟源设置为HCLK/8,并计算出fac_us和fac_ms的值。
接下来,delay_us()函数实现了微秒级的延时。它首先根据输入的微秒数nus计算出计数器需要加载的值,然后启动SysTick计数。在计数器倒计时过程中,通过循环检测SysTick控制器状态位来判断延时是否结束。当计数器计满并触发中断标志时,循环结束,计数器被关闭并清零。
同样地,delay_ms()函数用于实现毫秒级延时,其原理与delay_us()相似,只是计数器加载的值和循环条件稍有不同。注意,由于SysTick的计数器最大值为0xFFFFFF,所以最大可实现的延时有限。在72MHz系统时钟下,基于fac_us的最大延时约为1864135us(0xFFFFFF / 9),基于fac_ms的最大延时约为1864ms(0xFFFFFF / 9000)。
该资源提供的代码展示了如何在STM32中利用SysTick定时器进行精确的延时控制,这对于需要精确时间间隔的应用场景,如脉冲宽度调制(PWM)、串口通信同步、定时任务执行等,具有很高的实用价值。
435 浏览量
点击了解资源详情
2021-04-11 上传
2024-05-15 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
2021-05-23 上传
2024-08-30 上传
mgj2003
- 粉丝: 0
- 资源: 8
最新资源
- 探索数据转换实验平台在设备装置中的应用
- 使用git-log-to-tikz.py将Git日志转换为TIKZ图形
- 小栗子源码2.9.3版本发布
- 使用Tinder-Hack-Client实现Tinder API交互
- Android Studio新模板:个性化Material Design导航抽屉
- React API分页模块:数据获取与页面管理
- C语言实现顺序表的动态分配方法
- 光催化分解水产氢固溶体催化剂制备技术揭秘
- VS2013环境下tinyxml库的32位与64位编译指南
- 网易云歌词情感分析系统实现与架构
- React应用展示GitHub用户详细信息及项目分析
- LayUI2.1.6帮助文档API功能详解
- 全栈开发实现的chatgpt应用可打包小程序/H5/App
- C++实现顺序表的动态内存分配技术
- Java制作水果格斗游戏:策略与随机性的结合
- 基于若依框架的后台管理系统开发实例解析