打印
[STM8]

stm8中的延时程序

[复制链接]
6509|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 | 只看该作者
这种指令真不好说,不知道是不是程序啊,看不懂

使用特权

评论回复
5
mintspring| | 2015-9-24 22:42 | 只看该作者
"$N:\ndecw x\nnop\nnop\njrne $L\n"真看不懂。

使用特权

评论回复
6
123常青藤123|  楼主 | 2015-9-26 10:30 | 只看该作者
呼唤大神出现!!!这个延时程序无解吗?

使用特权

评论回复
7
734774645| | 2015-9-27 19:02 | 只看该作者
不懂你这如何实现的

使用特权

评论回复
8
123常青藤123|  楼主 | 2015-9-28 20:18 | 只看该作者
等待中。。。。。。,大家给点提示

使用特权

评论回复
9
wahahaheihei| | 2015-9-28 20:52 | 只看该作者
延时不是这样写的

使用特权

评论回复
10
123常青藤123|  楼主 | 2015-9-28 21:05 | 只看该作者
有范例吗?适合STM8的精确延时

使用特权

评论回复
11
123常青藤123|  楼主 | 2015-10-3 20:49 | 只看该作者
顶起来!

使用特权

评论回复
12
cxc123er| | 2015-10-5 15:51 | 只看该作者
这个是汇编指令 _asm 后面是汇编  大致意思应该是 输入N做为循环次数 /n换行 nop是空指令消耗一个时钟周期 他是两个一组 jrne是看N是不是为0判断是否跳转到某个命令地址(看这里应该是跳到你调用后的下一行吧) 具体他计算过程是啥 就是为啥是精确的 也跟执行汇编的时候消耗的指令周期有关(因为我也不知道STM8的汇编对应的周期,就不展开计算了,但是nop指令应该是1个周期)  详细了解可以看PM0044的那本手册 。

使用特权

评论回复
13
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 剩下自己算吧 手机打得,有点乱

使用特权

评论回复
14
123常青藤123|  楼主 | 2015-10-7 21:05 | 只看该作者
非常感谢大神 cxc123er !!!经过你的指点我有些看明白了这个程序,只是像decw、 jrne这些汇编语言是STM8特有的吗?PM0044的手册在哪可以下载?崇拜你大神!

使用特权

评论回复
15
cxc123er| | 2015-10-8 13:56 | 只看该作者
123常青藤123 发表于 2015-10-7 21:05
非常感谢大神 cxc123er !!!经过你的指点我有些看明白了这个程序,只是像decw、 jrne这些汇编语言是STM8 ...

嗯 这些汇编语言不能算是stm8特有的吧,估计stm32也差不多,看指令集情况了。手册的话ST官网直接一搜就有,除了是全英文之外,其它什么都写了,我也看了一下,decw是字自减,消耗一个指令 jrne是两个指令周期。

使用特权

评论回复
16
Snow7| | 2015-10-8 15:19 | 只看该作者
可以延时5个时钟的整数倍,最大值T/5=65535,延时最少5个周期的整倍数+1;
这是什么意思,怎么解释

使用特权

评论回复
17
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.

使用特权

评论回复
18
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个周期

使用特权

评论回复
19
2010小老虎2010| | 2016-5-18 21:37 | 只看该作者

使用特权

评论回复
20
tongmingsu| | 2018-7-22 09:53 | 只看该作者
大神,果然厉害

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

14

帖子

1

粉丝