基于Systick系统滴答定时器的延时时间计算
介绍一套嵌入式系统中常用的非阻塞延时 / 超时判断工具宏#define SysTime() HAL_GetTick() //ms级别 #define SysTimeDiff(new, old) ((new) - (old)) #define SysTimeDiffCurrent(oldTime) SysTimeDiff(SysTime(), (oldTime)) #define SysTimeHasPast(oldTime, pastTime) (SysTimeDiffCurrent((oldTime)) (pastTime)) //大于号成立为1不成立为0解释1.获取当前系统时间以毫秒为单位。SysTime()是一个宏直接调用 STM32 HAL 库的HAL_GetTick()函数该函数返回自系统启动以来经过的毫秒数所以注释标注单位为ms。2.计算两个时间点之间的时间差。接收两个时间参数new较新的时间和old较旧的时间返回new - old的差值单位同样是毫秒。注意这里利用了无符号整数溢出特性即使new发生溢出比如从最大值回到 0减法结果依然能得到正确的时间差。3.计算从某个过去时间点到当前时间的时间差。接收一个过去的时间oldTime内部调用SysTime()获取当前时间再用SysTimeDiff()计算差值等价于当前时间 - oldTime。4.判断从oldTime到当前是否已经过去了指定时长。先通过SysTimeDiffCurrent(oldTime)得到从oldTime到现在的毫秒数再将这个差值与pastTime需要等待的毫秒数做比较如果差值大于pastTime返回真非 0表示已经超时否则返回假0表示还没到时间。例子1uint32_t start SysTime(); // 记录开始时间 while(1) { if(SysTimeHasPast(start, 1000)) { // 判断是否过去1秒 // 1秒到了执行任务 break; } // 这里可以做其他事情不会阻塞 }例子2//解释当某个状态出现时状态指示灯1s反转一次 static uint32_t g_FlashLedErrTime_light 0; if(g_signflag ! 0) //判断某个标志位是否为0 , 不为0进入 { if(g_FlashLedErrTime_light 0) //若是第一次进来 { g_FlashLedErrTime_light SysTime(); //记录一下当前运行时间 } else //不是第一次进来 { if(SysTimeHasPast(g_FlashLedErrTime_light, 1*1000)) //判断标志位不为0时距离上次进入时间是否为1S { g_FlashLedErrTime_light SysTime(); //若大于1S记录当前最新系统运行时间 ToggleGpio_ERR(); //1s反转一次状态指示灯。 } } }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2420189.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!