当前位置: 首页 > news >正文

STM32/Delay延时函数编程思路

1 延时函数的作用

延时函数就是让程序在某个位置暂停执行一段指定的时间,然后再继续运行后面的代码,比如在每一个点灯大师入门时都需要经历的流水灯实验,或是等待外设初始化、时序匹配和按键消抖都离不开延时函数。

2 编程思路

目标:本篇文章主要实现延时的初始化、微秒和毫秒级别延时的函数设计;

2.1 初始化

1确定配置哪一个时钟信号为延时函数提供基准。

2确定每微秒需要的时钟周期。

2.2 微秒延时

1 对传入的参数进行校验

2 条件判断避免溢出24寄存器最大值

3 写入(设置)计数器初始值

4 启动硬件递减计数,并等待计数完成

5 失能计数器并清空寄存器

2.3 毫秒延时

调用微秒延时实现毫秒延时

3 代码示例

/*delay.h文件*/ #ifndef __DELAY_H #define __DELAY_H #include "stm32f10x.h" void Delay_Init(void); void DelayUs(uint32_t US); void DelayMs(uint32_t MS); #endif
/*delay.c文件*/ #include "delay.h" static uint32_t CountUs = 0; //1us需要的SysTick周期数 /** * @brief 延时初始化 */ void Delay_Init(void) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //HCLK/8作为SysTick时钟(硬件) uint32_t SysCLK_MHz = SystemCoreClock / 1000000; // 72MHz / 1 000 000 = 72 CountUs = SysCLK_MHz / 8; // 72 / 8 = 9(每微秒9个周期 每毫秒9000个周期 每秒9000 000个周期) } /** * @brief 微秒延时 * @param us延时微秒数 */ void DelayUs(uint32_t US) { if(US == 0) return; uint32_t load_val = US * CountUs - 1; if(load_val > 0x00FFFFFF) load_val = 0x00FFFFFF; //防止溢出24位LOAD寄存器的最大值 SysTick->LOAD = load_val; //将计算好的值写入LOAD寄存器 SysTick->VAL = 0; SysTick->CTRL = 0x01; //使能 无中断 HCLK/8 while(!(SysTick->CTRL & (1 << 16))); //CTRL的第16位是COUNTFLAG,当计数器从1→0时,硬件自动置1。 SysTick->CTRL = 0x00; SysTick->VAL = 0; } /** * @brief 毫秒延时 * @param ms延时毫秒数 */ void DelayMs(uint32_t MS) { while(MS--) { DelayUs(1000); // 复用微秒延时 } }

注:本篇文章以STM32F10系列编写。

注:以上内容仅个人理解,不具备唯一性和绝对正确性,仅供参考。

http://www.jsqmd.com/news/856302/

相关文章:

  • 别再死记硬背了!用一张图帮你理清CPU里的MMU、TLB和Cache到底是怎么分工的
  • 不知道怎么挖漏洞?吐血整理40个网络安全漏洞挖掘姿势,看完不信你还挖不到
  • 离线绘图新选择:draw.io桌面版,让敏感数据不再“上网”
  • 音乐学者紧急预警:Perplexity搜索结果偏差率高达47%?3步校验法立即挽救你的学术引用
  • 初识C语言(一)
  • 2026年5月国内优质招标网推荐:五大平台排名专业评测项目找标防遗漏 - 品牌推荐
  • 原生PHP如何才能提高并发?
  • RX65N嵌入式开发实战:从硬件设计到外设驱动与调试
  • 手把手教你用YOLOv5/PyTorch在DOTA V1.5数据集上训练自己的航拍目标检测模型
  • 别再手动管理数据了!用Codesys ST语言实现一个轻量级队列,5分钟搞定PLC数据缓存
  • Arch linux-nginx_LEMP自动化脚本
  • STM32F103+BTS7960:一个工科生的自动循迹小车避坑实录(附完整代码与调试心得)
  • 2026年5月pof膜品牌推荐:五家产品评测夜班包装防破损 - 品牌推荐
  • 告别死记硬背!用生活化案例图解博途V18中的定时器与计数器(TP/TON/TOF/TONR/CTU/CTD)
  • 把FlashAttention装进昇腾NPU:为啥它能让大模型推理快3倍?
  • AFSIM-模型导入导出-源码级Bug修改
  • 原生PHP到底如何缩短响应时间 TTFB?
  • VisionPro 相机集成与视觉测量
  • 摆脱论文困扰! AI论文工具2026最新测评与推荐
  • 【Perplexity词组搭配查询避坑清单】:8个致命误用场景+3类伪低困惑度陷阱,资深语言工程师紧急预警
  • Visa携手Jason Sudeikis,将足球赛场最简单的进球方式转化为2026年国际足联世界杯的最精彩球迷时刻
  • CSS锚点定位(Anchor Positioning)完全指南:实现精准定位
  • AUTOSAR Ea模块深度解析:EEPROM抽象原理、配置实战与性能优化
  • Win10开发环境搭建必看:彻底解决ping localhost返回::1导致服务启动失败的问题
  • AI Agent Harness Engineering 不是银弹:哪些场景用了 Multi-Agent 反而更差
  • Windows下安装OpenCode并配置oh-my-openagent和superpowers
  • STM32CubeMX 6.14版本保姆级安装教程(附CSDN下载链接,解决官网卡顿)
  • 1987年5月25日晚上23-24点出生性格、运势和命运
  • 昇腾CANN shmem:把多张 NPU 的 HBM 变成一块全局内存
  • HP Z66 G6 外接显示器无信号排查:amdgpu DCN 3.1 EDID 超时与 HDMI 2.1 FRL 协商问题