SWM181——(3)延时函数Delay

目录

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.循环延时

首先要搞明白一些概念,(时钟周期,机器周期,指令周期)附链接参考

时钟周期、机器周期、指令周期的概念及三者之间的关系;定时器及计数器_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.系统滴答计时器(定时器/计数器)

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

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

  

   

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

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

文末,欢迎大家留言讨论,评论区指正,谢谢。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值