1.序言
延时函数在单片机的中都占有非常重要的地位。下面是我对延时函数的认识与解读。
1.首先了解延时函数的来源,他有单片机系统的内部时钟和外部时钟所产生。对于是swm181来说,SWM181 支持片上包含精度为 1%以内的 24MHz、48MHz 时钟,还可以在他的启动文件里面找到,
从system_SWM171.c(startup)文件中可以看到,已经设置好了,SYS_CLK等于48MHZ,如果自己需要用到不同的时钟,直接可以在这里修改即可。好了,我们已经了解了系统时钟,下面我将介绍的俩种方法写延时函数,分布是(1)循环延时。(2)系统滴答计时器
2.循环延时
首先要搞明白一些概念,(时钟周期,机器周期,指令周期)附链接参考
时钟周期、机器周期、指令周期的概念及三者之间的关系;定时器及计数器_xiebingsuccess的博客-CSDN博客_机器周期时钟周期指令周期之间的关系
//延时函数
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. 简单指令需要一个机器周期,复杂指令可能需要两个或两个以上的机器周期。
下面是Cortex-M0的指令集和其所用的周期数Cortex-M0指令集_nolatin的博客-CSDN博客_cortex m0指令集
还有更多的指令集欢迎大家阅读手册时钟周期、机器周期、指令周期的概念及三者之间的关系;定时器及计数器_xiebingsuccess的博客-CSDN博客_机器周期时钟周期指令周期之间的关系
还有就是SWM官网给的手册里面仅有的一段周期介绍
总结上述,计算上面普通的延时函数周期为for(i=1;i<=count;i++) 执行一次为1us,执行十次就为10us,故达到延时的效果。
3.系统滴答计时器(定时器/计数器)
老方法看手册(查找需要用到的寄存器)
初值寄存器LOAD:配置初值寄存器 LOAD,设置计数值,该值以系统时钟为单位递减
使能控制寄存器CTRL:使能控制寄存器(CTRLx)使能位(ENx),对应 TIMERx 开始递减计数,计数到0 时,产生中断,同时重新装载计数值,进行下一周期计数
过装载值寄存器VAL:在计数过程中,可通过对当前值寄存器(CVALx)进行读取,获取当前计数值。定时器计数过程中改变装载值寄存器(LDVALx)值,将在下个计数周期(计数到 0 重新装载)生效,不会改变本周期计数值。
配置定时器的寄存器的思路过程:
初值寄存器装入数——设置过装置寄存器的值——使能控制寄存器使能——开始计时/开始计数——使能控制寄存器使能关闭——清空计数器/计时器。
————————————————
版权声明:本文为CSDN博主「鹿川条也」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_60924455/article/details/127371843
|