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

    近期有幸接手了前任工程师遗留的项目,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)

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

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用IAR实现LED灯闪烁的步骤如下: 1. 配置IAR开发环境:首先,确保你已经安装了IAR Embedded Workbench for ARM,并且正确配置了开发板的相关信息。 2. 创建一个新的工程:在IAR中,选择File -> New -> Project,选择适合你的开发板的项目模板,例如STM32F4xx。 3. 配置工程设置:在项目属性中,设置正确的芯片型号、钟频率等信息。确保选择了正确的编译器和调试器。 4. 编写代码:在工程中创建一个新的源文件,例如main.c。在该文件中,编写LED灯闪烁的代码。以下是一个简单的示例代码: ```c #include "stm32f4xx.h" int main(void) { // 初始化LED引脚 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); while (1) { // 点亮LED GPIO_SetBits(GPIOA, GPIO_Pin_5); // 一段间 for (int i = 0; i < 1000000; i++); // 熄灭LED GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 一段间 for (int i = 0; i < 1000000; i++); } } ``` 5. 编译和下载:在IAR中,选择Project -> Rebuild All来编译工程。然后,将生成的可执行文件下载到开发板上进行调试。 6. 调试和测试:连接开发板并启动调试器,在IAR中选择Debug -> Download and Debug来下载并开始调试。LED灯应该开始闪烁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值