OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 40397|回复: 64

仿ALIENTEK STM32开发板,写的STM8S的延时函数(基于IAR),汇编精确延时.奉献给大家了.

  [复制链接]

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164867
金钱
164867
注册时间
2010-12-1
在线时间
2099 小时
发表于 2013-6-26 21:25:25 | 显示全部楼层 |阅读模式

已经写完了STM8S的系统文件(同stm32一样,包括sys.c,delay.c和uart.c三个文件)
这里先分享delay.c和delay.h.
本来想仿效STM32用一个定时器来做,无奈STM8S提供的是一个8位定时器,真是食之无味了...
算来算去,用这个8位的定时器横竖都不好做延时,用16位的定时器嘛又怕浪费.真不知道st的人怎么想的.
这个8位的基本定时器,连ucosii的滴答时钟都不好提供...(24Mhz下,最大只能1.3ms左右中断一次,16Mhz则是2ms左右)
难不成多次中断,触发一次任务切换?
所以,表示蛋疼的很,无奈只能想用汇编的方式来实现精确延时了.
研究了几天,终于小有成就.汇编写了一个us级延时函数,还算比较准.
24M和8M时,差别有点多,24M时STM8S要插入一个flash等待周期,这样st说是可以提供20MIPS的性能,但是我迷糊了...到底此时的指令周期如何算?st没有提到.
最后测试发现,大概是19Mhz的指令运行速度,也就是单周期指令,执行时间在24M时钟频率下约为1/19Mhz 秒.单根据我的计算公式,得不到19这个值,于是只能取近似了,按理说20比较准,不过实测16会准确一些.故采用了16,然后导致的结果就是延时变快了.
比如延时100ms,实际上可能是92ms左右.

而8Mhz时,差别有点多,表示不太理解,因为根据我的设计,刚好是8个周期的,应该是延时准确才对,但事实并非如此.
下面是各时钟频率下的延时准确性(测试时使用的延时至少>10us):
 //92%  @24Mhz
//98%   @16Mhz
//98%   @12Mhz
//86%   @8Mhz
可以看到,12M和16M条件下有比较高的准确度,24M稍微差点(主要是偏快).
一般应用,这样的精度,应该都可以满足使用了,源码下面附上,如有改进意见,欢迎提出,开源才能集思广益,而后才能精益求精.


delay.h代码如下:

#ifndef  __DELAY_H
#define  __DELAY_H
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////// 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK
//使用汇编代码进行精确延时处理
//包括delay_us,delay_ms
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2013/6/25
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//******************************************************************************
//V1.0 20130625
//支持不同时钟频率
//提供delay_us,delay_ms两个延时函数.
////////////////////////////////////////////////////////////////////////////////

void delay_init(u8 clk); //延时函数初始化
void delay_us(u16 nus);  //us级延时函数,最大65536us.
void delay_ms(u32 nms);  //ms级延时函数
#endif

delay.c代码如下:

#include "delay.h"
//////////////////////////////////////////////////////////////////////////////// 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK
//使用汇编代码进行精确延时处理
//包括delay_us,delay_ms
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2013/6/25
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//******************************************************************************
//V1.0 20130625
//支持不同时钟频率
//提供delay_us,delay_ms两个延时函数.
////////////////////////////////////////////////////////////////////////////////


volatile u8 fac_us=0; //us延时倍乘数  

//延时函数初始化
//为确保准确度,请保证时钟频率最好为4的倍数,最低8Mhz
//clk:时钟频率(24/16/12/8等)
void delay_init(u8 clk)
{
 if(clk>16)fac_us=(16-4)/4;//24Mhz时,stm8大概19个周期为1us
 else if(clk>4)fac_us=(clk-4)/4;
 else fac_us=1;
}
//延时nus
//延时时间=(fac_us*4+4)*nus*(T)
//其中,T为CPU运行频率(Mhz)的倒数,单位为us.
//准确度:
//92%  @24Mhz
//98%  @16Mhz
//98%  @12Mhz
//86%  @8Mhz
void delay_us(u16 nus)

