首页/新闻资讯/正文详情

使用通用定时器实现延时函数遇到的问题

发布时间:2026/9/27 6:45:01 来源:云帆数科 栏目:资讯中心
使用通用定时器实现延时函数遇到的问题
1 需求使用TIM2定时器实现毫秒级延迟实现原理定义全局计数器定时器中断触发中断服务函数在中断里对计数器加一操作直到累加的数值和期望延时的数字相同2 实现流程需要用到的外设有TIM2定时器通过0.96寸OLED屏幕IIC通信通过延时显示不同字符串来验证延时功能是否正常3 代码实现流程先准备好测试用字符串hello world1 hello world2 12345678987654321 三个字符串 然后在显示函数之间插入要使用的延时函数主函数主要进行调用写好的功能函数和初始化等函数具体的实现和声明等操作在功能文件中编写本次实验重点部分在Tim文件的实现Tim文件的具体实现流程是初始化tim外设比如开启始终配置分频数 计数值等配置优先级分组优先级配置然后是能定时器中断编写中断服务函数然后中断函数里进行计数器加一操作易错点delay_ms延时函数的实现最开始我直接使用全局计数器和需要进行延时的数值进行比较导致功能无法正常工作后来查资料才知道上电之后计数器就在运行了所以如果直接使用这个值是错误的要在进入延时函数的时候获取到的计数值然后进行当前计数值和最开始的这个计数值比较如果达到了延时需要的数值就结束循环这种实现属于阻塞CPU的操作延时期间CPU不能作其他操作非阻塞方式就是采用轮询的方式看当前的计数值与开始值的差值比如这段伪代码// 使用示例不要直接调用Delay_ms用标记判断 uint32_t tick_start; tick_start tim_ms; if(tim_ms - tick_start 500) { // 500ms到了执行oled刷新 }4 实验代码展示//main函数#include stm32f10x.h // Device header//#include Delay.h#include OLED.h#include Tim2.hint main(void){OLED_Init();Tim2_Init();//实现延迟函数 如果是在操作系统中 就可以使用systick来进行延时操作OLED_ShowChar(1,1,A);OLED_ShowString(2,1, hello world1);delay_ms(1000);OLED_ShowString(2,1, hello world2);delay_ms(1000);OLED_ShowString(2,1, 1234567898765432);// 最长16位//OLED_Clear();while(1){}}//定时器函数#include stm32f10x.h#include Tim2.hvolatile uint32_t tim_ms 0; // 全局毫秒计数器void Tim2_Init(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;NVIC_InitTypeDef NVIC_InitStruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// 72M时钟PSC71, ARR999 → 1ms溢出中断TIM_TimeBaseInitStruct.TIM_Period 999; // ARRTIM_TimeBaseInitStruct.TIM_Prescaler 71; // PSCTIM_TimeBaseInitStruct.TIM_ClockDivision TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_RepetitionCounter 0;TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStruct);TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);TIM_Cmd(TIM2, ENABLE);NVIC_InitStruct.NVIC_IRQChannel TIM2_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority 1;NVIC_InitStruct.NVIC_IRQChannelSubPriority 1;NVIC_InitStruct.NVIC_IRQChannelCmd ENABLE;NVIC_Init(NVIC_InitStruct);}// 定时器中断服务函数每1ms进来一次void TIM2_IRQHandler(void){if(TIM_GetITStatus(TIM2,TIM_IT_Update) ! RESET){TIM_ClearITPendingBit(TIM2,TIM_IT_Update);tim_ms; // 毫秒计数1}}//毫秒延迟函数void delay_ms(uint32_t num){uint32_t start tim_ms; // 保存进入函数时的时间点while( (tim_ms - start) num ){;}}

相关推荐

做护肤的网站有哪些?一文搞懂避坑与建站全指南
做护肤的网站有哪些?一文搞懂避坑与建站全指南

