新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/11/15 7:21:05来源:尧图网络
使用通用定时器实现延时函数遇到的问题
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 ){;}}
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/15 4:54:16

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/15 2:04:12

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/14 10:11:15

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/14 17:14:38

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/14 16:35:50

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/15 4:06:36

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