解决GD32F105休眠后无法唤醒的问题

news/2024/11/30 1:40:12/

由于去年的缺芯潮,原本基于STM32F105的设备需要pin对pin换成GD32F105。代码直接使用的ST库微修改。

设备装在重柴车上,开始一两个月是没啥问题的。后面出现了休眠后无法唤醒的问题。设置stop模式前,振动传感器中断引脚和CAN的RX引脚设置为外部中断。结果都无法唤醒。使用ST时,不会出现这个问题。

和GD的FAE现场调试,最终确认问题出在stop休眠函数上
而且在GD的官网上,找到了一份《关于 deep-sleep 模式的使用说明》,GD32系列MCU都有这个问题???也是挺无语的。
在这里插入图片描述

原ST的stop函数如下:

void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)
{uint32_t tmpreg = 0;/* Check the parameters */assert_param(IS_PWR_REGULATOR(PWR_Regulator));assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry));/* Select the regulator state in STOP mode ---------------------------------*/tmpreg = PWR->CR;/* Clear PDDS and LPDS bits */tmpreg &= CR_DS_MASK;/* Set LPDS bit according to PWR_Regulator value */tmpreg |= PWR_Regulator;/* Store the new value */PWR->CR = tmpreg;/* Set SLEEPDEEP bit of Cortex System Control Register */SCB->SCR |= SCB_SCR_SLEEPDEEP;/* Select STOP mode entry --------------------------------------------------*/if(PWR_STOPEntry == PWR_STOPEntry_WFI){   /* Request Wait For Interrupt */__WFI();}else{/* Request Wait For Event */__WFE();}/* Reset SLEEPDEEP bit of Cortex System Control Register */SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP);  
}

修改后:

//GD32F105
void GD_PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)
{uint32_t tmpreg = 0;static uint32_t reg_snap[ 4 ];/* Check the parameters */assert_param(IS_PWR_REGULATOR(PWR_Regulator));assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry));/* Select the regulator state in STOP mode ---------------------------------*/tmpreg = PWR->CR;/* Clear PDDS and LPDS bits */tmpreg &= CR_DS_MASK;/* Set LPDS bit according to PWR_Regulator value */tmpreg |= PWR_Regulator;/* Store the new value */PWR->CR = tmpreg;/* Set SLEEPDEEP bit of Cortex System Control Register */SCB->SCR |= SCB_SCR_SLEEPDEEP;reg_snap[ 0 ] =  (*(volatile uint32_t *)(0xE000E010));//REG32( 0xE000E010 );reg_snap[ 1 ] =  (*(volatile uint32_t *)(0xE000E100));//REG32( 0xE000E100 );reg_snap[ 2 ] =  (*(volatile uint32_t *)(0xE000E104));//REG32( 0xE000E104 );reg_snap[ 3 ] =  (*(volatile uint32_t *)(0xE000E108));//REG32( 0xE000E108 );(*(volatile uint32_t *)(0xE000E010)) &= 0x00010004;   //( 0xE000E010 )(*(volatile uint32_t *)(0xE000E180))  = 0XFF7FF83D;   //( 0xE000E180 )(*(volatile uint32_t *)(0xE000E184))  = 0XBFFFF8FF;   //( 0xE000E184 )(*(volatile uint32_t *)(0xE000E188))  = 0xFFFFFFFF;	  //( 0xE000E188 )/* Select STOP mode entry --------------------------------------------------*/if(PWR_STOPEntry == PWR_STOPEntry_WFI){ /* Request Wait For Interrupt */__WFI();}else{/* Request Wait For Event */__SEV();__WFE();__WFE();}(*(volatile uint32_t *)(0xE000E010)) = reg_snap[ 0 ] ;(*(volatile uint32_t *)(0xE000E100)) = reg_snap[ 1 ] ;(*(volatile uint32_t *)(0xE000E104)) = reg_snap[ 2 ] ;(*(volatile uint32_t *)(0xE000E108)) = reg_snap[ 3 ] ;  /* Reset SLEEPDEEP bit of Cortex System Control Register */SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP);  
}

注意,使用GD芯片时,stop函数前,需要关闭滴答定时器,stop函数后再打开。

修改后运行了几个月,暂未再重新出现问题。


http://www.ppmy.cn/news/459382.html

相关文章

Ubuntu息屏无法唤醒解决办法

网上最多的解决办法是 Ubuntu 18.04 休眠后无法唤醒的解决办法 - feipeng8848 - 博客园 但是尝试无果,偶然发现:设置-》device-》display中无法设置分辨率, 第一步,终端中输入nvidia-smi报错: NVIDIA-SMI has faile…

windows10睡眠后无法唤醒屏幕,只能强制重启开机

记录一下我遇到的电脑睡眠问题及相应的解决方案。 问题描述: 最近我的电脑每次睡眠后,键盘灯和鼠标都亮着,然后想唤醒电脑时,按电源键后能听到风扇转速加大,和正常开机一样,但是屏幕没有显示,一…

联想Thinkpad E15 息屏后 无法唤醒

联想Thinkpad E15 息屏后 无法唤醒 联想Thinkpad E15 息屏后 无法唤醒 联想Thinkpad E15 息屏后 无法唤醒 最近公司配的电脑,E15 老是熄屏后无法唤醒,重新安装系统后还是这样, 后面才发现是联想自带的电脑管家,管理电池功能有问题…

解决win10睡眠后无故自动唤醒,无法进入休眠问题

戴尔 Inspiron 3420, 最近安装了Windows 10 1903版本后,遇到了问题,正常进入睡眠状态,但是过段时间后自动被唤醒;或者向进入休眠状态,但是点击休眠后莫名其妙的被唤醒,而且还不能关机&#xff0…

解决win10笔记本电脑无法睡眠只是黑屏问题的方法

如何解决win10笔记本电脑无法睡眠只是黑屏的问题 笔记本电脑无法睡眠问题描述问题分析问题解决 笔记本电脑无法睡眠 问题描述 在选择睡眠后,电脑只是黑屏,风扇还在转,一晃鼠标电脑屏幕就又亮了。 问题分析 出现这一情况是因为离开模式被写…

解决电脑在待机唤醒后无法连接网络

有的电脑在待机再唤醒后无法连接网络(路由器正常),显示黄色叹号,重启电脑可解决。这个问题是因为部分老网卡驱动不完全兼容新系统所致,现在找到一个方法可以彻底解决这个问题。 解决方法: 1. 右键网络 - …

MDIO 的C22和C45介绍

https://blog.csdn.net/rhythmwang/article/details/62039140 https://blog.csdn.net/yhs18200259681/article/details/99652701