stm32延时us寄存器_转载||延时函数

(53) 2024-08-01 13:01:03
stm32延时us寄存器_转载||延时函数 (https://mushiming.com/)  第1张

是新朋友吗?记得先点蓝字关注我哦~

【本文已由 CSDN博主 授权转载(原创)作者:「魏波-」,转载请联系出处】

摘要

单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ms( )。

1.普通延时法

(1)普通延时法1

这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。

stm32延时us寄存器_转载||延时函数 (https://mushiming.com/)  第2张

(2)普通延时法2

stm32延时us寄存器_转载||延时函数 (https://mushiming.com/)  第3张

2.SysTick 定时器延时

CM3 内核的处理器,内部包含了一个SysTick 定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。SysTick 在STM32的参考手册里面介绍的很简单,其详细介绍,请参阅《Cortex-M3 权威指南》。

这里面也有两种方式实现:

(1)中断方式

如下,定义延时时间time_delay,SysTick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时。

stm32延时us寄存器_转载||延时函数 (https://mushiming.com/)  第4张

(2)非中断方式

主要仿照原子的《STM32不完全手册》。SYSTICK 的时钟固定为HCLK 时钟的1/8,在这里我们选用内部时钟源72M,所以SYSTICK的时钟为9M,即SYSTICK定时器以9M的频率递减。SysTick 主要包含CTRL、LOAD、VAL、CALIB 等4 个寄存器。

CTRL:SysTick控制和状态寄存器
LOAD:SysTick重装载值寄存器
VAL:    SysTick当前值寄存器
CALIB:SysTick校准值寄存器

对这几个寄存器的操作被封装到core_cm3.h中:

stm32延时us寄存器_转载||延时函数 (https://mushiming.com/)  第5张

SysTick->CTRL

stm32延时us寄存器_转载||延时函数 (https://mushiming.com/)  第6张

SysTick-> LOAD

stm32延时us寄存器_转载||延时函数 (https://mushiming.com/)  第7张

SysTick-> VAL

stm32延时us寄存器_转载||延时函数 (https://mushiming.com/)  第8张

SysTick-> CALIB 不常用,在这里我们也用不到,故不介绍了。

程序如下,相当于查询法。

stm32延时us寄存器_转载||延时函数 (https://mushiming.com/)  第9张

总结

三种方式各有利弊,第一种方式容易理解,但不太精准。第二种方式采用库函数,编写简单,由于中断的存在,不利于在其他中断中调用此延时函数。第三种方式直接操作寄存器,看起来比较繁琐,其实也不难,同时克服了以上两种方式的缺点,个人感觉比较好用。

stm32延时us寄存器_转载||延时函数 (https://mushiming.com/)  第10张

无论您远走何方

请点击蓝字,想念我们

stm32延时us寄存器_转载||延时函数 (https://mushiming.com/)  第11张

智能创新俱乐部(IIC)

stm32延时us寄存器_转载||延时函数 (https://mushiming.com/)  第12张

关注我们

请相信

我们一直都在

THE END

发表回复