打印
[STM32F0]

PB14如何唤醒STM32F030?

[复制链接]
1096|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
云龙起舞|  楼主 | 2019-8-14 18:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,之前我用PB0口作唤醒键可以成功唤醒休眠后的STM32F030,因为项目需求,要改成用PB14来唤醒,但我将程序改成PB14后就唤不醒STM32F030,不知道为什么,请各位大侠指点一下,十分感谢!
void MCU_EnterSTOPMode(void)                                                                                                //MCU进入停机模式
{
        uint8_t temp;
    NVIC_InitTypeDef NVIC_InitStructure;
        EXTI_InitTypeDef EXTI_InitStruct;
       
        GPIO_SetBits(GPIOB,GPIO_Pin_13);                                                                                //熄灭工作指示灯
       
        //================================== TIM16 OFF ===========================================
        TIM_ITConfig(TIM16, TIM_IT_Update, DISABLE);
        TIM_ClearITPendingBit(TIM16, TIM_IT_Update);
        NVIC_InitStructure.NVIC_IRQChannel = TIM16_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
        NVIC_Init(&NVIC_InitStructure);
        TIM_ClearITPendingBit(TIM16, TIM_IT_Update);
        TIM_DeInit(TIM16);

        //Select HSI as system clock source
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
        RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSI;
       
        //Wait till HSI is used as system clock source
        while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_HSI)
        {
        }

        //Disable PLL
        RCC->CR &= ~RCC_CR_PLLON;
       
        //Wait till PLL off
        while((RCC->CR & RCC_CR_PLLRDY) != 0)
        {
        }

        //Enable SYSCFG clock
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

          EXTI_ClearITPendingBit(EXTI_Line14);

        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource14);
        EXTI_InitStruct.EXTI_Line = EXTI_Line14;
        EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;                 //上升沿下降沿中断
        EXTI_InitStruct.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStruct);

        NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);                        //开电源管理时钟
        // Request to enter STOP mode with regulator in low power mode
        PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
////////////////////////////////////////////////////////////////////////////////////
        for( temp = 10; temp != 0; temp-- );
       
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource14);
        EXTI_InitStruct.EXTI_Line = EXTI_Line14;
        EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;                 //上升沿下降沿中断
        EXTI_InitStruct.EXTI_LineCmd = DISABLE;
        EXTI_Init(&EXTI_InitStruct);

        NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
        NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
        NVIC_Init(&NVIC_InitStructure);

    EXTI_ClearITPendingBit(EXTI_Line14);

        GPIO_ResetBits(GPIOB,GPIO_Pin_13);                                                                        //点亮工作指示灯
}

使用特权

评论回复
沙发
云龙起舞|  楼主 | 2019-8-14 18:57 | 只看该作者
PB0和PB14是设成内部上拉输入的
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_14;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

使用特权

评论回复
板凳
云龙起舞|  楼主 | 2019-8-14 19:00 | 只看该作者
STM32F030休眠后按下PB14对GND按键,PB13指示灯没有被点亮

使用特权

评论回复
地板
云龙起舞|  楼主 | 2019-8-14 19:29 | 只看该作者
我还试了PA2和PB2,也不能唤醒,只有A0或A1, B0或B1能唤醒,不知道为什么/

使用特权

评论回复
5
云龙起舞|  楼主 | 2019-8-14 19:51 | 只看该作者
找到原因了,是我在中断中写错语句了,没有清到中断标志,所以PB14唤醒后就一直进出EXTI中断,无法执行正常程序。
void EXTI4_15_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line0|EXTI_Line1) != RESET)
  {
    /* Clear the EXTI line 0 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line14);
  }
}
void EXTI4_15_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line0|EXTI_Line1) != RESET)
  {
    /* Clear the EXTI line 0 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line14);
  }
}
更正为:
void EXTI4_15_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line14) != RESET)
  {
    /* Clear the EXTI line 0 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line14);
  }
}

使用特权

评论回复
6
coshi| | 2019-9-13 10:52 | 只看该作者
外部中断应该可以啊

使用特权

评论回复
7
zljiu| | 2019-9-13 11:09 | 只看该作者
恭喜楼主解决问题

使用特权

评论回复
8
wiba| | 2019-9-13 11:23 | 只看该作者
呵呵呵 长知识了

使用特权

评论回复
9
renzheshengui| | 2019-9-16 15:13 | 只看该作者
可以通过不同的方式进行唤醒 看楼主如何进行配置了

使用特权

评论回复
10
wakayi| | 2019-9-16 15:17 | 只看该作者
楼主把pb14配置成什么模式了啊

使用特权

评论回复
11
wowu| | 2019-9-16 15:20 | 只看该作者
用中断进行唤醒

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

33

帖子

0

粉丝