×
嵌入式 > 技术百科 > 详情

用 IAR 开发 STM8 时,简单软件延时不起作用的原因

发布时间:2020-12-22 发布时间:
|

近期有幸接手了前任工程师遗留的项目,MCU 选择的是 STM8L151XX,开发工具使用的是 IAR 。打开祖传代码后,通读了一遍,就用ST-Link烧录进去跑程序,结果发现和预想的效果不太一致,尤其是初始化LED闪烁的部分。


代码中LED闪烁原理比较简单,就是传统的更改GPIO电平,再软件延时几百毫秒,然后再改变GPIO电平的方法,这种传统的操作在学单片机第一课就已经开始使用了,按理说不应该出差错。在确认过晶振频率,分频系数,时间周期和机器周期的关系之后,粗略算出的延时函数和代码中的基本一致,所以排除了算数上的错误。延时函数大概是这样的 ↓


void delay_ms(u16 t)

{

  u16 i;

  u16 j; 

  for(i=0;i

  {

    for(j=0;j<400;j++);

  }

    

}


刚好手中有ST-Link,不妨就仿真看一下,是不是延时函数写的不对。在延时函数的前后分别打上断点,把延时增加到5秒左右,方便观察,开启仿真后发现,断点之间执行的特别快,一眨眼就跳过去了。。。索性在延时的时间后面加几个零,没想到也是瞬间就跳过去了,真是活久见!!!


网络是最好的老师,在翻过十几篇帖子之后,我基本确定了问题的所在之处! IAR 编译时的优化程度不能选择太高,否则编译器认为这段代码是无用的,就给优化掉了。。。具体设置路径如下:


在工程上点右键,选择Options ——> C/C++ compiler ——> Optimizations ——> Level 中选择 None(之前是High)

重新编译过后,再把程序烧录进去,延时函数果然生效了,LED 又按照既定的方法闪烁起来,其他功能也恢复正常了。




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
无人机新突破:或将利用手机发射塔追踪无人机