一、使用场景
第一种情况,在使用普通 STM32 延迟函数,类似于 HAL_Delay(time),由于该函数是使用循环去判断及延时的,所以在执行该函数时整个程序会在此处等待定时器的中断服务函数修改参量使得循环判决条件不成立,从而继续程序的执行,同时也达到延迟时间的效果。由于使用的是系统的定时器进行延迟,所以时间相对准确。
第二种情况,当需要周期性的执行一个任务时,将这个函数放在某个定时器的中断服务函数里,设置好定时器的时间,完成时产生中断,从而进入中断服务函数执行该函数。此时,MCU 执行中断程序,只有更高优先级的中断才能打断当前执行的中断服务函数,进入更高优先级的中断服务函数去执行。需要等所有中断服务函数都执行完成,才会退回到主函数。
第三钟情况,而结合定时器以及相应的标志位,直接在主函数中达到周期任务的效果。原理如下:
1、设置一个全局的标志位flag,初值为 0。
2、在SysTick定时器的中断服务函数中,周期性地对改标志位置 1。
3、主函数 while(1)中,只要使用if(flag){}去判断条件是否满足,满足则执行,不满足则跳过。
第三种情况和第二钟情况的主要区别在于,第三种情况的周期任务函数是在主函数中执行的,而第二种则是在中断服务函数里执行的。使用第二种方式去执行周期任务,程序上可能会更好理解一些;使用第三种方式,则在编写程序时更简便一点。
这三种情况的使用场景不一样,第一种是使用 CPU 空操作的方式来延迟固定时间,保证通信时序正确;第二种使用中断的方式适用于比较重要的周期任务,保证周期准确;第三种则适用于周期不那么重要,只要在 while(1)循环中,任务函数不断地进行 if(flag)的判断,满足就执行。
二、代码演示
while (1)
{
BSP_LED_On(LED1);
#if 1 //演示1,普通延时函数 5s打印一次时间和follow on
printf_time();
HAL_Delay(1000); //延时1000ms
printf("follow on \n ");
#else //演示2,周期任务 1s打印一次时间,5s打印一次follow on
printf_time();
HAL_Delay(1000);
Sys_Delay(5000);
if(flag)
{
flag = 0;
printf("follow on \n");
}
#endif
}
printf_time()函数就是将 MCU RTC 中的时间通过串口打印出来,而HAL_Delay()就是普通的延时函数,Sys_Delay()是用于设置第三种方式中所提的定时任务的周期,代码如下:
void Sys_Delay(uint32_t time)
{
Cycle_Time = time;
}
而中断服务函数的代码如下:
void SysTick_Handler(void)
{
HAL_IncTick();
T1msCount++;
if(T1msCount>Cycle_Time)
{
T1msCount = 0;
flag = 1;
}
}
该中断每 1ms 产生一次,对计数值T1msCount进行加 1,当大于周期时间时,清零,并对标志位赋 1,此后主函数中if(flag)成立,对标志位清零,并执行其中的周期任务。
图一对于主函数中演示 1,代表延迟一秒,打印时间及“follow on”,
图二对应主函数在 #if 0 时的演示2,代表延迟一秒打印一次时间,打印”follow on”的周期为5秒。
关键字:STM32 延时函数 高级用法
引用地址:
STM32 延时函数高级用法分析
推荐阅读最新更新时间:2024-03-16 16:00
STM32CubeIDE 的应用: 重定向printf 到stm32串口
一、导入stdio.h库文件 /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include stdio.h /* USER CODE END Includes */ 二、重写函数 /* USER CODE BEGIN 4 */ #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #define GETCHAR_PROTOTYPE int __io_getcha
[单片机]
stm32开发常用的软件和语言介绍
STM32 开发环境(工具)介绍 一、Keil 软件介绍 Keil C51 是美国 Keil software 公司出品的 51 系列兼容单片机 C 语言软件开发系统。 KeilC51 软件提供了丰富的库数据和功能强大的集成开发调试工具 μVision2 全是 windows 界面。 只要看一下编译后生成的汇编代码, 就能体会到 keil C51 生成的目标代码的效率之高, 多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。 Keil的版本目前是 V7 版本,他是很优秀的 8051C 编译器。 安装 Keil C51 对系统的要求比较低, 一般的 windows 系统就可以了。 安装过程也很
[单片机]
基于STM32的雷管电子保险装置设计
0.引言 雷管使用中如果引爆系统屏蔽不够完善,使雷管中流过泄漏电流和电容电流达到一定的数值和作用时间,电流转化成足够的热能达到雷管炸药点燃温度(约180℃)时即可引爆,电雷管耐静电压为(1~3)×104V,超过(1~3)×104V 的静电压,从而引爆电雷管,造成爆破材料发生意外爆炸事故。本课题是在参阅了国内外关于雷管安全保险发展技术资料的基础上进行的国内雷管防护措施开发和研制的一次有益的尝试和探索,简要介绍了STM32F103RBT6 的主要功能和性能,完成了系统整体设计。 1.STM32F103RBT6简介 STM32F103RBT6 是一种高性能32 位微控制器(MicrocontrollerUnit),是意法半导体公司
[单片机]
关于STM32正交编码的问题
程序的大致思路如下:两个定时器配置为编码器模式,用于小车的两个轮子编码脉冲计数,计数器向上或向下计数溢出,均在二者的中断函数中记录记录。还有一个定时器用作计时用,规定时间内进入中断,在中断函数中对数据进行处理。我用的光电码盘是100线的,在选择的计数模式下,转一圈产生400个计数脉冲。程序如下: double first_cnt,second_cnt,encoder_timer_overflow_sample; static volatile double encoder_timer_overflow; double rotor_speed = 0; unsigned char i = 0; //first_cnt是第一次读计数
[单片机]
如何判断STM32的复位类型_STM32软件复位bug有哪些
STM 32在复位时,有严重BUG: 1.上电复位和外置的看门狗芯片重启复位是无法区分开来的!RCC_FLAG_BORRST, RCC_FLAG_PINRST, RCC_FLAG_LPWRRST三个都复位了! 2.这样当要在上电复位初始化关键代码时,这些代码看门狗复位则不用重启,这个关键代码会导致应用业务的异常!若两个中断分不开,导致系统异常看门狗复位时影响业务! /* RCC_FLAG_BORRST: POR/PDR or BOR reset //Power-on/power-down reset (POR/PDR reset) or brownout (BOR) reset RCC_FLAG_PINRST: Pin r
[单片机]
一种基于STM32和FPGA的多轴运动控制器的设计与实现
引言 数控系统在工矿领域已得到广泛应用,计算机数控系统通过对数字化信息的处理和运算,并转化成脉冲信号,实现对电机的控制,进而控制数控机床动作和零件加工。随着嵌入式技术的发展,我们可以设计规模更小,成本更低,功能更特定的嵌入式系统来完成传统计算机数控系统所完成的工作。 1、设计方案 本系统以嵌入式处理器STM32和FPGA芯片为核心,运动控制方案中的处理部分都放在FPGA内部实现。这是1种硬件软化的方案,即具有软件可编程、可重构的特点,又有硬件那样高性能、高可靠、高一致性的优点。其系统原理框图如图1所示。 图1 系统原理 STM32从SD卡中读取数据文件并进行相关算法处理,通过键盘扫描电路设置系统加减速的初始速度、最大速度、
[单片机]
stm32 rcc 时钟
STM32中在使用任何一个外设都必须打开相应的时钟,所以我从STM32的时钟学起。 RCC时钟 iframe id="iframe_0.2786969253793359" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://hiphotos.baidu.com/%25B4%25D3%25D0%25A1%25BE%25CD%25BA%25DC%25CB%25A5/pic/item/481cde3e541abeaad5622588.jpg?_=2634063%22%20style=%22border:none;max-width:1397px%
[单片机]
解读STM32高功率激光医疗仪控制电路
简介:本文采用模块化设计,设计了一种基于STM32($20.3400) 的2μm光纤激光器医疗仪控制系统,将水冷单元的参数监控、电源模块的抗干扰设计、输出功率的校准等集成于一体。测试结果表明,系统可靠稳定,操作方便。 2μm 高功率激光医疗仪市场需求越来越大,而目人机交互模块前国内此类设备在控制上缺乏对系统安全和出光精准度的考虑。同时随着YY0505-2012 医用电气电磁兼容标准于2014 年的执行,设计符合YY0505-2012 标准的医用设备已迫在眉睫。因此,本文采用模块化设计,设计了一种基于STM32($20.3400)的2μm光纤激光器医疗仪控制系统,将水冷单元的参数监控、电源模块的抗干扰设计、输出功率的校准等集成于
[单片机]