CH582在使能HAL_SLEEP时,GPIO唤醒将导致软件复位

问题现象:

软件设置使能HAL_SLEEP功能, 并且在初始化时使能了GPIO唤醒功能,GPIO开启下降沿中断功能。当GPIO有中断产生时,有时软件会复位,有时不会。如果不使能HAL_SLEEP功能, GPIO中断不会导致软件复位。

芯片型号:CH582

软件版本:

CH58x_BLE_LIB_V1.30

MESH_LIB_V1.5


理论上不会出现这个问题,开启HAL_SLEEP功能时,芯片会被唤醒。默认使用的是sleep模式,shutdown模式唤醒后芯片会复位。

1、下载官方最新的EVT例程;

2、PM例程有完整的GPIO唤醒,可以参考一下。同时使用PM的例程开启相应的睡眠模式,看看是否会唤醒;

3、可以打印一下复位状态寄存器,看看相应的值为多少。

1656238505174.png


这个问题我遇到过,而且可以复现:



产生脉冲的源码

icon_rar.gifPulse_generate.zip


以下是我的记录


-------------------------------------------------------------------------------------------------------------

## 中断IO测试工程

用于产生一个负脉冲给中断IO,测试单片机是否复位


### 问题现象

IO配置成中断模式,并在BLE peripheral例程中开启HAL_SLEEP,给中断IO一个us级的负脉冲,MCU立即复位


### 处理方法

关机前再配置IO中断(正常工作时关闭中断)。



我的也是使用的蓝牙从机,PA10作为IO下降沿唤醒,不开睡眠的时候,正常,开睡眠的时候,会出现重启现象,重启的寄存器R8_RESET_STATUS为0x01,上电复位。


检查代码是否为最新的,目前官网更新的最新为1.9版本。

先使用PM例程,配置SLEEP模式,其他睡眠模式屏蔽,并验证。

在peripheral例程测试的时候,只需要加上GPIO的配置函数即可,并开启HAL_SLEEP。GPIO触发的时候,注意唤醒后再将GPIO置为浮空的状态。


我目前也遇到了按键芯片重启这个问题,用ch592 peripheral例程测试的时候,加上GPIO的配置函数即可,并开启HAL_SLEEP。

如果是作为遥控器使用,唤醒后gpio设置为浮空状态,还怎么检测下降沿呢?

并且,这个重启现象不一定什么时候出现,随机的。


检查你的代码配置是否合理:

ch573 做蓝牙遥控如何降低功耗? - 沁恒微电子社区 (wch.cn)



我的意思是,按键的gpio如果设置为浮空状态,还如何进入中断呢?需要外部增加上拉电阻么?


目前我的遥控按键是设置为内部上拉,下降沿中断,在中断中设置按键标志位。

现在蓝牙遥控器的基本功能都可以了,功耗也降下来了,就剩下这个按键复位的问题了。如果按键按的比较慢,芯片复位的机会小,因为按键有双击功能,会有多次快速按的时候,就很容易出现芯片复位。


您好,按键的GPIO设置为浮空输入,是要实现什么样的功能。作为按键,一般来讲需要低电平表示按下,就内部上拉;需要高电平表示按下,就内部下拉,二选一。浮空输入一般在采集ADC时使用。

如果一定要配置为浮空输入,需要在休眠前固定电平为接近外部电平的状态,以减小漏电。唤醒后,在TMOS事件中重新配置为浮空输入。EVT例程里悬空引脚一般固定为内部上拉。


该按键有没有被用作为休眠唤醒按键?

若使用了CH582,检查代码里有没有启用看门狗,按下按键复位时,可能是由于IO不具备唤醒的条件,MCU无法进入sleep休眠,导致进入idle休眠,此时若启用了看门狗,会引起看门狗复位。解决方法是在休眠前,判断IO状态,比如说配置为下降沿唤醒,就在休眠前判断IO是否已处于高电平的状态,若是则继续休眠,若否则打断休眠重新配置IO为内部上拉再读IO。

若使用了CH592,上述问题可以在配置R8_SLP_WAKE_CTRL I= RB_GPIO_WAKE_MODE后解决。


若该按键只是被用作按键中断,检查是否有代码跑飞进hard fault后复位的情况。可以按下篇博客排查:CH57x/CH58x/CH32V wch risc-v 芯片hardfault问题追踪&程序卡死追踪 - iot-fan - 博客园 (cnblogs.com)


只有登录才能回复,可以选择微信账号登录