OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
12
返回列表 发新帖
楼主: 正点原子

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

[复制链接]

  离线 

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2017-3-6
在线时间
6 小时
发表于 2017-3-6 15:30:40 | 显示全部楼层
回复 支持 反对

使用道具 举报

Super 该用户已被删除
发表于 2017-4-20 14:38:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

  离线 

27

主题

91

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2014-8-11
在线时间
3 小时
发表于 2017-7-17 11:39:16 | 显示全部楼层
本帖最后由 xinshou 于 2017-7-17 17:25 编辑

为了满足misra规范,我将代码改成了:
[C] 纯文本查看 复制代码
void  delay_ms(u16 nms)
{
         u8 t;

         if( nms > 65U )
         {
                  t = (u8)(nms/65U);          /* if nms=16640, then t=256, U8 max=255 */

                  t--;
                  while( t > 0U)
                  {
                          delay_us(65000);      /* U16 max= 65535 */
                          t--;
                  }

                  nms = nms%65U;
         }

         delay_us(nms*1000U);
}


不知道执行的延时的准确性 如何?

此外, 函数void delay_us(u16 nus)  的注释:
/*    延时nus
    延时时间=(fac_us*4+4)*nus*(T)
    其中,T为CPU运行频率(Mhz)的倒数,单位为us.
    ......

    这里的 “单位为us” 是指函数的参数的单位是微秒还是CPU的运行频率的倒数?

承蒙各位大神指教!

回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2017-7-17
在线时间
3 小时
发表于 2017-7-17 11:48:47 | 显示全部楼层
太帅了  正好想用 不用TIM4了
回复 支持 反对

使用道具 举报

  离线 

13

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
363
金钱
363
注册时间
2015-11-28
在线时间
61 小时
发表于 2017-10-17 18:14:27 | 显示全部楼层
原子哥~ 有stvd的么?  没用过iar的
回复 支持 反对

使用道具 举报

  离线 

2

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-8-6
在线时间
1 小时
发表于 2017-10-24 15:36:59 | 显示全部楼层
STM8S的系统文件(包括sys.c,delay.c和uart.c三个文件),可否提供下,楼主?email:iapyglide_2118@163.com
回复 支持 反对

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-3-12
在线时间
1 小时
发表于 2018-3-12 09:47:35 | 显示全部楼层
编译都能过,就是延时不能运行卡在开头。把整个汇编拆开写,编译就提示DELAY_XUS,DELAY_US_1没有定义。其他人也有不能运行的。原因有没顶左边起始的,未设置正确频率的,我都没有。但是就是不能运行。
延时函数.jpg
回复 支持 反对

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-3-12
在线时间
1 小时
发表于 2018-3-13 10:32:25 | 显示全部楼层
void delay_ms(u32 nms);是32位,如果调用delay_ms填的是整数,比如delay_ms(10)或者delay_ms(1000),到函数内部

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);
}
nms会溢出,基本都是6553XXXX,int型整数就变的不可知了。只有设置成u16 nms才正常
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

报名原子哥新品发布会&粉丝见面会上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-10-21 22:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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