打印
[STM32F0]

STM32停止模式唤醒(RTC+多外部中断) 不定期失效

[复制链接]
6588|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lanjackg2003|  楼主 | 2015-9-13 10:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    目前在做STM32F030休眠及唤醒调试.
    使用的方式是多个外部中断唤醒+RTC定时周期唤醒

    主要相关休眠代码如下:

void LowPower_CloseAllClcok(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_TS | RCC_AHBPeriph_CRC | RCC_AHBPeriph_FLITF | RCC_AHBPeriph_DMA1 ,DISABLE);
RCC_APB2PeriphClockCmd(/*RCC_APB2Periph_SYSCFG |*/ RCC_APB2Periph_ADC1 | RCC_APB2Periph_TIM1 | RCC_APB2Periph_SPI1 | RCC_APB2Periph_USART1 |
RCC_APB2Periph_TIM15 | RCC_APB2Periph_TIM16 | RCC_APB2Periph_TIM17 | RCC_APB2Periph_DBGMCU,DISABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM6 | RCC_APB1Periph_TIM14| RCC_APB1Periph_WWDG |
RCC_APB1Periph_SPI2 | RCC_APB1Periph_USART2 | RCC_APB1Periph_I2C1 | RCC_APB1Periph_I2C2 | RCC_APB1Periph_PWR | RCC_APB1Periph_DAC | RCC_APB1Periph_CEC,DISABLE);
}

/*==================================================================
* Function        : LowPower_Enter
* Description        :
* Input Para        :
* Output Para        :
* Return Value:
==================================================================*/
void LowPower_Enter(void)
{
DEBUG_MSG(LOWPOWER_DEBUG,("LowPower_Enter******* \r\n"));
SysTimer_DeInit();
LowPower_CloseAllClcok();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
LowPower_ConfigWakeUp();
g_sLowPowerInfo.LowPowerBits.Bits.bIsLowPower = 1;
EXTI_ClearITPendingBit(EXTI_Line0 | EXTI_Line1 | EXTI_Line4 | EXTI_Line6 | EXTI_Line7 | EXTI_Line9 | EXTI_Line11 | EXTI_Line15 | EXTI_Line17);

PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
}


/*==================================================================
* Function        : LowPower_Exit
* Description        :
* Input Para        :
* Output Para        :
* Return Value:
==================================================================*/
void LowPower_Exit(void)
{
if(!g_sLowPowerInfo.LowPowerBits.Bits.bIsWakeUp)
return;
g_sLowPowerInfo.LowPowerBits.Bits.bIsWakeUp = 0;
if(!g_sLowPowerInfo.LowPowerBits.Bits.bIsLowPower)
return;
RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
LowPower_DisableWakeUp();
SystemInit();
g_sLowPowerInfo.LowPowerBits.Bits.bIsLowPower = 0;
}


void LowPower_SetWakeUp(void)
{
g_sLowPowerInfo.LowPowerBits.Bits.bIsWakeUp = 1;
}




================================================================================================================
主函数的大概处理
void Main(void)
{
.............

while(1)
{
............
LowPower_Exit();
...............
}

}
=======================================================================================================================
中断服务程序的处理,

void EXTI0_1_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET){
EXTI_ClearITPendingBit(EXTI_Line0);

LowPower_SetWakeUp();
}
else if(EXTI_GetITStatus(EXTI_Line1) != RESET){
EXTI_ClearITPendingBit(EXTI_Line1);

LowPower_SetWakeUp();
}

}

void EXTI4_15_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line11) != RESET){
EXTI_ClearITPendingBit(EXTI_Line11);

LowPower_SetWakeUp();

}
else if(EXTI_GetITStatus(EXTI_Line15) != RESET){
EXTI_ClearITPendingBit(EXTI_Line15);

LowPower_SetWakeUp();
}
else if(EXTI_GetITStatus(EXTI_Line9) != RESET){
EXTI_ClearITPendingBit(EXTI_Line9);


LowPower_SetWakeUp();
}
else if(EXTI_GetITStatus(EXTI_Line7) != RESET){
EXTI_ClearITPendingBit(EXTI_Line7);


LowPower_SetWakeUp();
}
else if(EXTI_GetITStatus(EXTI_Line6) != RESET){
EXTI_ClearITPendingBit(EXTI_Line6);


LowPower_SetWakeUp();
}
else if(EXTI_GetITStatus(EXTI_Line4) != RESET){
EXTI_ClearITPendingBit(EXTI_Line4);


LowPower_SetWakeUp();
}
}


void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_ALRA) != RESET)
{
LowPower_SetWakeUp();
/* Clear the Alarm A Pending Bit */
RTC_ClearITPendingBit(RTC_IT_ALRA);

/* Clear EXTI line17 pending bit */
EXTI_ClearITPendingBit(EXTI_Line17);
}
}


          测试发现,可以产生外部中断唤醒及RTC定时唤醒.
          但是,MCU有时候进入STOP模式后,就无法再唤醒.(RTC也无法自动唤醒,外部中断也失效了.)

          不知道大家对使用STM32 STOP模式后,多中断唤醒的方式是如何处理的?


沙发
lanjackg2003|  楼主 | 2015-9-14 10:10 | 只看该作者
自己继续测试发现
1、用RTC可以周期性唤醒,至少半个小时都可以正常(重复 "STOP-->唤醒").

2、外部中断唤醒,经过多次唤醒之后就失效了===>MCU永远睡下去了.

3、外部中断唤醒,会导致其他外部中断产生===>相互干扰


STOP外部中断唤醒,有没有哪个大侠代码可以参考一下?

另外,中断唤醒,导致其他外部中断有触发,可以从软件或者硬件上做哪些规避?




使用特权

评论回复
板凳
amanda_s| | 2015-9-14 11:12 | 只看该作者
标准外设库和Cube库里都有这样的例子。楼主可以参考。
另外,中断唤醒应该不会导致其他外部中断触发的。是不是确实有中断发生,你检查一下中断触发的条件。

使用特权

评论回复
地板
lanjackg2003|  楼主 | 2015-9-14 12:55 | 只看该作者
amanda_s 发表于 2015-9-14 11:12
标准外设库和Cube库里都有这样的例子。楼主可以参考。
另外,中断唤醒应该不会导致其他外部中断触发的。是 ...

我在看看官网的固件看看有没有什么突破的.
如果是中断唤醒确实会产生干扰,非休眠时中断之间是不存在干扰.

使用特权

评论回复
5
lanjackg2003|  楼主 | 2015-9-28 11:52 | 只看该作者
硬件重新调整了MCU的供电就正常了.不知道是否电源有干扰导致,还是真的由于硬件设计的问题.

使用特权

评论回复
6
豆腐块| | 2015-9-29 14:59 | 只看该作者
中断唤醒应该不会导致其他外部中断触发的

使用特权

评论回复
7
usbyt| | 2016-3-11 15:46 | 只看该作者
RTC和外部中断唤醒的代码可以发我跑跑学习下?
280787575@qq.com

使用特权

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

本版积分规则

56

主题

440

帖子

7

粉丝