__asm(
"PUSH A          \n"  //1T,压栈
"DELAY_XUS:      \n"  
"LD A,fac_us     \n"   //1T,fac_us加载到累加器A
"DELAY_US_1:     \n"  
"NOP             \n"  //1T,nop延时
"DEC A           \n"  //1T,A--
"JRNE DELAY_US_1 \n"   //不等于0,则跳转(2T)到DELAY_US_1继续执行,若等于0,则不跳转(1T).
"NOP             \n"  //1T,nop延时
"DECW X          \n"  //1T,x--
"JRNE DELAY_XUS  \n"    //不等于0,则跳转(2T)到DELAY_XUS继续执行,若等于0,则不跳转(1T).
"POP A           \n"  //1T,出栈
);
}
//延时nms 
//为保证准确度,nms不要大于16640.
void delay_ms(u32 nms)
{
 u8 t;
 if(nms>65)
 {
  t=nms/65;
  while(t--)delay_us(65000);
  nms=nms%65;
 }
 delay_us(nms*1000);
}

 

 

 

 

 

 

 

 

 

 

 

 


 

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2013-5-12
在线时间
26 小时
发表于 2014-2-26 01:15:03 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
謝謝了  已經修改為STVD的了呵呵
#include "delay.h"
////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK 
//使用汇编代码进行精确延时处理
//包括delay_us,delay_ms
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2013/6/25
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//******************************************************************************
//V1.0 20130625
//支持不同时钟频率
//提供delay_us,delay_ms两个延时函数. 
//////////////////////////////////////////////////////////////////////////////// 


volatile u8 fac_us=0; //us延时倍乘数   

