OpenEdv-开源电子网

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

stm32与AVR粗略延时为什么不同

[复制链接]

80

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
678
金钱
678
注册时间
2013-8-16
在线时间
37 小时
发表于 2014-1-16 19:36:49 | 显示全部楼层 |阅读模式

 stm32f103和AVR都使用8M的外部晶振作为系统时钟,但是出现了一个问题。我都使用一个for语句来延时,结果AVR延时的时间明显短于stm32的延时,延时函数如下:

void nop(void)
{}
void delay(u16 counter)
{
 u8 i;

  for(i=0;i<counter;i++)
  {nop();}
}

int main(void)
{
  Led_init();
while(1)
{
  GPIO_SetBits(GPIOC,GPIO_Pin_9);//点亮led
  delay(100);
  GPIO_ResetBits(GPIOC,GPIO_Pin_9);//熄灭led
 }
}
实现相同的功能在stm32和AVR上,结果灯的亮灭频率avr高于stm32
这是什么原因阿?望各位高手能够指点指点,谢谢。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2014-1-16 20:01:17 | 显示全部楼层
这有什么奇怪的,首先,编译器不同,翻译成的汇编代码就不一样,这样,执行delay函数所需要的机器周期就不一样;再者,AVR和STM32的主频不一样,机器周期就不一样,这两者结合下,差别很大的。
态度决定一切
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2014-1-16 20:14:31 | 显示全部楼层
你的主频一样。那么时钟周期一样,但是AVR机器周期为1个时钟周期,也就是1/8M,而STM32机器周期为6个时钟周期,也就是6/8M,就算编译器翻译过来的汇编语句一样,那avr明显要快不少。
态度决定一切
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-1-17 00:22:21 | 显示全部楼层
回复【楼主位】星空:
---------------------------------
你这个代码有问题吧,灯熄灭都没延时。。。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 03:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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