[STM8] stm8中的延时程序

[复制链接]
6967|19
 楼主| 123常青藤123 发表于 2015-9-23 22:39 | 显示全部楼层 |阅读模式
请大神解析下这个延时程序,比如说 DELAY_100US,怎么计算出延时100US的???小弟刚学不久,看不懂

#ifndef __APP_STM8S_DELAY_US_H
#define __APP_STM8S_DELAY_US_H

//可以延时5个时钟的整数倍,最大值T/5=65535,延时最少5个周期的整倍数+1;去掉中间的两个nop就是3个周期的整倍数
//输入值为需要延迟的时钟数,例如,1600对应100us,时钟数需要是5的整数倍
#define Delay_clk(T) _asm("$N:\ndecw x\nnop\nnop\njrne $L\n",(unsigned int)(T/5));  //@cosmic CxSTM8 4.2.4
#define DELAY_1US    _asm("$N:\ndecw x\nnop\nnop\njrne $L\n",(unsigned int) 3);     //@Cosmic CxSTM8 4.2.4
#define DELAY_10US   _asm("$N:\ndecw x\nnop\nnop\njrne $L\n",(unsigned int) 32);    //@Cosmic CxSTM8 4.2.4
#define DELAY_100US  _asm("$N:\ndecw x\nnop\nnop\njrne $L\n",(unsigned int) 320);   //@Cosmic CxSTM8 4.2.4
#define DELAY_1MS    _asm("$N:\ndecw x\nnop\nnop\njrne $L\n",(unsigned int) 3200);  //@Cosmic CxSTM8 4.2.4
#define DELAY_10MS   _asm("$N:\ndecw x\nnop\nnop\njrne $L\n",(unsigned int) 32000); //@Cosmic CxSTM8 4.2.4
#define DELAY_20MS   _asm("$N:\ndecw x\nnop\nnop\njrne $L\n",(unsigned int) 64000); //@Cosmic CxSTM8 4.2.4

#endif
Luis德华 发表于 2015-9-24 09:25 | 显示全部楼层
这个要看晶振是多大的
 楼主| 123常青藤123 发表于 2015-9-24 15:19 | 显示全部楼层
用的内部16M晶振
玛尼玛尼哄 发表于 2015-9-24 22:33 | 显示全部楼层
这种指令真不好说,不知道是不是程序啊,看不懂
mintspring 发表于 2015-9-24 22:42 | 显示全部楼层
"$N:\ndecw x\nnop\nnop\njrne $L\n"真看不懂。
 楼主| 123常青藤123 发表于 2015-9-26 10:30 | 显示全部楼层
呼唤大神出现!!!这个延时程序无解吗?
734774645 发表于 2015-9-27 19:02 来自手机 | 显示全部楼层
不懂你这如何实现的
 楼主| 123常青藤123 发表于 2015-9-28 20:18 | 显示全部楼层
等待中。。。。。。,大家给点提示
wahahaheihei 发表于 2015-9-28 20:52 来自手机 | 显示全部楼层
延时不是这样写的
 楼主| 123常青藤123 发表于 2015-9-28 21:05 | 显示全部楼层
有范例吗?适合STM8的精确延时
 楼主| 123常青藤123 发表于 2015-10-3 20:49 | 显示全部楼层
顶起来!
cxc123er 发表于 2015-10-5 15:51 | 显示全部楼层
这个是汇编指令 _asm 后面是汇编  大致意思应该是 输入N做为循环次数 /n换行 nop是空指令消耗一个时钟周期 他是两个一组 jrne是看N是不是为0判断是否跳转到某个命令地址(看这里应该是跳到你调用后的下一行吧) 具体他计算过程是啥 就是为啥是精确的 也跟执行汇编的时候消耗的指令周期有关(因为我也不知道STM8的汇编对应的周期,就不展开计算了,但是nop指令应该是1个周期)  详细了解可以看PM0044的那本手册 。
cxc123er 发表于 2015-10-5 16:12 来自手机 | 显示全部楼层
cxc123er 发表于 2015-10-5 15:51
这个是汇编指令 _asm 后面是汇编  大致意思应该是 输入N做为循环次数 /n换行 nop是空指令消耗一个时钟周期  ...

啊,打出来发现有点小错误,N L应该是这段程序的地址出入口,x是循环次数,decw 是自减1,所以是x——的意思,然后是两个空指令,最后是跳转。我估计decw应该也是一个周期,跳转是跳到decw这里,消耗两个周期,这样一次循环是5个,满足注释。如果去掉两个空指令,就是3个周期,也满足。剩下的就是计算喽,循环一次5个周期,16m主频一个就是1/16m 剩下自己算吧 手机打得,有点乱
 楼主| 123常青藤123 发表于 2015-10-7 21:05 | 显示全部楼层
非常感谢大神 cxc123er !!!经过你的指点我有些看明白了这个程序,只是像decw、 jrne这些汇编语言是STM8特有的吗?PM0044的手册在哪可以下载?崇拜你大神!
cxc123er 发表于 2015-10-8 13:56 | 显示全部楼层
123常青藤123 发表于 2015-10-7 21:05
非常感谢大神 cxc123er !!!经过你的指点我有些看明白了这个程序,只是像decw、 jrne这些汇编语言是STM8 ...

嗯 这些汇编语言不能算是stm8特有的吧,估计stm32也差不多,看指令集情况了。手册的话ST官网直接一搜就有,除了是全英文之外,其它什么都写了,我也看了一下,decw是字自减,消耗一个指令 jrne是两个指令周期。
Snow7 发表于 2015-10-8 15:19 | 显示全部楼层
可以延时5个时钟的整数倍,最大值T/5=65535,延时最少5个周期的整倍数+1;
这是什么意思,怎么解释
cxc123er 发表于 2015-10-8 15:36 | 显示全部楼层
Snow7 发表于 2015-10-8 15:19
可以延时5个时钟的整数倍,最大值T/5=65535,延时最少5个周期的整倍数+1;
这是什么意思,怎么解释 ...

5个周期一组如果明白的话,这个不难理解的吧,unsigned int 是16位无符号 范围到65535,所以最大的时间是T是5x65535啊 。  至于最少这个的+1,我估计应该是你调用延时的时候,那一句指令跳转的汇编语句也算在里面了,而且应该这个语句是一个周期,所以看起来+1.
 楼主| 123常青藤123 发表于 2015-10-8 15:38 | 显示全部楼层
以 “#define DELAY_1US    _asm("$N:\ndecw x\nnop\nnop\njrne $L\n",(unsigned int) 3);” 为例,关于"延时最少5个周期的整倍数+1" ,这个注释应该理解为"$N:\ndecw x\nnop\nnop\njrne $L\n"是5个周期的整倍数,(unsigned int) 3运行1个周期
2010小老虎2010 发表于 2016-5-18 21:37 | 显示全部楼层
tongmingsu 发表于 2018-7-22 09:53 | 显示全部楼层
大神,果然厉害
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

14

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部