stm32L低功耗管理问题

[复制链接]
8431|21
 楼主| jason13 发表于 2012-9-6 22:12 | 显示全部楼层 |阅读模式
stm32L低功耗管理问题,我想让stm32L白天工作在standby mode,晚上工作在SLeep mode,通过两个Alarm A和B唤醒切换,alarm A中断使做好晚上工作的准备(做一些设置),并设置完后进入SLeep mode,alarm B中断使做好白天工作的准备,并设置完后进入standby mode。
      调试时发现当alarm A唤醒standby mode 时,alarm A中断函数根本不执行。
想了几天还是想不到解决办法。谁懂啊?请不吝赐教.
figo20042005 发表于 2012-9-6 22:16 | 显示全部楼层
是不是中断向量设置的问题
 楼主| jason13 发表于 2012-9-6 22:16 | 显示全部楼层
这是工作模式切换代码,通过闹钟切换,只写了进入standby mode的。
void RTC_Alarm_IRQHandler(void)
{
            if(RTC_GetITStatus(RTC_IT_ALRA) != RESET)
         {               
                        RTC_ClearITPendingBit(RTC_IT_ALRA);
                        EXTI_ClearITPendingBit(EXTI_Line17);
                    //进入节电模式2---夜间(正常)工作,--------------------------ultra low power run mode
                         Write_eeprom_byte(55+EEPROM_START_ADDR,0x3c); //设置标记
                   RTC_ClearFlag(RTC_FLAG_ALRAF);
        }
        else   if(RTC_GetITStatus(RTC_IT_ALRB) != RESET)
        {               
                        RTC_ClearITPendingBit(RTC_IT_ALRB);
                        EXTI_ClearITPendingBit(EXTI_Line17);
                        //进入节电模式1--超低功耗模式,------------------------------ultra low  power standby with RTC mode
                          Write_eeprom_byte(55+EEPROM_START_ADDR,0xc3); //设置标记,以方便返回原来工作模式

                                RTC_ClearFlag(RTC_FLAG_ALRBF);
                                /* Clear WakeUp flag */
                                PWR_ClearFlag(PWR_FLAG_WU);
   
                                /* Request to enter STANDBY mode (Wake Up flag is cleared in PWR_EnterSTANDBYMode function) */
                                PWR_EnterSTANDBYMode();
        }               

}
 楼主| jason13 发表于 2012-9-6 22:21 | 显示全部楼层
闹钟中断去掉进入低功耗模式那一段,程序就正常,加上后就会发生alarm A唤醒时直接复位,忽略掉了alarm A中断代码
 楼主| jason13 发表于 2012-9-6 22:21 | 显示全部楼层
这种问题怎么避免啊?
figo20042005 发表于 2012-9-6 22:35 | 显示全部楼层
刚进中断别进入低功耗,这样可能中断会被关掉,在快要出中断时进入低功耗
 楼主| jason13 发表于 2012-9-6 22:43 | 显示全部楼层
我现在只加了一种低功耗模式,
alarm B先响应使进入standby mode,进入之前在eeprom设置标记,再过十秒后alarm A时间到,alarm A中断中在eeprom中设置标记, 我在任意时间用外部复位可参看该标记,但发现一直都是表现为参看之前是standby mode,我确实已经唤醒了啊,液晶应该显示另一模式才对
figo20042005 发表于 2012-9-6 22:54 | 显示全部楼层
你的的意思参看该标记时,一直没有低功耗模式,只是standby mode?
 楼主| jason13 发表于 2012-9-6 23:12 | 显示全部楼层
只有standby mode,
就是说alarm A将系统从standby mode唤醒以后,在alarm A中断中设置标记为现在的模式,
但查看时发现虽然确实唤醒了,但并没有执行alarm A中断代码
 楼主| jason13 发表于 2012-9-6 23:14 | 显示全部楼层
标记只是用来判断外部复位唤醒前到底处于那种工种模式
IJK 发表于 2012-9-7 10:29 | 显示全部楼层
“当alarm A唤醒standby mode 时,alarm A中断函数根本不执行。”

这很正常。alarm A唤醒standby mode后,就相当于复位了,当然不会进入alarm A中断函数
 楼主| jason13 发表于 2012-9-7 10:38 | 显示全部楼层
是不是说闹钟作为低功耗唤醒后闹钟中断就不能执行了?直接低功耗唤醒复位去了,可我觉得应该有办法即作为低功耗唤醒又可以执行闹钟中断才是。那么怎么样做到呢?
IJK 发表于 2012-9-7 10:56 | 显示全部楼层
STM32进入standby mode后,不管用什么方式唤醒,都是从复位入口处开始执行,从软件上相当于复位。
 楼主| jason13 发表于 2012-9-7 11:12 | 显示全部楼层
那此时如果想用闹钟中断的话该怎么办?
IJK 发表于 2012-9-7 12:51 | 显示全部楼层
闹钟中断 并不是必要的。
 楼主| jason13 发表于 2012-9-7 13:01 | 显示全部楼层
因为我系统想要通过外部复位唤醒做其他设置,设置完后·回到原来的工作模式,所以要在模式切换时于eeprom中做标记,而模式切换用的是两个闹钟自动切换,切换前先在eeprom中做标记。
香水城 发表于 2012-9-7 16:29 | 显示全部楼层
手册里写的很清楚的
After waking up from Standby mode, program execution restarts in the same way as after a
Reset (boot pins sampling, vector reset is fetched, etc.). The SBF status flag in the
PWR_CSR register (see Section 4.4.2) indicates that the MCU was in Standby mode.

从STANDBY唤醒之后的操作相当于RESET。

但是有寄存器标志位标明MCU从STANDBY模式唤醒。可以在程序的开头就进行判断,发生的上电复位还是STANDBY退出复位。
 楼主| jason13 发表于 2012-9-7 20:51 | 显示全部楼层
[img]这个我可以判断出来的,所以采用外部复位来进入系统设置,设置完后要退出设置状态回到低功耗模式,但我的低功耗模式白天用standby mode晚上用sleep mode,所以要判断一下外部唤醒之前是哪种模式,可能这样说不太明了,我画个框图。如下:
系统框图.png
 楼主| jason13 发表于 2012-9-7 20:56 | 显示全部楼层
补充一下
系统框图.png
 楼主| jason13 发表于 2012-9-7 23:46 | 显示全部楼层
琢磨几天没想到好点子,谁有好点子也可以说下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

71

帖子

0

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