STM32单片机的延时原理和延时函数方法
当涉及到单片机编程时,延时是一项常见但关键的任务。在许多应用中,我们需要控制程序暂停一段时间,以实现精确的时间控制或协调不同设备之间的操作。本文将以STM32为例,介绍关于单片机的延时原理以及常用的延时函数方法。
(资料图片)
延时的原理
单片机的延时是通过控制处理器执行一系列指令来实现的。每条指令需要一定的时间来执行,而延时就是利用这些指令的执行时间来达到暂停程序执行的目的。延时的精确性和稳定性受到处理器的时钟频率、编译器优化等因素的影响。
延时方法
1. 软件延时
软件延时是最常见的延时方法之一,适用于大多数STM32单片机。基本思路是通过循环执行空操作或简单指令来消耗时间,从而实现延时。
#include "stm32f4xx.h"void softwareDelay(uint32_t delay_ms) { uint32_t i, j; for(i = 0; i < delay_ms; i++) { for(j = 0; j < 1000; j++) { __NOP(); // 空操作,消耗时间 } }}
这种方法的缺点是延时时间精度不高,且不适用于需要较精确延时的场景。2. 硬件定时器STM32单片机内置了多个高精度的硬件定时器,可以精确地实现延时。通过配置定时器的参数,可以生成精确的时间间隔来进行延时。
#include "stm32f4xx.h"void timerDelay(uint32_t delay_ms) { // 配置定时器 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_InitStruct.TIM_Prescaler = SystemCoreClock / 1000000 - 1; // 1us计数一次 TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_InitStruct.TIM_Period = delay_ms * 1000; // 延时的微秒数 TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_InitStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, &TIM_InitStruct); // 启动定时器 TIM_Cmd(TIM2, ENABLE); // 等待定时器计数完成 while (TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET) { } // 清除标志位 TIM_ClearFlag(TIM2, TIM_FLAG_Update);}
硬件定时器方法具有高精度和稳定性,适用于需要精确时间控制的场景。3. 阻塞延时与非阻塞延时上述的软件延时和硬件定时器延时都是阻塞延时,即在延时期间,程序会一直等待,无法执行其他任务。如果需要同时处理其他任务,可以采用非阻塞延时,结合中断或操作系统的任务调度来实现。
#include "stm32f4xx.h"volatile uint32_t millisecond = 0;void SysTick_Handler(void) { millisecond++; // SysTick中断每毫秒触发一次}void nonBlockingDelay(uint32_t delay_ms) { uint32_t start = millisecond; while (millisecond - start < delay_ms) { // 等待延时结束,期间可以处理其他任务 }}
在上述代码中,我们使用了STM32的SysTick定时器,每毫秒触发一次中断。通过记录开始时间和当前时间的差值,可以实现非阻塞的延时效果。
延时函数的设计
为了方便使用延时,我们可以封装一个延时函数,根据不同的延时方法选择合适的实现。
#include "stm32f4xx.h"void delay(uint32_t delay_ms) { // 根据选择的延时方法调用对应的函数 // 如:softwareDelay(delay_ms); // 或:timerDelay(delay_ms); // 或:nonBlockingDelay(delay_ms);}通过封装延时函数,我们可以根据需要灵活地选择合 适的延时方法,并在不同的场景中使用。这样的设计使得单片机程序的开发更加方便和可维护。阻塞延时与非阻塞延时的选择在实际应用中,选择阻塞延时还是非阻塞延时取决于你的项目需求。阻塞延时在简单的应用中使用较为普遍,因为它易于实现和理解。但是,如果你的应用需要同时处理多个任务或需要更高的性能,非阻塞延时可能更为适合。非阻塞延时能够让处理器在延时期间继续执行其他任务,提高了系统的并发性能。示例代码下面是一个使用STM32的SysTick定时器实现非阻塞延时的示例代码:
#include "stm32f4xx.h"volatile uint32_t millisecond = 0;void SysTick_Handler(void) { millisecond++; // SysTick中断每毫秒触发一次}void nonBlockingDelay(uint32_t delay_ms) { uint32_t start = millisecond; while (millisecond - start < delay_ms) { // 等待延时结束,期间可以处理其他任务 }}int main(void) { // 初始化SysTick定时器 SystemCoreClockUpdate(); SysTick_Config(SystemCoreClock / 1000); // 配置成每毫秒触发一次中断 // 初始化其他硬件和外设 while (1) { // 执行主要任务 // 进行非阻塞延时 nonBlockingDelay(1000); // 延时1秒 }}
在上述代码中,我们首先初始化了SysTick定时器,使其每毫秒触发一次中断。然后,在主循环中,我们通过调用nonBlockingDelay函数来实现非阻塞延时。该函数会记录开始时间并不断检查当前时间与开始时间的差值,直到达到设定的延时时间为止。这期间,程序可以继续执行其他任务。
总结
在STM32单片机编程中,实现延时是一项常见但重要的任务。通过软件延时、硬件定时器以及非阻塞延时等方法,可以根据项目需求选择合适的延时方案。阻塞延时适用于简单的应用场景,而非阻塞延时能够提高系统并发性能。通过封装延时函数,你可以在项目开发中灵活选择延时方法,并根据需求进行调整,从而实现精确的时间控制和任务调度。 审核编辑:汤梓红
关键词:
相关阅读
-
STM32单片机的延时原理和延时函数方法
STM32单片机的延时原理和延时函数方法-当涉及到单片机编程时,延时是一 -
一家8口被困荒漠,其中4位老人两个孩子...
8月6日,一辆广东牌照商务车一行八人在此拍照后,准备去往附近的火星营 -
喜忧参半!郑钦文鏖战晋级,张帅遭遇16...
但老将张帅却再度输球,面对世界排名第34位的布林科娃,张帅1-2遭到逆 -
大学热门专业必学软件_医学类专业
根据教育部(教高司函[2011]164号)《普通高等学校本科专业目录》,医 -
用友电子发票开启数字化新时代
近年来,随着数字化的快速发展和企业管理的变革,传统的纸质发票已经难 -
普降15% 榴莲自由渐近
国产榴莲上市后,榴莲价格有所下降。近日,北京商报记者看到市面上的榴 -
甘肃4条线路上榜全国乡村旅游精品线路
近日,文化和旅游部推出2023年第二期“乡村四时好风光”全国乡村旅... -
山东省微山县:把“妈妈小屋”建到新就...
中工网讯“干我们这行,风里来雨里去成了习惯,看到这个“妈妈小屋... -
今年首个"四连涨"来了 92号汽油或站上8元大关
在迎来今年首个“二连涨”、首个“三连涨”后,明天0点,国内汽柴油... -
科学家首获“量子超化学”实验室证据
科技日报北京8月8日电(记者刘霞)美国芝加哥大学科学家宣布,理论预测20 -
Rivian CEO:将与特斯拉达成的充电接口...
鞭牛士8月9日消息,新能源汽车公司Rivian的CEO表示,在与特斯拉达成的 -
河南餐饮住宿业“三项大赛”奖项揭晓 ...
8月3日,河南省第六届豫菜品牌大赛、河南省第八届烹饪技能大赛、河南省 -
8年前增值20倍收购 现在不到2折甩卖 ...
【8年前增值20倍收购现在不到2折甩卖威创股份回复深交所关注函】在前次 -
知名品牌紧急道歉:全部下架
近日,有网友反映,在知名连锁麻辣烫品牌张亮麻辣烫一门店以每盒18元的 -
“猪菜”拖累,7 月 CPI 增速或转负...
中新经纬8月9日电9日上午,国家统计局将公布2023年7月份居民消费价格指 -
人才队伍规模已超70万人!我国知识产权...
推动新设知识产权硕士专业学位类别,推进知识产权领域职称制度改革,轮 -
「新闻早茶」河北加强洪涝灾害死亡畜禽...
8月9日星期三农历六月廿三【早安你好】◆这世间山长水远,总有人与你并 -
fbx是什么 fbx是什么软件的文件
fbx是filmbox这套软件所使用的格式,现在改称Motionbuilder。因为Motio -
北京大学:已修改
记者注意到,北京大学邮件系统登录页面上“帐号”与“账号”混用,... -
守住水位警戒线 确保高铁“孤岛”通信...
中新网牡丹江8月8日电题:守住水位警戒线确保高铁“孤岛”通信信号...