stm32在stop模式下唤醒后主频变慢,如何解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32在stop模式下唤醒后主频变慢,如何解决相关的知识,希望对你有一定的参考价值。

唤醒后使用PLL,时钟源是HSI,发现有时压根就不工作,刚开始上电后的几秒钟内还算正常,过一会就不工作了,这是什么原因呢?请大侠们指教

参考技术A 谢谢香主!这个问题已经解决了,方法是不再使用systick实现按键去抖,而是通过while(按键IO低电平){...}来进行去抖检测,中断服务程序也可以正常运行了,时钟稳不稳定我也不太关心,只要能完成任务就行了。根据我观察到的现象目前可以得到的结论是:从stop模式唤醒后的systick中断时间间隔不是均匀的。 查看更多答案>>

采纳哦本回答被提问者采纳

在 STM32L100Rc 上退出 STOP 模式

【中文标题】在 STM32L100Rc 上退出 STOP 模式【英文标题】:Exiting STOP mode on STM32L100Rc 【发布时间】:2019-10-28 14:53:42 【问题描述】:

我是使用 STM32L100RC 探索板的新编码员。因此,我相信我的问题很简单;我无法使用唤醒引脚 PA0 上的外部触发器退出停止模式。代码作为闲置工作:PC9 引脚上的 LED 亮起,我进入停止模式,一旦按下 PA0 按钮使用唤醒命令,LED 将关闭几秒钟。现在我知道使用 for 循环不是等待几秒钟的正确方法,无需指出这一点。如果有人能解释我做错了什么,我将不胜感激。这是我到目前为止所做的:

void Button_Initialization (void)





RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);



// Configure PC9 as push-pull output

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;

GPIO_Init(GPIOC, &GPIO_InitStruct);



GPIO_InitTypeDef GPIO_InitStructA;

GPIO_InitStructA.GPIO_Pin = GPIO_Pin_0;

GPIO_InitStructA.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStructA.GPIO_Mode = GPIO_Mode_AF;

GPIO_PinAFConfig(GPIOA, GPIO_Pin_0, GPIO_AF_WKUP);

GPIO_Init(GPIOA, &GPIO_InitStructA);

PWR_WakeUpPinCmd(PWR_WakeUpPin_1, ENABLE);





GPIO_InitTypeDef GPIO_InitStructButton;

// GPIO_InitStructButton.GPIO_Pin = ;

GPIO_InitStructButton.GPIO_Speed = GPIO_Speed_400KHz;

GPIO_InitStructButton.GPIO_Mode = GPIO_Mode_IN;

GPIO_InitStructButton.GPIO_PuPd = GPIO_PuPd_DOWN;

GPIO_Init(GPIOA, &GPIO_InitStructButton);



EXTI_InitTypeDef EXTI_InitStruct;

EXTI_InitStruct.EXTI_Line = EXTI_Line1;

EXTI_InitStruct.EXTI_LineCmd = ENABLE;

EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Event;

EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;

EXTI_Init( &EXTI_InitStruct);





int main(void)



Button_Initialization();

while(1)



// Turn off LED on PC9

GPIO_SetBits(GPIOC, GPIO_Pin_9);





PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFE);


GPIO_ResetBits(GPIOC, GPIO_Pin_9);

for (int i = 0; i < 1000000; i++)








【问题讨论】:

【参考方案1】:

使用您的配置,您没有唤醒源:

PWR_WakeUpPinCmd(PWR_WakeUpPin_1, ENABLE); 仅在您想将 uC 从待机而不是停止模式唤醒时可用。 (参见参考手册章节5.3.8 Standby mode5.4.2 PWR power control/status register (PWR_CSR)

PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFE); 这样进入停止模式后,您需要一个合格的事件来唤醒 uC。要实现这一点,您只需将PA0 配置为输入(不是备用唤醒功能)并激活EXTI 线路事件(即EXTI line 0)。

在进入停止模式之前,您必须确保所有中断、EXTI 线和 RTC 挂起位都已清除。否则忽略进入停止模式。

【讨论】:

以上是关于stm32在stop模式下唤醒后主频变慢,如何解决的主要内容,如果未能解决你的问题,请参考以下文章

STM32 STOP模式唤醒后的时钟

STM32中用 stop 模式 配合低功耗模式下的自动唤醒(AWU) 能否实现FreeRTOS tickless 模式

stm32在进入standby状态如何唤醒,求个简单参考代码

在 STM32L100Rc 上退出 STOP 模式

待机唤醒实验

STM32F103低功耗与IO唤醒