STM32F103VET6低功耗停止模式唤醒不了
进入停机模式 第一次可以唤醒 处理完一些数据又让他进入停机模式第二次就唤醒不了了外部中断唤醒引脚配置如下:
void EXTI_Key_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/* config the extiline(PE4) clock and AFIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);
/* EXTI line gpio config(PE4) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // ÉÏÀÊäÈë
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* EXTI line(PE4) mode config */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);
EXTI_ClearITPendingBit(EXTI_Line4);
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //ϽµÑØÖжÏ
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_ClearITPendingBit(EXTI_Line4);
}
进入停止模式的代码如下:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
唤醒函数如下:
void EXTI4_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line4) != RESET) //È·±£ÊÇ·ñ²úÉúÁËEXTI LineÖжÏ
{
SYSCLKConfig_STOP(); //Í£»ú»½ÐѺóÐèÒªÆô¶¯HSE
// SystemInit();
WorkStatusLED_ON; //µãÁÁËùÓÐLEDÒ»¶Îʱ¼äָʾͣ»ú»½ÐÑ
Delayms(100);
WorkStatusLED_OFF;
Delayms(100);
WorkStatusLED_ON; //µãÁÁËùÓÐLEDÒ»¶Îʱ¼äָʾͣ»ú»½ÐÑ
Delayms(100);
WorkStatusLED_OFF;
Delayms(100);
WorkStatusLED_ON; //µãÁÁËùÓÐLEDÒ»¶Îʱ¼äָʾͣ»ú»½ÐÑ
Delayms(100);
WorkStatusLED_OFF;
Delayms(100);
WorkStatusLED_ON; //µãÁÁËùÓÐLEDÒ»¶Îʱ¼äָʾͣ»ú»½ÐÑ
Delayms(100);
WorkStatusLED_OFF;
EXTI_ClearITPendingBit(EXTI_Line4); //Çå³ýÖжϱê־λ
/* ʹÄܵçÔ´¹ÜÀíµ¥ÔªµÄʱÖÓ */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
/* ½øÈëֹͣģʽ£¬ÉèÖõçѹµ÷½ÚÆ÷ΪµÍ¹¦ºÄģʽ£¬µÈ´ýÖжϻ½ÐÑ*/
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
}
}
void SYSCLKConfig_STOP(void)
{
ErrorStatus HSEStartUpStatus;
/* ʹÄÜ HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* µÈ´ý HSE ×¼±¸¾ÍÐ÷ */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* ʹÄÜ PLL */
RCC_PLLCmd(ENABLE);
/* µÈ´ý PLL ×¼±¸¾ÍÐ÷ */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Ñ¡ÔñPLL×÷ΪϵͳʱÖÓÔ´ */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* µÈ´ýPLL±»Ñ¡ÔñΪϵͳʱÖÓÔ´ */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}
时钟配置函数参考的是野火的例程
建议在唤醒后,倍频一下,把时钟恢复到72MHZ 我貌似找到了原因,学长说不能把进入停机模式的配置语句写到中断函数里面。我把它写到while循环里面,在中断里面对标志位进行置位或者复位,这样就可以了。不知道我说的对不对,希望大神们指正 小鹏cyp 发表于 2018-7-10 10:21
我貌似找到了原因,学长说不能把进入停机模式的配置语句写到中断函数里面。我把它写到while循环里面,在中 ...
楼主可以自己验证下啊
页:
[1]