历史上的今天
返回首页

历史上的今天

今天是:2025年04月23日(星期三)

正在发生

2018年04月23日 | STM32 延时函数高级用法分析

2018-04-23 来源:eefocus

一、使用场景


第一种情况,在使用普通 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秒。

推荐阅读

史海拾趣

Acmelux Taiwan Inc公司的发展小趣事

面对日益激烈的国际竞争,Acmelux Taiwan Inc公司积极实施全球化战略布局。公司先后在欧美、亚洲等地设立了研发中心和生产基地,以充分利用全球资源,提升公司的整体竞争力。通过与当地企业的合作与交流,Acmelux不仅拓展了国际市场,还吸收了大量先进的技术和管理经验,为公司的持续发展注入了新的活力。

铨力(ALLPOWER)公司的发展小趣事

随着市场竞争的加剧,铨力公司意识到单纯依靠太阳能电源产品已无法满足市场需求。于是,公司开始着手研发更为先进、高效的能源技术。经过多次试验和改进,铨力成功突破了技术瓶颈,研发出了新一代高效能、低成本的太阳能电池板。这一技术的突破不仅提升了产品的竞争力,也为公司打开了更广阔的市场空间。

格莱尔(GLE)公司的发展小趣事

面对日益激烈的市场竞争,格莱尔积极推进数字化转型和智能化升级。公司引入了ERP、EHR、OA等信息化系统,实现了生产、管理、销售等各个环节的信息化和智能化。同时,格莱尔还加大了对自动化生产设备的投入和研发力度,提高了生产效率和产品质量。这些举措不仅提升了企业的竞争力,也为格莱尔在未来的发展中注入了新的动力。

Gwconnect (Molex)公司的发展小趣事
在允许范围内增加电路的工作电压,可以提高激励电压,从而增加超声波发射器的输出功率和遥控距离。但需要注意不要超过元件的耐压范围。
Austek Microsystems公司的发展小趣事

随着产品线的不断丰富和技术实力的不断提升,Austek Microsystems开始积极拓展市场。公司不仅在国内市场取得了良好的销售业绩,还积极开拓海外市场,与多个国家和地区的客户建立了稳定的合作关系。同时,Austek Microsystems还注重品牌建设,通过参加行业展会、举办技术研讨会等方式,提升品牌知名度和影响力。

Advanced Detector Corp公司的发展小趣事

ADC始终坚持以技术创新为核心竞争力,不断投入研发资源,探索新的技术领域。目前,公司正积极研发应用于物联网、人工智能等前沿领域的探测器技术,并计划推出更多具有创新性的产品。展望未来,ADC将继续致力于技术创新和市场拓展,努力成为电子行业的领军企业。

这五个故事展示了Advanced Detector Corp公司从创立初期到逐渐发展壮大的过程,体现了公司在技术创新、市场扩张、战略合作等方面的努力和成就。同时,这些故事也揭示了ADC在电子行业中的重要地位和影响力。

问答坊 | AI 解惑

一个万年历程序

本人做的一个万年历程序. 在调节年,月,日,时,分,秒的时候,偶尔会出错.比如出现 H6,H7等一些非所要的十进制字符. 为什么呢? #include #define uint unsigned int #define uchar unsigned char uchar code table[]=\" 2008-10-12 MON\"; uch ...…

查看全部问答>

VxWorks Ftp Client问题求助,多谢!

将文件上传到外部ftp server,发现小的文件上上传失败(几K左右的),稍大一点的文件可以上传。上传几K文件时,Server端打印上载失败,文件上传了一部分,但没全部上传。 代码流程大致如下: 1、获取文件长度lLen,分配内存 2、执行ftpxter 3、 ...…

查看全部问答>

cpu100%

我装的是xp,cpu2.0 独立显卡,在资源管理器下,cpu是100%…

查看全部问答>

求助!请各位高人近来帮帮忙

不使用三极管和MOS管是否也可以搭建一个单键开关电路呢? 就是按一下电源可以接通,再按一下电源断开的那种。 哪位高人能给一个示意图呢? 恳请大家帮帮忙,感谢万分!…

查看全部问答>

便携式缺氧监控电路

如图所示为便携式缺氧监控电路。该电路由氧传感器OS-12、直流放大器IC1、A/D变换器IC4、液晶显示器F2100-34PI、电压比较器IC2、正负电源变换器IC。等组成。OS-12为伽伐尼电池式氧传感器,检测空气中的氧气可输出约50mV的信号,且其在0~100%的氧 ...…

查看全部问答>

希望大家解决下我的疑惑,关于摄像头的

我有一块ARM的FL2440的板子,如果我要做个关于摄像头的程序(linux的),从市场上买一块主流的摄像头,像素稍微高点,然后是USB2.0的,希望采集图像在LCD中显然,那么是不是载一个万能驱动配置下,然后参考一些教程写个应用程序,就可以了呢?还需 ...…

查看全部问答>

基于ADE7757的智能电能计量系统(DIY完成)

我的DIY已经基本完成,后面将抽时间晒晒作品了。。。           [ 本帖最后由 zhaojun_xf 于 2011-8-8 13:49 编辑 ]…

查看全部问答>

瑞萨开发板例程+四旋翼飞行器资料+AD9850_AD9851_模块

最近搜集的资料一下汇总,内容包括 瑞萨开发板例程、四旋翼飞行器资料、AD9850_AD9851_模块…

查看全部问答>

5438 ADC12

用5438采集模拟量,A4管脚处有电压值,但ADC12产生的中断中采集的模拟量始终为0,已经检查过A4通道和ADC12MEM0对应,不知道是嘛情况,请高手指点~…

查看全部问答>