一个未初始化的局部变量引起的BUG(二)-PC13引脚异常

现象:

STM32F030C8中PC13引脚异常,配置为GPIO输出,有时编译后出现异常,表现如下:
1、不能输出高电平。
2、烧回原来正确的版本固件,也不能输出高电。
3、过一段时间后,能恢复。
4、同样的代码,改变一下编译优化等级,有可能正常。也有可能不正常。
5、同样的代码,交换一下代码顺序,有可能正常。也有可能不正常。
6、同样的代码,添加或屏蔽一段代码,有可能正常。也有可能不正常。

分析:

1、PC13引脚与RTC功能复用,有可能是因此引起:

一个未初始化的局部变量引起的BUG(二)-PC13引脚异常_第1张图片
PC13引脚可用配置选项如下:
一个未初始化的局部变量引起的BUG(二)-PC13引脚异常_第2张图片

2、在线调试发现,异常时,RTC_TS input enabled位会被置1。
3、查询代码发现 进行RTC初始化时,屏蔽了一段代码:

一个未初始化的局部变量引起的BUG(二)-PC13引脚异常_第3张图片
4、查询RTC_Init(),发现RTC-CR未进行明确初始化,且采用“|=”进行赋值,
RTC_InitStruct->RTC_HourFormat由于前面实参被屏蔽,实参值为局部变量的值,而局部变量由于前面被屏蔽,未进行明确初始化,其值处于未定状态。此可能导致RTC_TS input enabled位会被置1。

一个未初始化的局部变量引起的BUG(二)-PC13引脚异常_第4张图片

解决办法:

打开被屏蔽语句,进行明确初始化。

总结:

对于未明确初始化的局部变量,一定要慎重处理。

你可能感兴趣的:(MCU,C/C++,编译,bug,单片机,stm32,c语言)