欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-12 14:10:23
...

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

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

void delay_ms(u16 t)
{
  u16 i;
  u16 j; 
  for(i=0;i<t;i++)
  {
    for(j=0;j<400;j++);
  }
    
}

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

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

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

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

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