打印
[STM32F1]

关于红外关机 MCU 不能唤醒问题

[复制链接]
1062|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tajiaoxuan2007|  楼主 | 2015-9-9 11:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MCU, TI, ST, IO, pi
stop_mode:
                                            #if DEBUG
                                            printf("MCU Enter Stop Mode!\n");
                                            #endif
                                           
                                            //set the all GPIO as general GPIO 、remap IRDA in EXIT0 and disable TIM4 interrupt
                                            lowLevelGPIOCfg();  

                        ADC_Cmd(ADC1, DISABLE);
                        DMA_Cmd(DMA1_Channel1, DISABLE);
                        WireControl_EXTI_Enable();                        
                        
                        GPIO_ResetBits(Led_Power, Led_Power_Pin);
                                            //GPIO_SetBits(Led_Power, Led_Power_Pin);                                       
                                           
                                            BKP_WriteBackupRegister(BKP_DR3, 0xFFFF);  //设置为睡眠状态
                                           
                                            //Enter a stop mode
                                            //Request to enter STOP mode with regulator in low power mode, wake by any exit interrupt
                                            IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
                                            IWDG_SetReload(0xfff);
                                            IWDG_ReloadCounter();
                                           
                                        PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
                        
                                            //Reconfig HSE clock                       
                                            reconfigSysClkConfig();       
                                   
                                              NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
                                              NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                                              NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
                                              NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
                                              NVIC_Init(&NVIC_InitStructure);

                                              //Configure EXTI0 line
                                              EXTI_InitStructure.EXTI_Line = EXTI_Line0;
                                              EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
                                              EXTI_InitStructure.EXTI_Trigger = ACC_EXTI_Trigger ;   
                                            EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising ;   
                                              EXTI_InitStructure.EXTI_LineCmd = DISABLE;
                                              EXTI_Init(&EXTI_InitStructure);

                        WireControl_EXTI_Disable();
           
                                            //restore the GPIO configurate
                                            GPIO_Configuration(0);
                                            GPIO_SetBits(Led_Power, Led_Power_Pin);
                                            USART_Configuration();
                                            NVIC_Configuration();
                                            TIM_Configuration();
                                            TIM_ITConfig(TIM2, TIM_IT_Update , DISABLE);//开启计数中断
                                            DMA_Configuration();
                                            ADC_Configuration();

                                            BKP_WriteBackupRegister(BKP_DR3, 0x0000);
                                            IWDG_Config();
                                            SysTick_Config(SystemCoreClock / 5);

其实,代码单独抠出来,测试应该是没有问题的。
可能跟我的工程有关。
业务上是这样的,
在程序正常运行的时候,红外接收头的GPIO被定义为定时器捕获的输入,红外POWER键长按5秒之后关机,
在关机之前,将红外接收头的GPIO配置为外部中断(因为停止模式只能由外部中断唤醒或者RTC、USB等唤醒)
然后休眠后,就可以由红外信号唤醒MCU,唤醒后再把红外接收头的GPIO被定义为定时器捕获的输入。
为什么有时候唤不醒,个人推测原因:
在红外POWER键长按的时候,定时器捕获中断一直在触发,当确定收到POWER键长按5秒信号之后关机。
但是手不一定会立刻放开POWER键,所以定时器捕获中断一直在触发,但是在这个时候,我们又在重新配置
红外接收头的GPIO,EXTI,NVIC。所以我推测这里出现了问题。说简单一点就是,在中断函数不断触发的同时
我们在配置它的中断模式,NVIC,这样导致了矛盾。
这只是我的推测,不知大家有何看法。
另外加一条,在我实验的时候发现,虽然在休眠,但是可以响应外部中断(会执行中断服务函数),但就是唤不醒

其实个人也做了规避措施,做法是这样的。
红外POWER键长按5秒关机之后,我会关闭定时器不再捕获红外信号,然后延时300ms,
然后再来配置红红外接收头的GPIO,EXTI,NVIC,这样就没有出现那个现象了。
但是这只是一个规避措施,还是不知道为什么会发生那样的现象。真是如鲠在喉啊
看大家有无想法。
沙发
Snow7| | 2015-9-9 21:51 | 只看该作者
论坛里好像有关于唤不醒的**,楼主可以搜一下

使用特权

评论回复
板凳
xiongxiao| | 2015-9-10 16:03 | 只看该作者
MARK

使用特权

评论回复
地板
amanda_s| | 2015-9-11 10:31 | 只看该作者
进入STOP模式前要把所有的中断标志都清楚,否则会进不了。
你说进了中断确没法唤醒MCU,是怎么判断的?

使用特权

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

本版积分规则

2

主题

3

帖子

0

粉丝