STM32单片机常见的工作异常现象分析及解决方案
STM32单片机是一种流行的微控制器单片机,它广泛应用于工业控制、消费电子、汽车电子等领域。然而,在实际应用中,STM32单片机也经常出现工作异常现象,例如程序运行一段时间后停止工作、无法进入main函数中的while(1)循环等。今天,我们将讨论一种常见的工作异常现象,即STM32单片机在工作时出现的奇怪现象:在线调试正常;每次烧写完后工作正常;重新上电有时候工作正常,有时候工作不正常;工作不正常时,按下复位按键,恢复正常。
导致这种工作异常现象的原因可能有多种,例如初始化过程中程序陷入死循环、板子上电后不断复位、电源问题等。但是,在这个案例中,我们将着重分析软件方面的原因。
在分析过程中,我们首先检查硬件方面的可能原因,例如确认BOOT0管脚接10kΩ欧(电阻)下拉到地、RC上电延时复位(电路)中,R为10kΩ,C由0.1uF改为10uF等。但是,经过检查,我们并没有发现任何硬件方面的错误。
于是,我们将注意力转移到软件方面。通过在初始化代码中添加延时,来确认板子是否在不停复位。结果表明,程序运行出错,不运行了。然后,我们不断修改(led)灯在初始化代码中的位置,最终定位到导致运行出错的代码:配置一个GPIO为外部中断,跳变沿触发,上拉。把上拉改为NOPULL,工作一切正常。
问题的关键在于,配置为外部中断的GPIO悬空导致。在这个案例中,之前工作正常的样板是一直有连接到那个IO脚的外接模块,这个工作不正常的没有接,导致IO管脚电平不确定。由于电平的不确定,在初始化的瞬间有一个跳变沿,导致程序进入外部中断服务函数。在中断服务函数中,要读取一个(定时器)的(寄存器)的值,但是要读取的定时器可能还没有完成初始化,导致读取失败,程序运行异常。
因此,解决这个问题的方法是:
1. PULL模式有PULLRISING改为NOPULL。
2. 在这个外部中断之前进行(TI)mer的初始化。
通过这个案例,我们可以看到,在STM32单片机的应用中,软件方面的错误可能会导致奇怪的工作异常现象。因此,在实际应用中,我们需要小心地检查软件方面的代码,避免错误的出现。