近期有幸接手了前任工程师遗留的项目,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 又按照既定的方法闪烁起来,其他功能也恢复正常了。
关键字:IAR STM8 软件延时
引用地址:
用 IAR 开发 STM8 时,简单软件延时不起作用的原因
推荐阅读最新更新时间:2024-11-09 21:13
IAR创建工程步骤详记
IAR Systems集嵌入式系统的设计、开发和测试一体,是当下比较热门的一款开发工具。 本篇以Cortex-M0系列芯片的工程创建为例,将逐步讲解新工程的创建跟配置。 工程创建 打开IDE 添加工作空间 File→New→Workspace 创建新的工程 Project→Create New Project 工程类型选择 Tool chain - 工具链,默认ARM Project templates - 工程模板,有asm、C++、C等模板可选,在新建的工程中将会添加对应模板的main文件,如果工程文件要自己编写的话默认选择Empty Project,新建一个空的工程 选择工程保存路径及工程名 工程配
[单片机]
中科芯与IAR共建生态合作,IAR集成开发环境全面支持CKS32系列MCU
中国上海 – 2023 年 1 0 月 18 日 – 嵌入式开发软件和服务的全球领导者IAR今日宣布,与中科芯集成电路有限公司(以下简称中科芯)达成生态合作,IAR已全面支持CKS32系列MCU的应用开发。这一合作将进一步推动嵌入式系统的发展,并为开发者提供更完整、高效的开发解决方案。 IAR Embedded Workbench集成开发环境一直是全球众多开发者首选的嵌入式软件开发解决方案之一。 这一强大的工具套件已全面支持中科芯CKS32系列MCU,为开发者提供了无与伦比的支持。通过该解决方案,开发者可以充分利用代码优化功能,同时还享有一系列强大的调试功能,包括代码和数据断点、运行时堆栈分析、调用堆栈可视化等。此外,IAR
[嵌入式]
STM8与汇编语言(5)
上一次的实验程序,完成了LED指示灯的驱动,用到了GPIO的输出方式,这一次要用GPIO的输入方式,进行按键的输入。下面的代码是读入按键值,如果按键按下,则点亮LED,否则熄灭LED。 利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。 编译通过后,下载到开发板,运行程序,可以看到当按下按键时,LED1点亮,当抬起按键时,LED1熄灭。 stm8/ #include mapping.inc ; 涉及到的硬件资源 ; LED1定义在PD3 ; KEY1定义在PD7 ; 下面定义端口D的寄存器地址 PD_ODR EQU $500f PD_IDR E
[单片机]
iar下的stm32启动代码分析
使用的芯片是 STM32F103VET,编译器使用 IAR ARM V5.5 设置头文件查找路径,例如: $PROJ_DIR$.. $PROJ_DIR$......LibrariesCMSISCM3CoreSupport $PROJ_DIR$......LibrariesCMSISCM3DeviceSupportSTSTM32F10x $PROJ_DIR$......LibrariesSTM32F10x_StdPeriph_Driverinc 预定义的symbol 为,HD为high desity 的意思 USE_STDPERIPH_DRIVER STM32F10X_HD 有两个符号是系统默认的,看名字就应该知道什么了
[单片机]
STM8单片机+EV1527无线315&433通用遥控解码
STM8_无线315&433通用解码 单片机源程序如下: /* ********************************************************************************************************* * *模块名称 : EV1527遥控解码 *上升沿触发 触发中断后延时一段时间后检测引脚电平从而判断0 1 采集上升沿触发后第6 10 14 个振荡周期时的引脚电平 RF98 PT2262 连续触发是每个周期的间隔在15MS左右 EV1527 宽电平时间 500US 窄 250us 同步码 5.7MS ************************
[单片机]
MSP430F149学习之路——LED
1 #include msp430x14x.h 2 3 void int_clk(); 4 void delay(int i); 5 void main() 6 { 7 WDTCTL = WDTPW + WDTHOLD; 8 int_clk(); 9 P6DIR = 0XFF; 10 P6OUT = 0Xff; 11 while(1) 12 { 13 P6OUT = 0XFF; 14 delay(20000); 15 P6OUT = 0x00; 16 delay(20000); 17 } 18 } 19 20 void int_clk() 21 { 22 BCSCTL1 &= ~X
[单片机]
关于自制 STM8 Bootloader
由于本人项目需要,要做STM8L052R8的bootloader,用于远程程序升级功能,为了安全考虑,不使用ST自带的bootloader,而是自制bootloader。 基本的功能是这样的,首先程序运行在一个V1.0的版本上,且带了BOOT,当程序收到一条命令后,程序跑入死循环,等待硬件看门狗复位;程序复位后进入bootload区,等待第二条命令的接收,接收到正确的数据帧后,bootloader开始擦除FLASH,并接收数据包,直到最后一个数据包接收完毕,通过指示灯以2HZ的频率闪烁,指示升级完成。 第一步:boot区程序设计,首先修改link文件, define region NearFuncCode = ; de
[单片机]
STM8 存储FLASH、EEPROM、存储保护
FLASH主要特性 STM8内部的FLASH程序存储器和数据EEPROM由一组通用寄存器来控制。用户可以使用这些寄存器来编程或擦除存储器的内容、设置写保护、或者配置特定的低功耗模式。用户也可以对器件的选项字节(Option byte)进行编程。 STM8S EEPROM分为两个存储器阵列: 最多至 128K字节的FLASH程序存储器,不同的器件容量有所不同。请参考4.4存储器组织结构了解更多细节。 最多至 2K字节的数据EEPROM(包括option byte-选择字节),不同的器件容量有所不同。请参考4.4存储器组织结构了解更多细节。 编程模式 字节编程和自动快速字节编程(没有擦除操作) 字编程 块编程和快速块
[单片机]