打印

求助 :stm32停止模式被唤醒的问题

[复制链接]
11966|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gongzhuoqun|  楼主 | 2013-5-15 08:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前遇到这样一个问题:
利用PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);进入停止模式后,
1.如果发生中断唤醒,是否先执行中断中断程序后 ,再马上执行停机程序?
2.如果执行中断服务程序,是否可以判断出此时是中断唤醒,需要做系统初始化?
沙发
gongzhuoqun|  楼主 | 2013-5-15 09:26 | 只看该作者
其实通过第二个问题我还想知道,如果有多个中断源可以唤醒停机,是哪一个中断源产生的唤醒。

使用特权

评论回复
板凳
IJK| | 2013-5-15 09:56 | 只看该作者
LZ的想法不对。
如果发生中断唤醒,会先执行中断程序 ,再执行PWR_EnterSTOPMode的下1行代码。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
gongzhuoqun + 1 很给力!
地板
gongzhuoqun|  楼主 | 2013-5-15 16:30 | 只看该作者
谢谢楼上,
那如果有多个中断都可以唤醒系统,在系统被唤醒后,怎样判断是由哪一个中断唤醒的系统呢。

使用特权

评论回复
5
IJK| | 2013-5-16 10:19 | 只看该作者
gongzhuoqun 发表于 2013-5-15 16:30
谢谢楼上,
那如果有多个中断都可以唤醒系统,在系统被唤醒后,怎样判断是由哪一个中断唤醒的系统呢。 ...

用1个变量可以记录唤醒源

使用特权

评论回复
评论
gongzhuoqun 2013-5-16 10:33 回复TA
谢谢大虾 
6
gongzhuoqun|  楼主 | 2013-5-16 10:31 | 只看该作者
本帖最后由 gongzhuoqun 于 2013-5-16 10:39 编辑

按你说的我的理解是这样的
在PWR_EnterSTOPMode 执行前置一个flag ,然后中断服务程序来判断这个 flag,判断是否此中断唤醒的系统,但是不是可能有这样
如:
/***停机位置***/
..........................
    flag = 1;
(但却没真正停机,但如果先发生中断,中断将误判断自己唤醒了机器???而系统仍然继续会执行停机命令)
      PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
...............
/***中断服务程序****/
.................
if(flag == 1){
      /*判断出此中断触发的唤醒*/
}
................

麻烦大虾帮忙解答

使用特权

评论回复
7
gongzhuoqun|  楼主 | 2013-5-16 10:39 | 只看该作者
IJK 发表于 2013-5-16 10:19
用1个变量可以记录唤醒源

按你说的我的理解是这样的
在PWR_EnterSTOPMode 执行前置一个flag ,然后中断服务程序来判断这个 flag,判断是否此中断唤醒的系统,但是不是可能有这样
如:
/***停机位置***/
..........................
     flag = 1;
(但却没真正停机,但如果先发生中断,中断将误判断自己唤醒了机器???而系统仍然继续会执行停机命令)
       PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
...............
/***中断服务程序****/
.................
if(flag == 1){
       /*判断出此中断触发的唤醒*/
}
................

麻烦大虾帮忙解答

使用特权

评论回复
8
香水城| | 2013-5-16 17:49 | 只看该作者
LZ,你对进入STOP模式,和退出STOP模式的理解有点偏差:

MCU执行函数PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI)中的"__WFI();"指令后,MCU进入STOP模式;在此之前可以初始化某个flag=0。如果有多个中断可以唤醒系统,那么在各自的中断ISR中给flag赋不同的值。那么当某个中断到来,执行完了对应ISR,再继续PWR_EnterSTOPMode()下面的代码时,可以根据flag的值,判断哪个中断源唤醒了系统

使用特权

评论回复
评分
参与人数 2威望 +2 收起 理由
liguang02 + 1 很给力!
gongzhuoqun + 1 赞一个!
9
gongzhuoqun|  楼主 | 2013-5-16 18:39 | 只看该作者
香水城 发表于 2013-5-16 17:49
LZ,你对进入STOP模式,和退出STOP模式的理解有点偏差:

