51单片机delay延时原理LED延时闪烁delay(50000); 用定时器延时代替delay(50000)延时怎么样写?

STM32延时函数的三种方法:普通延时、SysTick 定时器延时(1.中断方式;2.非中断方式)

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

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

 
 

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


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

 

如果在上次读本寄存器后systick已为0则该位为1,若 读该位自动清零

0:外部时钟源 1:内部时钟

0:减到0无动作;1:减到0产生systick异常请求

减到0时被重新装载的值

读取时返回当前倒计数的值写则清零,同时还會清除在systick控制及状态寄存器中的COUNTFLAG标志

程序如下相当于查询法。

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

STM32F40x系列总共最多有14个定时器定时器分为三类:基本定时器、通用定时器和高级定时器。它们的都是通过计数来达到定时的目的和51的定时器差不多,基本原理都是一样的就是功能多了一些,这些计数器都是自动重新装载初值的使用起来非常方便,而且计数时钟频率可以通过分频系数来设置本文章将介绍使用定时器中断来控制LED间隔1s闪烁。

计数的时钟来源主要有四个:

  • 外部时钟模式1:外部输入脚TIx
  • 外部时钟模式2:外部触发输入ETR仅适用于 TIM2、 TIM3、 TIM4
  • 内部触发输入ITRx:使用 A 定时器作为 B 定时器的预分频器(A为B提供时钟)

2.初始化定时器参数,设置分频系数和计数初值计数模式设置等。如果要定时1s定时器溢出那么可以设置分频系数为8400 ,则分频后的时钟频率为 : 84MHz / 8400 = 10KHz  = 01ms  ,计数初值设置为1s / 01 ms = 10000即可。

 /*初始化定时器参数设置自动重装徝,分频系数计数方式*/
 

TIM_RepetitionCounter是使用高级定时器要进行设置的。我们使用的是定时器3属于通用定时器,计数模式设置为向上计数则计数器從0 开始计数,当计数到设置的初值时然后计数器重新从0开始计数,并将溢出标志位置1如果设置了溢出中断,则会产生计数器溢出中断

3.定时器3中断设置,注意优先级的设置如果程序中开启了多个中断。就要考虑中断优先级的设置本程序只使用了一个定时器中断,则配置为任何优先级都是可以的

 /*定时器3中断优先级设置*/
 

4.使能定时器,当执行完这一句后定时器就开始从 0 开始计数了。我们可以通过使能萣时器来暂停计数器或者使能定时器来启动定时器,在开发时钟时可以使用这个

5.中断服务函数,本程序是让LED1间隔1s闪烁那么中断服务函数的功能就是让LED1的状态反转。

这里检测的是定时器溢出中断即计时1s时间到,则将LED1的状态反转然后将溢出标志位清零。

这里使用延时函数来延时1s控制LED0闪烁实际运行效果可以看出两个LED的闪烁在一定的时间内是同步的,但是时间一长还是有点误差

当学完这一节定时器的時候,我就有一个想法了那就是写一个LCD电子时钟的程序,通过定时器来达到准确延时的目的当然还要学习一下LCD1602的驱动方法,哈哈想想就很有成就感。

以上是我学习过程的一些个人理解有不对或不准确的地方,欢迎各位大神指正

我要回帖

更多关于 单片机delay延时原理 的文章

 

随机推荐