做护肤的网站有哪些?一文搞懂避坑与建站全指南 上周刚帮一个做功效型护肤品的小老板救火,他的官网首页突然挂满了博彩广告,后台被锁死,客户投诉电话被打爆。他急得满头汗问:“网站被黑挂马不知道怎么办,数据全没了?”这种惊魂未定的时刻,很多新手站长… · 2026/9/27 6:45:01

Observal CLI命令速查表:15个高频命令掌握Agent安装、扫描与故障诊断
Observal CLI命令速查表:15个高频命令掌握Agent安装、扫描与故障诊断

Observal CLI命令速查表:15个高频命令掌握Agent安装、扫描与故障诊断 【免费下载链接】Observal Observal is self-hosted registry for your coding agent extensions with a built in insight engine. Setup Observal, define the scope and share your Skills, M… · 2026/9/27 6:45:01

网络运维工程师教程怎么选?一文搞懂避坑指南
网络运维工程师教程怎么选?一文搞懂避坑指南

网络运维工程师教程怎么选?一文搞懂避坑指南 网站做好了没人访问,这不仅是SEO的问题,更是底层运维没做好的典型症状。很多老板以为只要页面漂亮、代码写对,流量就会自动找上门,结果上线三个月,后台数据惨淡。其实,… · 2026/9/27 6:44:43

第2篇 Prometheus 服务发现:动态目标管理实战
第2篇 Prometheus 服务发现:动态目标管理实战

随着容器化与微服务架构的普及,被监控对象的形态发生了根本变化。过去以物理机、虚拟机为主体的固定目标,如今逐步被 Kubernetes 编排下的 Pod、Service 等实例所取代。这些实例的 IP 由集群动态分配,重启即变、扩缩容以秒计,生命… · 2026/9/27 7:26:07

Zeek 网络监控实战指南:传感器部署、安全数据采集与日志分析工作流
Zeek 网络监控实战指南:传感器部署、安全数据采集与日志分析工作流

网络安全网络IDS 【免费下载链接】zeek Zeek is a powerful network analysis framework that is much different from the typical IDS you may know. 项目地址: https://gitcode.com/gh_mirrors/ze/zeek 点击查看 免费下载 导读 本文以 Zeek 的监控定位为出发点… · 2026/9/27 7:26:07

gsd-core 修复 `phase remove` 误删同层十进制阶段:3601 深度感知段落边界解析
gsd-core 修复 `phase remove` 误删同层十进制阶段:3601 深度感知段落边界解析

【免费下载链接】gsd-core Git. Ship. Done - Core 项目地址: https://gitcode.com/gh_mirrors/ge/gsd-core 点击查看 免费下载 本篇文章围绕 gsd-core 中一次针对 phase remove 命令的破坏性数据丢失缺陷修复(对应 issue #3601)展开&#x… · 2026/9/27 7:26:07

拒绝模板丑站,门户网站策划方案哪家强
拒绝模板丑站,门户网站策划方案哪家强

拒绝模板丑站,门户网站策划方案哪家强 别再被那些千篇一律的模板网站坑了,看着就掉价。很多老板找团队做门户网站,问的第一句话往往是“哪家好”,结果拿到手还是一堆拼凑的烂代码。… · 2026/9/27 7:25:49

Apereo CAS 嵌入式 Tomcat 容器启用 APR:原理、配置与连接器调优指南
Apereo CAS 嵌入式 Tomcat 容器启用 APR:原理、配置与连接器调优指南

后端认证鉴权单点登录 【免费下载链接】cas Apereo CAS - Identity & Single Sign On for all earthlings and beyond. 项目地址: https://gitcode.com/gh_mirrors/ca/cas 点击查看 免费下载 Apereo CAS 默认以嵌入式 Apache Tomcat 作为 Servlet 容器运行&… · 2026/9/27 7:25:43

【维克】时序动量:追涨杀跌的数学原理
【维克】时序动量:追涨杀跌的数学原理

Why:时序动量和截面动量有什么本质不同?想象一个场景:大盘暴跌5%,你的股票池里A跌了2%,B跌了8%。截面动量会说:买入A,因为它比B强——这是相对排名的逻辑。时序动量会说:全部清仓&am… · 2026/9/27 7:25:37

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码