MCU执行函数PWR_EnterSTOPMode(PWR_Regulator_Low ...

我的意思 其实是 如果我将flag 的值设置了flag == 0,而中断发生在flag=0 和PWR_EnterSTOPMode 之间,那么中断程序不也是会修改flag的值么,然后系统还是会进入停机状态。大虾,我主要关注的是我设置这个flag和执行PWR_EnterSTOPMode中间发生中断怎么办。

使用特权

评论回复
10
cjhk| | 2013-5-16 18:41 | 只看该作者
中断优先级的设置   这样应该能解决你的问题   

使用特权

评论回复
11
cjhk| | 2013-5-16 18:42 | 只看该作者
看了你的代码   这只是我匆匆的断言   不知道对不对   帮你顶一个   看看别人的意见吧

使用特权

评论回复
12
gongzhuoqun|  楼主 | 2013-5-17 09:33 | 只看该作者
cjhk 发表于 2013-5-16 18:41
中断优先级的设置   这样应该能解决你的问题

谢谢你的建议 ,但是我要进行stop的位置是在普通任务里进行的,中断优先级会对这个有影响么?

使用特权

评论回复
13
IJK| | 2013-5-17 10:25 | 只看该作者
设置这个flag和执行PWR_EnterSTOPMode中间发生中断怎么办。

1.一般来说,flag和执行PWR_EnterSTOPMode中间其实时间很短,没这么巧就会发生中断。

2.在中断程序里可以判断出区别:stop之前一般系统时钟来自PLL,stop之后系统时钟来自HSI

使用特权

评论回复
14
香水城| | 2013-5-17 14:30 | 只看该作者
在各个中断的ISR里没有一来就给flag设置不同的值,而是先判断HSEON已经被复位了再赋值。原因就是IJK说的,进入STOP模式是,硬件会自动复位HSEON,停止掉HSE;从STOP模式唤醒后,系统使用默认的HSI作为系统时钟,直到软件去更改时钟配置。

当然这个方法的前提是,正常RUN模式下,HSEON是使能的。才可以此作为是否是刚从STOP模式唤醒的依据。

使用特权

评论回复
15
gongzhuoqun|  楼主 | 2013-5-18 10:57 | 只看该作者
感谢两位大神,我想知道的就是这种可以从硬件判断的方式,真是豁然开朗

使用特权

评论回复
16
zhuomuniao110| | 2016-3-27 11:58 | 只看该作者
在stm32进入低功耗,采用rtc的alarm唤醒,在唤醒之前所用的外设有uart,TIM2.当唤醒之后,首先我从新配置了时钟:代码

    ErrorStatus HSEStartUpStatus;
   
    //turn on HSE
    RCC_HSEConfig(RCC_HSE_ON);

    //Wait till HSE is ready and if Time out is reached exit
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    if(HSEStartUpStatus == SUCCESS)
    {
              /* Enable Prefetch Buffer */
      FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

      /* Flash 2 wait state */
      FLASH_SetLatency(FLASH_Latency_2);
       
      /* HCLK = SYSCLK */
      RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
      /* PCLK2 = HCLK */
      RCC_PCLK2Config(RCC_HCLK_Div1);

      /* PCLK1 = HCLK/2 */
      RCC_PCLK1Config(RCC_HCLK_Div2);

      /* PLLCLK = 8MHz * 9 = 72 MHz */
      RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
      
//enable PLL
RCC_PLLCmd(ENABLE);
        
//Wait till PLL is ready
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {}

        //Select PLL as system clock source
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        //Wait till PLL is used as system clock source
        while(RCC_GetSYSCLKSource() != 0x08)
        {}
   }

这段代码应该没问题,以防万一,先贴出来。
之后如果去配置uart或者TIM2这些外设,使他们正常使用?

使用特权

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

本版积分规则

1

主题

9

帖子

0

粉丝