控制系统 > 详情

单片机自动复位原因_单片机复位电路为什么不能复位

发布时间:2023-08-10 发布时间:
|

  单片机自动复位原因

  单片机自动复位常见的原因有:

  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和外围电路均需要复位的情况,因此各个模块可能需要隔离测试,最终锁定问题才能找到解决的方法。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
采用STM32G071RB和Arduino IDE实现的智能插座设计报告