打印

stm32L低功耗管理问题

[复制链接]
7663|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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中断代码

使用特权

评论回复
5
jason13|  楼主 | 2012-9-6 22:21 | 只看该作者
这种问题怎么避免啊?

使用特权

评论回复
6
figo20042005| | 2012-9-6 22:35 | 只看该作者
刚进中断别进入低功耗,这样可能中断会被关掉,在快要出中断时进入低功耗

使用特权

评论回复
7
jason13|  楼主 | 2012-9-6 22:43 | 只看该作者
我现在只加了一种低功耗模式,
alarm B先响应使进入standby mode,进入之前在eeprom设置标记,再过十秒后alarm A时间到,alarm A中断中在eeprom中设置标记, 我在任意时间用外部复位可参看该标记,但发现一直都是表现为参看之前是standby mode,我确实已经唤醒了啊,液晶应该显示另一模式才对

使用特权

评论回复
8
figo20042005| | 2012-9-6 22:54 | 只看该作者
你的的意思参看该标记时,一直没有低功耗模式,只是standby mode?

使用特权

评论回复
9
jason13|  楼主 | 2012-9-6 23:12 | 只看该作者
只有standby mode,
就是说alarm A将系统从standby mode唤醒以后,在alarm A中断中设置标记为现在的模式,
但查看时发现虽然确实唤醒了,但并没有执行alarm A中断代码

使用特权

评论回复
10
jason13|  楼主 | 2012-9-6 23:14 | 只看该作者
标记只是用来判断外部复位唤醒前到底处于那种工种模式

使用特权

评论回复
11
IJK| | 2012-9-7 10:29 | 只看该作者
“当alarm A唤醒standby mode 时,alarm A中断函数根本不执行。”

这很正常。alarm A唤醒standby mode后,就相当于复位了,当然不会进入alarm A中断函数

使用特权

评论回复
12
jason13|  楼主 | 2012-9-7 10:38 | 只看该作者
是不是说闹钟作为低功耗唤醒后闹钟中断就不能执行了?直接低功耗唤醒复位去了,可我觉得应该有办法即作为低功耗唤醒又可以执行闹钟中断才是。那么怎么样做到呢?

使用特权

评论回复
13
IJK| | 2012-9-7 10:56 | 只看该作者
STM32进入standby mode后,不管用什么方式唤醒,都是从复位入口处开始执行,从软件上相当于复位。

使用特权

评论回复
14
jason13|  楼主 | 2012-9-7 11:12 | 只看该作者
那此时如果想用闹钟中断的话该怎么办?

使用特权

评论回复
15
IJK| | 2012-9-7 12:51 | 只看该作者
闹钟中断 并不是必要的。

使用特权

评论回复
16
jason13|  楼主 | 2012-9-7 13:01 | 只看该作者
因为我系统想要通过外部复位唤醒做其他设置,设置完后·回到原来的工作模式,所以要在模式切换时于eeprom中做标记,而模式切换用的是两个闹钟自动切换,切换前先在eeprom中做标记。

使用特权

评论回复
17
香水城| | 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退出复位。

使用特权

评论回复
18
jason13|  楼主 | 2012-9-7 20:51 | 只看该作者
[img]这个我可以判断出来的,所以采用外部复位来进入系统设置,设置完后要退出设置状态回到低功耗模式,但我的低功耗模式白天用standby mode晚上用sleep mode,所以要判断一下外部唤醒之前是哪种模式,可能这样说不太明了,我画个框图。如下:

系统框图.png (17.3 KB )

系统框图.png

使用特权

评论回复
19
jason13|  楼主 | 2012-9-7 20:56 | 只看该作者
补充一下

系统框图.png (20.07 KB )

系统框图.png

使用特权

评论回复
20
jason13|  楼主 | 2012-9-7 23:46 | 只看该作者
琢磨几天没想到好点子,谁有好点子也可以说下

使用特权

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

本版积分规则

2

主题

71

帖子

0

粉丝