单片机自动复位原因
单片机自动复位常见的原因有:
1.掉电或电压过低(我用STC单片机的时候遇到过因为电源电压过低而导致自动复位的情况)
2.程序跑飞或者死机后,由看门狗引发的复位
3.复位引脚接收到复位信号(人工产生或者外部看门狗等电路产生)
4.STC89C52RC单片机在使用汇编语言编程时,出现类似C语言中函数递归的语句时,可以自动复位。这个我在实验时看到过这个现象,但具体原因不明,我没有使用看门狗。
5.有些单片机可以在程序控制下自动复位。
单片机复位电路不能复位的原因
STM32f0按键模块电路经常遇到上电不复位的情况,芯片采用的是stm32f030,按键模块采用ZLG7290芯片、4X4按键LED矩阵。ZLG7290是周立功公司专门开发的按键芯片,其最大可支持64个按键和64个LED,可通过I2C协议对其读写,ZLG7290与stm32f030复位电路采用datasheet参考电路,如下:
正常情况下,电路上电后会有一个LED全部点亮的过程,上电稳定延时后,LED自动全部熄灭,正常运行时,按下相应按键其对应的LED灯应被点亮。
问题:
STM32复位电路内部有自带的上拉电阻,同时PVD的电源检测阈值采用的是默认值2.2V,采用电池供电,电压表测量引脚电压在2.8V左右,但是电路上电后不能正常运行,LED矩阵上电不能被点亮,按键按下后相应LED灯无反应。
测试
stm32f030复位测试
stm32f030上电复位后,程序依次执行初始化的过程,其中包括设置时钟为内部48MHZ时钟频率,设置并启动串口、I2C等,之后执行LED灯全部点亮函数,延时3s关闭所有LED并进入主功能程序。
测试任务:stm32f030是否能复位:
既然上电后LED灯不能全部点亮,则LED灯全部点亮函数不能正常执行,则在此函数之前添加一个UART串口发送函数。
测试结果:
串口发送函数被执行,在超级终端收到正常的数据。
此时表示stm32f030能正常复位。
测试任务:注释掉LED灯全部点亮函数
此时上电后,LED不能被全部点亮(函数被注释),但是按下按键后相应LED可以被点亮。此时可锁定问题在LED灯全部点亮函数上。
分析:
LED灯全部点亮函数实际上是一个I2C写函数,通过向ZLG7290相应寄存器写入0xFF,可点亮LED。采用上面测试的方法,在函数的每一条语句之前插入一条UART发送函数,分析执行情况,其中
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
执行没有问题,再次说明stm32f030能正常复位。但是在
I2C_Senddata(I2C1, data);
语句之后,UART发送函数不能被正常执行,因此问题被锁定。
ZLG7290不能被正常读写,很可能ZLG7290没有被复位。
查阅ZLG7290的datasheet,发现ZLG7290复位时间在20ms左右,其远远大于stm32f030,因而产生ZLG7290没有正常复位的情况。
结论:
电路上电不复位的原因可能是多方面的,特别是stm32f030和外围电路均需要复位的情况,因此各个模块可能需要隔离测试,最终锁定问题才能找到解决的方法。