在中断服务函数中调用了一个奇怪的函数irq_print()
...
INTERRUPT_HANDLER(RTC_CSSLSE_IRQHandler, 4)
{
g_rtc_report = 1; //定时器唤醒标志制1, 进入4号中断
RTC_WakeUpCmd(ENABLE); // 唤醒使能
irq_print("RTC interrupt reportn"); //打印由RTC唤醒成功调试信息
RTC_ClearITPendingBit(RTC_IT_WUT); //清除中断标志位
}
...
在预处理发现了它的定义,这是调试信息的宏定义
....
#include
//#define IRQ_DEBUG_PRINT
#ifdef IRQ_DEBUG_PRINT
#define irq_print(format,args...) printf(format, ##args)
#else
#define irq_print(format,args...) do{} while(0);
#endif
...
拿来干嘛的?
我们在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除,而一旦需要再次调试的时候,这些语句又不得不一条条的加上,这给我们带来了很大的不便,浪费了我们很多的时间,也造成了调试的效率低下。所以,很多人会选择使用宏定义的方式来输出调试语句。
分析
1.要调用调试语句时,不注释定义的第一行 ,如果实现相应功能,打印格式参数
#define IRQ_DEBUG_PRINT
此时执行下列两条语句:
#ifdef IRQ_DEBUG_PRINT
#define irq_print(format,args...) printf(format, ##args)
当主函数中调用irq_print()时
就等价替换 printf(format, ##args) 打印调试信息。
2.当不想调用调试语句时,注释定义的第一行 ,
//#define IRQ_DEBUG_PRINT
此时执行下列三条语句:
#else
#define irq_print(format,args...) do{} while(0);
#endif
当主函数中调用irq_print()时
就等价替换do{} while(0);执行空语句
关键字:stm8 中断打印 调试信息 宏定义
引用地址:
stm8中断打印调试信息的宏定义
推荐阅读最新更新时间:2024-03-16 16:26
意法半导体推出新图形用户界面配置器,让STM8微控制器设计变得更快捷
意法半导体最新发布的STM8CubeMX g图形界面配置器让基于深受市场欢迎的8位STM8微控制器的产品设计变得更快捷。下面就随单片机小编一起来了解一下相关内容吧。 意法半导体推出新图形用户界面配置器,让STM8微控制器设计变得更快捷 STM8CubeMX支持 意法半导体 的全部主流低功耗汽车8位微控制器,新版免费开发工具帮助设计人员从 STM8 产品家族中选择一款最适合其应用需求的产品。设计人员也可直接在 意法半导体 的 STM8 开发板上开发应用。首先,按照所选电路板上的微控制器的配置方式配置这款工具,然后STM8CubeMX提供多个图形界面工具,帮助完成所选微控制器的基本配置。这些配置工具包括冲突自动解决引脚配置器、
[单片机]
STM8 PCF8563时钟芯片子程序
软件设计 /********************************************************************* 目 的: 建立PCF8563操作库 目标系统: 基于STM8单片机 应用软件: Cosmic CxSTM8 *********************************************************************/ #include ws_i2c.h //器件地址: #ifndef WD_DADR #define WD_DADR 0xA2 //write device-address #endif #ifndef RD_DA
[单片机]
stm8系列通过option_byte 来实现端口的remaping
最近在调 stm8,发现需要用到端口映射,研究下用option byte来修改 首先确定需求 需要使用PC6来发射方波,用到定时器1的ch1 需要激活重定向 三种方式可以实现,一种是通过IAR for stm8,一种是stvp,一种是在程序执行的时候去改通过程序写flash,这儿先介绍软件的方式 IAR 改option byte 打开IAR 打开option bytes 右击 选择 激活 保存到制定位置 右击打开option 找到地方,勾选之后,在重新rebuil all 然后烧录就行了 stvp 这个就简单了 打开,选择型号,点开option byte 下拉框选一下,然后电机这
[单片机]
IAR for stm8 中指定编译的起始地址
IAR for stm8 中指定编译的起起地址 已经用STVD+cosmic完成了IAP功能,但想试着在STM8上跑上官的UCOS,不得不用IAR编译,但编译后代码的生成地址怎么再从0X9000开始生成呢,找遍全网,也没有发现三言两语直接的表白,又对IAR环境不熟,看过了IAR下的工程设置的全部选项,都没有发现怎么修改这个地址,IAR的这个地址的修改,并不象KEIL及STVD下那么直接,它必须通过IAR的根目录下有个CONFIG的文件夹,里面有各种单片机的*.icf的文件,我看着有两处0x8000改为0x9000,然后编译文件,呵呵,果然有效,在STVP下,发现HEX文件就是从0x9000开始生成代码了。找的好辛苦,又不太懂英文看帮
[单片机]
STM32M CUBE实现printf打印调试信息以及实现单字节接收
在写单片机程序时我们一般喜欢使用printf来通过串口打印调试信息,但这个函数是不可以直接使用的,必须做点对库函数的改动。 详细工程下载地址: http://download.csdn.net/detail/liucheng5037/8847961 STM32M CUBE是ST官方提供的库以及初始化工具,很好很强大,但是在UART方面值提供了如下函数: HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); HAL_StatusTypeDef HAL_
[单片机]
STM8 IO外部中断设置问题
STM8 IO外部中断设置问题(使用库函数) STM8,掉坑: 程序里面,首先开启了总中断,enableInterrupts(); // 打开总中断 在之后的程序里面,设置打开IO口外部中断,并设置触发电平,代码如下:(坑在这里,注意!!!) GPIO_Init(PORT_BLE_STA, PIN_BLE_STA, GPIO_Mode_In_PU_IT);//上拉,开中断 EXTI_SetPinSensitivity(EXTI_PIN_BLE_STA, EXTI_Trigger_Falling);//下降沿中断 之后杯具发生了,一旦IO口产生一个下降沿,程序马上死掉,看门狗复位。 定位发现,是因为不停
[单片机]
stm8之OptionByte的使用
1.选项字节的概念(参考stm8s中文数据手册): 选项字节包括芯片硬件特性的配置和存储器的保护信息,这些字节保存在存储器中一个专用的 块内。除了ROP(读出保护)字节,每个选项字节必须被保存两次,一个是通常的格式(OPTx)和 一个用来备份的互补格式(NOPTx)。可以在ICP模式(通过SWIM)下访问下表中EEPROM的地址来修改选项字节。 选项字节也可以通过应用程序在IAP模式下修改,但是ROP选项只能在ICP模式(通过SWIM)下被 修改。 2.ISP IAP ICP的概念(有待学习): ISP:In System Programing, 在系统编程 程序完全下载 IAP:In applicating Progr
[单片机]
STM8学习笔记三——错误:no definition for "assert_failed"
在STM8程序编译过程中,我碰到了这样的错误: Error : no definition for assert_failed 出现这个问题的原因是因为: void assert_failed(u8* file, u32 line); 这个函数在“stm8s_conf.h”这个文件中只是单纯的声明,他的作用来在我们在做串口调试时返回值验证出错的时候调用。因此我们需要在某个地方将这个函数进行实现。一般将他放在“main.c”进行实现。 解决方法如下: 1、在main.c代码里添加以下代码: #ifdef USE_FULL_ASSERT void assert_failed(u8* file, u32 line) { /* Use
[单片机]