//延时函数初始化
//为确保准确度,请保证时钟频率最好为4的倍数,最低8Mhz
//clk:时钟频率(24/16/12/8等) 
void delay_init(u8 clk)
{
 if(clk>16)fac_us=(16-4)/4;//24Mhz时,stm8大概19个周期为1us
 else if(clk>4)fac_us=(clk-4)/4; 
 else fac_us=1;
}
//延时nus
//延时时间=(fac_us*4+4)*nus*(T)
//其中,T为CPU运行频率(Mhz)的倒数,单位为us.
//准确度:
//92%  @24Mhz
//98%  @16Mhz
//98%  @12Mhz
//86%  @8Mhz
void delay_us(u16 nus)
{  
#asm
PUSH A            //1T,压栈
DELAY_XUS:         
LD A,_fac_us        //1T,fac_us加载到累加器A
DELAY_US_1:       
NOP              //1T,nop延时
DEC A             //1T,A--
JRNE DELAY_US_1    //不等于0,则跳转(2T)到DELAY_US_1继续执行,若等于0,则不跳转(1T).
NOP               //1T,nop延时
DECW X            //1T,x--
JRNE DELAY_XUS      //不等于0,则跳转(2T)到DELAY_XUS继续执行,若等于0,则不跳转(1T).
POP A             //1T,出栈
#endasm 

//延时nms  
//为保证准确度,nms不要大于16640.
void delay_ms(u32 nms)
{
 u8 t;
 if(nms>65)
 {
  t=nms/65;
  while(t--)delay_us(65000);
  nms=nms%65;
 }
 delay_us(nms*1000);
}
回复 支持 1 反对 0

使用道具 举报

109

主题

1608

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2013-6-27 10:02:35 | 显示全部楼层
原子哥,你这也忒牛了,都加入汇编了。一般我在stm8里面做延时,都基本用定时器去搞定了。懒得研究的那么透彻,呵呵。
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164867
金钱
164867
注册时间
2010-12-1
在线时间
2099 小时
 楼主| 发表于 2013-6-27 10:42:51 | 显示全部楼层
stm8定时器少啊,经不起挥霍,本想用TIM4做,无奈STM8的TIM4离期望值太远....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

107

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2013-5-5
在线时间
0 小时
发表于 2013-6-27 19:44:18 | 显示全部楼层
不错,顶原子哥,先收着,以后会用到,前段时间自己也搞了会STM8,比51爽多了还很便宜!
游走在生活里,你我都是涉世未深的旅人,前方有我们为之心怡的归宿,身后又是一片葱郁的往昔,让生活的零碎随风而来,又似过往的随风云烟而散,唯有这厮,方能守得云开,待到春花烂漫!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2012-4-15
在线时间
3 小时
发表于 2013-7-30 23:32:46 | 显示全部楼层
支持原子哥玩STM8!
回复 支持 反对

使用道具 举报

8

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2012-10-18
在线时间
7 小时
发表于 2013-8-9 11:03:38 | 显示全部楼层
这个太有用了,顶完了再回去看!
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
发表于 2013-10-21 12:01:05 | 显示全部楼层
原子哥,我用的是STM8S105C6,可是我复制你这延时函数不能用啊
程序死在汇编上
努力?奋斗
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164867
金钱
164867
注册时间
2010-12-1
在线时间
2099 小时
 楼主| 发表于 2013-10-21 14:24:48 | 显示全部楼层
回复【7楼】原味_郭:
---------------------------------
这我就不晓得了...
我用过STM8S207可以。
STM8S003可以
其他,没测试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164867
金钱
164867
注册时间
2010-12-1
在线时间
2099 小时
 楼主| 发表于 2014-2-26 15:36:35 | 显示全部楼层
回复【9楼】龙胜阳子:
---------------------------------
谢谢分享.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-2-27
在线时间
0 小时
发表于 2014-2-27 10:46:14 | 显示全部楼层
哈哈~发财啦,正好这两天需要这种精确延时,但定时器又不够用,太谢谢啦……
回复 支持 反对

使用道具 举报

7

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2012-7-16
在线时间
504 小时
发表于 2014-5-21 09:58:58 | 显示全部楼层
非常好,前人栽树,后人乘凉。
回复 支持 反对

使用道具 举报

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2012-3-28
在线时间
1 小时
发表于 2014-6-4 16:42:27 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
这个函数感觉24Mhz 和 16Mhz 得到的fac_us都一样啊,都为3
void delay_init(u8 clk)
{
 if(clk>16)fac_us=(16-4)/4;//24Mhz时,stm8大概19个周期为1us
 else if(clk>4)fac_us=(clk-4)/4; 
 else fac_us=1;
}
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164867
金钱
164867
注册时间
2010-12-1
在线时间
2099 小时
 楼主| 发表于 2014-6-4 23:23:18 | 显示全部楼层
回复【13楼】huangxw:
---------------------------------
是的,这两个频率是一个值.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
651
金钱
651
注册时间
2012-8-1
在线时间
68 小时
发表于 2014-6-6 13:56:10 | 显示全部楼层
好东西,正有用,谢谢分享
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-7-1 11:06:08 | 显示全部楼层
stm32f10x_it.c(203): error:  #1113: Inline assembler not permitted when generating Thumb code

原子哥是在MDK里做的么
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164867
金钱
164867
注册时间
2010-12-1
在线时间
2099 小时
 楼主| 发表于 2014-7-1 23:40:08 | 显示全部楼层
回复【16楼】wwjdwy:
---------------------------------
是IAR....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

15

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2013-6-3
在线时间
1 小时
发表于 2014-9-4 14:56:53 | 显示全部楼层
回复【17楼】正点原子:
---------原子哥,求原文件......
没有签名
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164867
金钱
164867
注册时间
2010-12-1
在线时间
2099 小时
 楼主| 发表于 2014-9-5 00:01:27 | 显示全部楼层
回复【18楼】383382352:
---------------------------------
楼主位就是源码。。。
如果这都难得去整理,那我也没办法了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-2-9
在线时间
0 小时
发表于 2014-9-14 22:43:22 | 显示全部楼层
STM8S103 编译可以通过,但是程序死在汇编上了,出不来,求解答~~~
回复 支持 反对

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2013-7-21
在线时间
25 小时
发表于 2014-9-25 17:55:31 | 显示全部楼层
太帅了,先收藏,改天试试~
回复 支持 反对

使用道具 举报

39

主题

599

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2102
金钱
2102
注册时间
2011-9-3
在线时间
117 小时
发表于 2014-10-1 13:55:27 | 显示全部楼层
回复【20楼】12345:
---------------------------------
IAR环境,同样死在汇编上。看了下,有好几个碰到这种情况了,是否哪里还需要修改?
回复 支持 反对

使用道具 举报

39

主题

599

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2102
金钱
2102
注册时间
2011-9-3
在线时间
117 小时
发表于 2014-10-1 14:05:23 | 显示全部楼层
 环境:IAR.
MCU:STM8S003:
问题:一直停在汇编__asm(  前面,无法过去。如图:


回复 支持 反对

使用道具 举报

39

主题

599

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2102
金钱
2102
注册时间
2011-9-3
在线时间
117 小时
发表于 2014-10-1 14:28:49 | 显示全部楼层
知道原因了。留意时钟设置与延时函数一致即可。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2014-6-26
在线时间
2 小时
发表于 2014-10-8 10:15:15 | 显示全部楼层
回复【7楼】原味_郭:
---------------------------------延时函数初始化了没?
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-2-9
在线时间
0 小时
发表于 2014-10-13 14:58:42 | 显示全部楼层
时钟设置和延时函数一致????能不能说清楚一点,是时钟设置成16M或8M的意思吗?
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-2-9
在线时间
0 小时
发表于 2014-10-13 14:59:05 | 显示全部楼层
回复【24楼】螃蟹爱虫:
---------------------------------
时钟设置和延时函数一致????能不能说清楚一点,是时钟设置成16M或8M的意思吗?
回复 支持 反对

使用道具 举报

39

主题

599

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2102
金钱
2102
注册时间
2011-9-3
在线时间
117 小时
发表于 2014-10-17 16:48:06 | 显示全部楼层
回复【27楼】12345:
---------------------------------
时钟频率如果是16M.那么延时函数的实参与时钟频率一致,同样为16M.就不会得不到想要的结果.
回复 支持 反对

使用道具 举报

27

主题

309

帖子

1

精华

高级会员

Rank: 4

积分
774
金钱
774
注册时间
2012-6-19
在线时间
19 小时
发表于 2014-12-12 15:06:00 | 显示全部楼层
好贴加精!!!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-6-4
在线时间
0 小时
发表于 2015-6-4 14:05:00 | 显示全部楼层
请问汇编里面(DECW X)这句是什么意思?是不是对参数nus递减运算?
回复 支持 反对

使用道具 举报

54

主题

136

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2014-3-6
在线时间
41 小时
发表于 2015-7-13 21:48:37 | 显示全部楼层
汇编语言要贴左边写!!!原子大神,原先我的delay_us(nus)中的汇编  和一般程序一样 不靠边 结果就死在汇编这了, 但是左对齐后 就运行正常了 这科学吗???
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164867
金钱
164867
注册时间
2010-12-1
在线时间
2099 小时
 楼主| 发表于 2015-7-13 22:50:22 | 显示全部楼层
回复【31楼】春和景明:
---------------------------------
好久没用了。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-3-7
在线时间
2 小时
发表于 2015-8-22 22:19:18 | 显示全部楼层
#include "sys.h"没有呀,我换成#include "stm8s.h",编译没问题了,不知道影响使用吗?
天赋决定了你定达到的上限,努力程度决定了你能达到的下限,以绝大多数人的努力程度之低,远远没有达到要去拼天赋的地步。
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-2-24
在线时间
1 小时
发表于 2015-9-2 19:23:50 | 显示全部楼层
原子哥,sys和uart能给出来不
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164867
金钱
164867
注册时间
2010-12-1
在线时间
2099 小时
 楼主| 发表于 2015-9-3 23:26:03 | 显示全部楼层
 回复【34楼】 seuchenhui :
---------------------------------
没哦
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
435
金钱
435
注册时间
2014-8-16
在线时间
56 小时
发表于 2015-9-21 14:10:38 | 显示全部楼层
原子哥,我使用了你的延时函数,delay_ms(1000),好像不是很准确,很久。
时钟初始化我选择16Mhz的
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164867
金钱
164867
注册时间
2010-12-1
在线时间
2099 小时
 楼主| 发表于 2015-9-21 22:40:08 | 显示全部楼层
回复【36楼】fanleung:
---------------------------------
我测试过是挺准的,不过好久了,没办法帮你在验证.
你查查看是不是时钟不对吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-10-7
在线时间
5 小时
发表于 2015-12-22 15:07:46 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
原子哥 想问下 如果延时时音没到  会执行其它的吗? 嘿嘿看不懂汇编。。
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-10-7
在线时间
5 小时
发表于 2015-12-22 15:08:15 | 显示全部楼层
回复【38楼】NE558:
---------------------------------
就是 不会是无限等待吧?
回复 支持 反对

使用道具 举报

13

主题

139

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1095
金钱
1095
注册时间
2015-12-20
在线时间
117 小时
发表于 2015-12-22 17:33:40 | 显示全部楼层
回复【37楼】正点原子:
---------------------------------
新手想请教:
1、不同型号STM8S延时误差是否一样?
2、你是怎样测试延时是否准确?
回复 支持 反对

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2015-9-14
在线时间
9 小时
发表于 2016-3-25 14:52:11 | 显示全部楼层
今天用到了,比TIM4做的延时好用多了,谢谢分享,多多学习。
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2016-3-25 19:07:17 | 显示全部楼层
nice ! cool!
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-4-26
在线时间
4 小时
发表于 2016-5-25 20:21:12 | 显示全部楼层
本帖最后由 Joen0_0 于 2016-5-25 20:23 编辑

#include "delay.h"

volatile u8 fac_us=0; //us延时倍乘数

void CLK_init(u8 clk)
{
  //CLK_SWR=0xB4; 外部时钟HSE
  CLK_SWR=0xe1;   //内部高速HSI
  CLK_CKDIVR=0x00;  //不分频

if(clk>16)fac_us=(16-4)/4;//24Mhz时,stm8大概19个周期为1us
else if(clk>4)fac_us=(clk-4)/4;
else fac_us=1;
}

void delayus(u16 us)
{
  __asm(
  "PUSH A          \n"  //1T,压栈
  "DELAY_XUS:      \n"   
  "LD A,fac_us     \n"   //1T,fac_us加载到累加器A
  "DELAY_US_1:     \n"  
  "NOP             \n"  //1T,nop延时
  "DEC A           \n"  //1T,A--
  "JRNE DELAY_US_1 \n"   //不等于0,则跳转(2T)到DELAY_US_1继续执行,若等于0,则不跳转(1T).
  "NOP             \n"  //1T,nop延时
  "DECW X          \n"  //1T,x--
  "JRNE DELAY_XUS  \n"    //不等于0,则跳转(2T)到DELAY_XUS继续执行,若等于0,则不跳转(1T).
  "POP A           \n"  //1T,出栈
  );
}

//为保证准确度,nms不要大于16640
void delayms(u16 ms)
{
  u8 t;
if(ms>65)
{
  t=ms/65;
  while(t--)delayus(65000);
  ms=ms%65;
}
delayus(ms*1000);
}

主函数
#include "include.h"

void LED_init(void)
{
  //PC_DDR|=0x08;设置PC3为输出模式
  //PC_CR1|=0x08;设置PC3为推挽输出
  //PC_CR2|=0x00;设置PC3为10MHz快速输出
  
  PB_DDR|=0x20;
  PB_CR1|=0x20;
  PB_CR2|=0x00;
}


void main( void )
{
  CLK_init(8);
  LED_init();
  
  while (1)
        {
          PB_ODR^=0x00;
           delayms(1000);
          PB_ODR^=0xf0;
           delayms(1000);
        }
}

以肉眼看秒表和灯,亮一秒,灭一秒,判定,16M的配置(HSI不分频),给8M的值才正常工作。
原子哥,是我哪写错了?
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-4-26
在线时间
4 小时
发表于 2016-5-25 20:57:27 | 显示全部楼层
void delay_us(unsigned int a)
{
//24M 1个int a延时0.68uS
//16M 1.02us
while(a--);
}
我参照这个us的延时,就对了,原子哥,是不是你的us函数确实有问题?
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2014-6-23
在线时间
17 小时
发表于 2016-6-14 20:47:10 | 显示全部楼层
mark~~
回复 支持 反对

使用道具 举报

18

主题

149

帖子

0

精华

高级会员

Rank: 4

积分
763
金钱
763
注册时间
2015-11-28
在线时间
208 小时
发表于 2016-8-6 21:19:50 | 显示全部楼层
有用。第一次用STM8
回复 支持 反对

使用道具 举报

2

主题

58

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5456
金钱
5456
注册时间
2016-3-23
在线时间
483 小时
发表于 2016-8-21 09:24:46 | 显示全部楼层
本帖最后由 skygz 于 2016-8-21 09:27 编辑

在STM8S103F3P6   用 模拟I2C,   不准,   不知是否我的用法不对

main.c 初始化是        Delay_Init(CLK_GetClockFreq()/1000000);


#define IIC_SCL  ((pByte_Of_bit)&GPIOB->ODR)->Bit4
#define IIC_SDA  ((pByte_Of_bit)&GPIOB->ODR)->Bit5
#define READ_SDA  ((pByte_Of_bit)&GPIOB->IDR)->Bit5

//初始化IIC

void IIC_Configuration(void)
{
        GPIO_Init(IIC_GPIO, IIC_PIN_SCL, GPIO_MODE_OUT_PP_HIGH_SLOW);
        GPIO_Init(IIC_GPIO, IIC_PIN_SDA, GPIO_MODE_OUT_PP_HIGH_SLOW);

        IIC_SCL = 1;
        IIC_SDA = 1;
}

void IIC_SDA_OUT(void)
{
        GPIO_Init(IIC_GPIO, IIC_PIN_SDA, GPIO_MODE_OUT_PP_HIGH_SLOW);
}

void IIC_SDA_IN(void)
{
        GPIO_Init(IIC_GPIO, IIC_PIN_SDA, GPIO_MODE_IN_PU_NO_IT);
}


模拟I2C的起始时间
//产生IIC起始信号
void IIC_Start(void)
{
        IIC_SDA_OUT();     //sda线输出
        IIC_SDA = 1;
        IIC_SCL = 1;
        delay_us(5);
        IIC_SDA = 0; //START:when CLK is high,DATA change form high to low
        delay_us(6);
        IIC_SCL = 0; //钳住IIC总线,准备发送或接收数据
}

1.JPG 2.JPG


回复 支持 反对

使用道具 举报

1

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-8-26
在线时间
20 小时
发表于 2016-12-20 22:46:53 | 显示全部楼层
谢谢大家的分享!
学以致用!
回复 支持 反对

使用道具 举报

4

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2016-12-7
在线时间
13 小时
发表于 2017-1-6 09:32:03 | 显示全部楼层
我直接copy过去,1us的延时用示波器看大概在15us左右,怎么回事?
main()
{
        delay_init(0x08);
        FM25Wxx_Init();
        while (1)
        {               
                SpiSim_SCK=0;
                delay_us(1);
                SpiSim_SCK=1;
                delay_us(1);
  }
       
}
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-12-22
在线时间
7 小时
发表于 2017-1-7 19:27:05 | 显示全部楼层
收藏一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-14 16:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表