在 STM32L100Rc 上退出 STOP 模式
Exiting STOP mode on STM32L100Rc
我是一名使用 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++)
{
}
}
}
根据您的配置,您没有唤醒源:
PWR_WakeUpPinCmd(PWR_WakeUpPin_1, ENABLE);
仅在您想将 uC 从待机状态唤醒时可用,但不能从停止模式唤醒。 (参见参考手册章节 5.3.8 Standby mode
和 5.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 挂起位。否则忽略进入停止模式。
我是一名使用 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++)
{
}
}
}
根据您的配置,您没有唤醒源:
PWR_WakeUpPinCmd(PWR_WakeUpPin_1, ENABLE);
仅在您想将 uC 从待机状态唤醒时可用,但不能从停止模式唤醒。 (参见参考手册章节 5.3.8 Standby mode
和 5.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 挂起位。否则忽略进入停止模式。