Systick定时器延时原理与HAL_Delay()延时函数的使用

代码的书写过程中经常用到延时,这里主要讲述一下hal延时,hal库之hal_delay()函数在72m主频,stm32cubemx自动生成情况下,默认为延时1ms单位,即hal_delay(500)表示500ms延时,这是因为在默认状态下,systick()默认设置为1ms中断,下面就原理进行叙述。
systick 定时器延时原理
systick(滴答时钟)是一个24位,向下计数的定时器,当倒计时完成后,定时器可以产生一个中断,所以,当频率一定,计数个数一定时,这个中断就会以一定的时间间隔发生,如果每个中断发送后调用的中断函数中给一个变量累加,这样我们就可以获得一个与时间相关的变量。
hal_delay()延时函数的使用
如果你使用stm32cubemx来生成一个工程,那么使用systick来延时是非常方便的,你只需要调用hal库的一个虚函数,它的原型如下:
__weak void hal_delay(__io uint32_t delay)
可以看到,hal_delay()是一个虚函数,这表明用户可以在其它的位置重定义,如果这样,新的函数将会取代它,编译 过程中也不会出现重定义的错误。该函数只有一个32位的参数,明显的,这个形参指定了延时的时间,它的单位是毫秒(ms)。
硬件延时 关于osdelay函数可以看一下cmsis_os2.h里面的定义,我也是在网上查到具体的定义函数,如下,但是我在官方提供的函数中未找到相关的函数内容。实际使用中就是调用free-rtos函数,然后直接使用 osdelay(5);含义就是延时50ms。
实际上系统osdelay就是一种程序阻塞的状态,在阻塞态下,其他资源函数进行工作,时间到从阻塞态变为就绪态,再到运行态。
系统延时 软件延时就是大家用的最多的,让程序运行计算来延时,这就很多了,直接上代码。
void delay_ms(u16 nms){ if(delay_osrunning&&delay_osintnesting==0) //如果os已经在跑了,并且不是在中断里面(中断里面不能任务调度) { if(nms>=fac_ms) //延时的时间大于os的最少时间周期 { delay_ostimedly(nms/fac_ms); //os延时 } nms%=fac_ms; //os已经无法提供这么小的延时了,采用普通方式延时 } delay_us((u32)(nms*1000)); //普通方式延时 }void delay_us(u32 nus){ u32 temp; systick->load=nus*fac_us; //时间加载 systick->val=0x00; //清空计数器 systick->ctrl|=systick_ctrl_enable_msk ; //开始倒数 do { temp=systick->ctrl; }while((temp&0x01)&&!(temp&(1val =0x00; //清空计数器 }//延时nms//注意nms的范围//systick->load为24位寄存器,所以,最大延时为://nmsload为24bit) systick->val =0x00; //清空计数器 systick->ctrl|=systick_ctrl_enable_msk ; //开始倒数 do { temp=systick->ctrl; }while((temp&0x01)&&!(temp&(1val =0x00; //清空计数器 }


IPhone新机技术曝光, 是7s还是8?
华为接连发布多款重磅产品,鸿蒙系统带来真正王牌
京东方有望杀入iPhone 13OLED供应圈
去年Q4华为手机出货量跌出前五,意味着什么?
进军工业4.0 英业达找上西门子
Systick定时器延时原理与HAL_Delay()延时函数的使用
华为P11什么时候上市?华为P11最新消息:华为P11外观、配置、性能、续航全面升级,这次买还拼人品吗?
Jabra捷波朗推出Jabra Elite 75t第四代真无线耳塞
超3万人请愿三星停用Exynos处理器 三星否认性能劣化问题
Everspin MRAM内存技术是如何工作的及其特点
调心滚子轴承与深沟球轴承相同点
iPod Touch的特性有哪些?
联发科处理器规格一览
信维通信募集资金总额不超过30亿元投资三大项目 将进一步扩大公司业务规模
小米智能家居怎么样_小米智能家居产品好用吗_小米智能家居多少钱
表面贴装元件识别的一种亚像素边缘检测方法
用BA328制作的音调控制电路,ba328 tone controller
关于IP地址的基础知识
adc转换器的主要技术指标有哪些
混凝土材料断裂的声发射自相似性识别特征