目录
1.序言
延时函数在单片机的中都占有非常重要的地位。下面是我对延时函数的认识与解读。
2.循环延时
总结上述,计算上面普通的延时函数周期为for(i=1;i<=count;i++) 执行一次为1us,执行十次就为10us,故达到延时的效果。
3.系统滴答计时器(定时器/计数器)
配置定时器的寄存器的思路过程:
1.序言
延时函数在单片机的中都占有非常重要的地位。下面是我对延时函数的认识与解读。
1.首先了解延时函数的来源,他有单片机系统的内部时钟和外部时钟所产生。对于是swm181来说,SWM181 支持片上包含精度为 1%以内的 24MHz、48MHz 时钟,还可以在他的启动文件里面找到,
从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)
- 指令周期
a.用C语言写的程序,会被转换成一条一条的指令,不同的指令执行的时间不同。
b. 简单指令需要一个机器周期,复杂指令可能需要两个或两个以上的机器周期。
还有就是SWM官网给的手册里面仅有的一段周期介绍
总结上述,计算上面普通的延时函数周期为for(i=1;i<=count;i++) 执行一次为
1us,执行十次就为10us,故达到延时的效果。
3.系统滴答计时器(定时器/计数器)
老方法看手册(查找需要用到的寄存器)
- 配置初值寄存器 LOAD,设置计数值,该值以系统时钟为单位递减
- 使能控制寄存器CTRL:使能控制寄存器(CTRLx)使能位(ENx),对应 TIMERx 开始递减计数,计数到0 时,产生中断,同时重新装载计数值,进行下一周期计数
- 过装载值寄存器VAL:在计数过程中,可通过对当前值寄存器(CVALx)进行读取,获取当前计数值。定时器计数过程中改变装载值寄存器(LDVALx)值,将在下个计数周期(计数到 0 重新装载)生效,不会改变本周期计数值。
配置定时器的寄存器的思路过程:
初值寄存器装入数——设置过装置寄存器的值——使能控制寄存器使能——开始计时/开始计数——使能控制寄存器使能关闭——清空计数器/计时器。