嵌入式技术william hill官网
直播中

河神大人

8年用户 1506经验值
擅长:电源/新能源
私信 关注
[问答]

STM32L431 PA0唤醒无限重启是怎么回事

stm32L431,在做待机唤醒时,PA0接到低电平保持低电平时stm32无限重启,按理说PA0是边沿唤醒,怎么成了电平唤醒。

1.jpg

2.jpg

这是个什么情况,PA0端口没有外接上拉电阻,按照stm32官方例程,
HAL_PWREx_EnableGPIOPullDown(PWR_GPIO_A, PWR_GPIO_BIT_0);HAL_PWREx_EnablePullUpPullDownConfig();
这两个函数是可以让PA0待机时保持上拉,即使待机重启后也能保持

1.jpg

实际测试时,进入待机后PA0接到低电平保持住低电平,stm32就无限重启,像是低电平唤醒,但是应该下降沿只唤醒一次啊。

修改即使按官方的例程库修改一下keil中运行还是这样无限重启。这是什么情况?

回帖(13)

杨秀英

2022-10-28 09:58:09
有一点注意: HAL_PWREx_EnableGPIOPullDown 这个重启后,还有效,可以上电初始化时 disable掉
StandBy 模式,重新进入前,清一下 Wake的标志位
举报

河神大人

2022-10-28 09:58:28
是的HAL_PWREx_EnableGPIOPullUp 这个重启后还是有效,就是PA0一直保持为高,这样PAO不用外接上赖电阻,外部拉低PA0就能唤醒,但是PA0拉低后一直反复重启,感觉stm32L431这儿有bug,测试了很久。拉低PA0后一直重启,按道理PA0下降沿只会重启一次。wakup标志已经清楚,完全参照STM32L432的官方代码,用在stm32L431上就不行了。stm32官方没有出431的例程。stm32L432例程路径
STM32CubeRepositorySTM32Cube_FW_L4_V1.17.2ProjectsNUCLEO-L432KCExamplesPWRPWR_STANDBYMDK-ARM

以下是rt studio中的应用代码,Pa0拉低后无限重启,真是个神奇的问题,现象录屏

int main(void)
{
    LOG_D("Hello RT-Thread!pppppp");
/*先禁用一下
    HAL_GPIO_DeInit(GPIOA,GPIO_PIN_0);
    HAL_PWREx_DisableGPIOPullUp(PWR_GPIO_A, PWR_GPIO_BIT_0);
    HAL_PWREx_DisablePullUpPullDownConfig();
*/
//禁不禁用效果都一样
    __HAL_RCC_PWR_CLK_ENABLE();
    GPIO_InitTypeDef GPIO_InitStructure;
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStructure.Pin = GPIO_PIN_0;
    GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
    GPIO_InitStructure.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
    HAL_PWREx_EnableGPIOPullUp(PWR_GPIO_A, PWR_GPIO_BIT_0);
    HAL_PWREx_EnablePullUpPullDownConfig();
    /* Disable used wakeup source: PWR_WAKEUP_PIN1 */
    HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);
    /* Clear all related wakeup flags */
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
    /* Enable wakeup pin WKUP1 */
    HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1_LOW);
    //      /* Enter the Standby mode */
    HAL_PWR_EnterSTANDBYMode();
    return RT_EOK;
}
举报

杨秀英

2022-10-28 09:58:37
开机初始化时,先把 wakeup 唤醒关闭试试
举报

河神大人

2022-10-28 09:58:48
这儿启动时已经关闭了,后才重新打开
1.jpg
举报

河神大人

2022-10-28 09:58:53
完全参照官方代码来编写的,下面是stm32 hal 库文件包中的例程,stm32L432,我的板子是L431,应该关系不大,同一系列。
下面是官方的keil工程,standby例程,路径:RepositorySTM32Cube_FW_L4_V1.17.2ProjectsNUCLEO-L432KCExamplesPWRPWR_STANDBYMDK-ARM
1.jpg
举报

河神大人

2022-10-28 09:58:59
关闭wakeup不能唤醒,也不会出现重启,
举报

杨秀英

2022-10-28 09:59:06
实际量下引脚电平呢?

GPIO 的 speed 没有配置,是否影响了GPIO功能?
举报

河神大人

2022-10-28 09:59:14
就是相当于在rt studio中新建了一个空白工程,只添加上面main中的几行代码,准备来测试pa0唤醒,就有这个问题,
举报

杨秀英

2022-10-28 09:59:25
开机默认手动关闭 唤醒,清 wakeup标志位,只有在进入standby前开启唤醒功能,这样应该就可以了吧
举报

河神大人

2022-10-28 09:59:39
实际电平是高电平,我看官方的例子没有配置speed,pa0唤醒引脚没有配置speed
举报

河神大人

2022-10-28 09:59:47
直接在进入待机前加入延时打印几个log信息,下载进去,直接反复重启,PA0不管高低电平不起作用了,直接反复重启,下载其他不带低功耗的工程正常运转。

举报

杨秀英

2022-10-28 09:59:56
开机加个几秒的延时吧,HAL_Delay 裸机是这个吧,重启因为在进入 standby后被唤醒了

这个使能standby下的调试功能,尝试Debug,看看唤醒源是否存在。
举报

河神大人

2022-10-28 10:00:04
终于找到原因了!!!

这才是L431的正确进入低功耗的方式,

1.jpg
举报

更多回帖

发帖
×
20
完善资料,
赚取积分