目录

1.序言

延时函数在单片机的中都占有非常重要的地位。下面是我对延时函数的认识与解读。

2.循环延时

 总结上述,计算上面普通的延时函数周期为for(i=1;i<=count;i++) 执行一次为1us,执行十次就为10us,故达到延时的效果。

3.系统滴答计时器(定时器/计数器)

配置定时器的寄存器的思路过程:


 

1.序言

延时函数在单片机的中都占有非常重要的地位。下面是我对延时函数的认识与解读。

1.首先了解延时函数的来源,他有单片机系统的内部时钟和外部时钟所产生。对于是swm181来说,SWM181 支持片上包含精度为 1%以内的 24MHz、48MHz 时钟,还可以在他的启动文件里面找到,

android循环延时 循环延时函数_寄存器

 

android循环延时 循环延时函数_单片机_02

 从system_SWM171.c(startup)文件中可以看到,已经设置好了,SYS_CLK等于48MHZ,如果自己需要用到不同的时钟,直接可以在这里修改即可。好了,我们已经了解了系统时钟,下面我将介绍的俩种方法写延时函数,分布是(1)循环延时。(2)系统滴答计时器

2.循环延时



//延时函数
void delay(int count)
{
	int i;
	for(i=1;i<=count;i++)
	;
}


 计算公式


时钟周期 = 1/时钟频率
机器周期 = 完成一个基本操作所需要的时间 = 时钟周期*n(n取决于单片的不同而不同)
指令周期 = 完成一次指令所需的时间           = 一或者两个机器周期 

而我们的计算公式则是:
(count(次数)*指令周期所需的时钟周期数(例如c51就是12)*循环中的指令数)/时钟频率


对应SWM181来说

  •  时钟周期=1/SYS_CLK
  • 机器周期=时钟周期*n(其中n=12) 

android循环延时 循环延时函数_嵌入式硬件_03


  •   指令周期 

a.用C语言写的程序,会被转换成一条一条的指令,不同的指令执行的时间不同

b. 简单指令需要一个机器周期,复杂指令可能需要两个或两个以上的机器周期。

 

android循环延时 循环延时函数_android循环延时_04


还有就是SWM官网给的手册里面仅有的一段周期介绍 

android循环延时 循环延时函数_时钟周期_05


 总结上述,计算上面普通的延时函数周期为for(i=1;i<=count;i++) 执行一次为1us,执行十次就为10us,故达到延时的效果。

3.系统滴答计时器(定时器/计数器)

老方法看手册(查找需要用到的寄存器)

  1. 配置初值寄存器 LOAD,设置计数值,该值以系统时钟为单位递减
  2. 使能控制寄存器CTRL:使能控制寄存器(CTRLx)使能位(ENx),对应 TIMERx 开始递减计数,计数到0 时,产生中断,同时重新装载计数值,进行下一周期计数
  3. 过装载值寄存器VAL:在计数过程中,可通过对当前值寄存器(CVALx)进行读取,获取当前计数值。定时器计数过程中改变装载值寄存器(LDVALx)值,将在下个计数周期(计数到 0 重新装载)生效,不会改变本周期计数值。

 

android循环延时 循环延时函数_单片机_06

  

android循环延时 循环延时函数_寄存器_07

  

配置定时器的寄存器的思路过程:

初值寄存器装入数——设置过装置寄存器的值——使能控制寄存器使能——开始计时/开始计数——使能控制寄存器使能关闭——清空计数器/计时器。