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

[复制链接]
6939|6
 楼主| lanjackg2003 发表于 2015-9-13 10:44 | 显示全部楼层 |阅读模式
    目前在做STM32F030休眠及唤醒调试.
    使用的方式是多个外部中断唤醒+RTC定时周期唤醒

    主要相关休眠代码如下:

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

  9. /*==================================================================
  10. * Function        : LowPower_Enter
  11. * Description        :
  12. * Input Para        :
  13. * Output Para        :
  14. * Return Value:
  15. ==================================================================*/
  16. void LowPower_Enter(void)
  17. {
  18. DEBUG_MSG(LOWPOWER_DEBUG,("LowPower_Enter******* \r\n"));
  19. SysTimer_DeInit();
  20. LowPower_CloseAllClcok();
  21. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
  22. LowPower_ConfigWakeUp();
  23. g_sLowPowerInfo.LowPowerBits.Bits.bIsLowPower = 1;
  24. EXTI_ClearITPendingBit(EXTI_Line0 | EXTI_Line1 | EXTI_Line4 | EXTI_Line6 | EXTI_Line7 | EXTI_Line9 | EXTI_Line11 | EXTI_Line15 | EXTI_Line17);

  25. PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
  26. }


  27. /*==================================================================
  28. * Function        : LowPower_Exit
  29. * Description        :
  30. * Input Para        :
  31. * Output Para        :
  32. * Return Value:
  33. ==================================================================*/
  34. void LowPower_Exit(void)
  35. {
  36. if(!g_sLowPowerInfo.LowPowerBits.Bits.bIsWakeUp)
  37. return;
  38. g_sLowPowerInfo.LowPowerBits.Bits.bIsWakeUp = 0;
  39. if(!g_sLowPowerInfo.LowPowerBits.Bits.bIsLowPower)
  40. return;
  41. RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
  42. LowPower_DisableWakeUp();
  43. SystemInit();
  44. g_sLowPowerInfo.LowPowerBits.Bits.bIsLowPower = 0;
  45. }


  46. void LowPower_SetWakeUp(void)
  47. {
  48. g_sLowPowerInfo.LowPowerBits.Bits.bIsWakeUp = 1;
  49. }




  50. ================================================================================================================
  51. 主函数的大概处理
  52. void Main(void)
  53. {
  54. .............

  55. while(1)
  56. {
  57. ............
  58. LowPower_Exit();
  59. ...............
  60. }

  61. }
  62. =======================================================================================================================
  63. 中断服务程序的处理,

  64. void EXTI0_1_IRQHandler(void)
  65. {
  66. if(EXTI_GetITStatus(EXTI_Line0) != RESET){
  67. EXTI_ClearITPendingBit(EXTI_Line0);

  68. LowPower_SetWakeUp();
  69. }
  70. else if(EXTI_GetITStatus(EXTI_Line1) != RESET){
  71. EXTI_ClearITPendingBit(EXTI_Line1);

  72. LowPower_SetWakeUp();
  73. }

  74. }

  75. void EXTI4_15_IRQHandler(void)
  76. {
  77. if(EXTI_GetITStatus(EXTI_Line11) != RESET){
  78. EXTI_ClearITPendingBit(EXTI_Line11);

  79. LowPower_SetWakeUp();

  80. }
  81. else if(EXTI_GetITStatus(EXTI_Line15) != RESET){
  82. EXTI_ClearITPendingBit(EXTI_Line15);

  83. LowPower_SetWakeUp();
  84. }
  85. else if(EXTI_GetITStatus(EXTI_Line9) != RESET){
  86. EXTI_ClearITPendingBit(EXTI_Line9);


  87. LowPower_SetWakeUp();
  88. }
  89. else if(EXTI_GetITStatus(EXTI_Line7) != RESET){
  90. EXTI_ClearITPendingBit(EXTI_Line7);


  91. LowPower_SetWakeUp();
  92. }
  93. else if(EXTI_GetITStatus(EXTI_Line6) != RESET){
  94. EXTI_ClearITPendingBit(EXTI_Line6);


  95. LowPower_SetWakeUp();
  96. }
  97. else if(EXTI_GetITStatus(EXTI_Line4) != RESET){
  98. EXTI_ClearITPendingBit(EXTI_Line4);


  99. LowPower_SetWakeUp();
  100. }
  101. }


  102. void RTC_IRQHandler(void)
  103. {
  104. if (RTC_GetITStatus(RTC_IT_ALRA) != RESET)
  105. {
  106. LowPower_SetWakeUp();
  107. /* Clear the Alarm A Pending Bit */
  108. RTC_ClearITPendingBit(RTC_IT_ALRA);

  109. /* Clear EXTI line17 pending bit */
  110. EXTI_ClearITPendingBit(EXTI_Line17);
  111. }
  112. }


          测试发现,可以产生外部中断唤醒及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库里都有这样的例子。楼主可以参考。
另外,中断唤醒应该不会导致其他外部中断触发的。是 ...

我在看看官网的固件看看有没有什么突破的.
如果是中断唤醒确实会产生干扰,非休眠时中断之间是不存在干扰.
 楼主| lanjackg2003 发表于 2015-9-28 11:52 | 显示全部楼层
硬件重新调整了MCU的供电就正常了.不知道是否电源有干扰导致,还是真的由于硬件设计的问题.
豆腐块 发表于 2015-9-29 14:59 | 显示全部楼层
中断唤醒应该不会导致其他外部中断触发的
usbyt 发表于 2016-3-11 15:46 | 显示全部楼层
RTC和外部中断唤醒的代码可以发我跑跑学习下?
280787575@qq.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

441

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部