完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前两天发过一篇帖子,但是还没有结果,重新发一个帖子吧,重新思路,因为之前做的时候很多问题没想明白。
处理方式:看过很多帖子以及自己实验的结果,如果在中断里面进入stop模式,会导致异常,外部中断无法唤醒的,一般的做法都是在中断里面设置一个标志位,在主程序里面再进入stop模式。 贴上我昨晚重新修改的程序: void Sys_WakeUp(void) { SYSCLKConfig_STOP(); PWM_For_Light_Start(10); tiM16_For_Tick_Start(); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); } void Sys_Sleep(void) { PWM_For_Light_Start(0); TIM16_For_Tick_Stop(); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, DISABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, DISABLE); EXTI_ClearITPendingBit(EXTI_Line0 | EXTI_Line1); EXTI_ClearFlag(EXTI_Line0 | EXTI_Line1); PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); } 在main函数里面添加: if(b_sys_enter_stop_mode ) { b_sys_enter_stop_mode = 0; Sys_Sleep(); Sys_WakeUp(); } 然后在外部中断函数里面添加: void EXTI0_1_IRQHandler(void) { unsigned int i; for(i=0;i<2000;i++); if(EXTI_GetITStatus(EXTI_Line0)!= RESET ) { if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0) b_current_source = CURRENT_FORM_BAT; else b_current_source = CURRENT_FORM_AC; b_current_has_change = 1; EXTI_ClearITPendingBit(EXTI_Line0); EXTI_ClearFlag(EXTI_Line0); } else if(EXTI_GetITStatus(EXTI_Line1)!= RESET ) { EXTI_ClearITPendingBit(EXTI_Line1); EXTI_ClearFlag(EXTI_Line1); if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0) { b_sys_enter_stop_mode = 1; } } } 我的测试方法是接了数码管,内部有ADC+DMA,还有定时器,数码管上有定时器计时和转换的AD值。 按照这种处理方式,按下PA1(EXI1),能正常的进入STOP模式,但再次按下PA1(EXTI1),芯片能被唤醒,但马上又进入stop模式了 。 进入休眠的现象是AD值不变化,定时器计数也不走了。 这个时候如果按下PA0(EXTI0),是能正常唤醒的。 疑问: 1. 外部中断唤醒之后,会进入中断处理函数吗? 2. 如果会进入中断处理函数,那是先进入中断处理函数,还是先恢复到进入stop模式下面的语句开始执行呢? 根据我上面的现象,我感觉是进入中断处理函数了,让b_sys_enter_stop_mode =1,所以才导致又进入休眠了。 于是在进入休眠时改成: if(b_sys_enter_stop_mode ) { b_sys_enter_stop_mode = 0; Sys_Sleep(); Sys_WakeUp(); delay_ms(1000); } 现象还是一样。 于是我再改成: if(b_sys_enter_stop_mode ) { b_sys_enter_stop_mode = 0; Sys_Sleep(); Sys_WakeUp(); while(1) { DataToDspBuf(tick_for_sys_dida,0); DspLcd3(); } } 有时能进入休眠,现象是显示的AD值不变,定时器数值也不变,但有时似乎冲过去了,能看到执行了while(1)里面的函数。 如果是进入了休眠,再次按下PA1(EXTI1),程序就进到while(1)里面执行了,也没有再进STOP模式,这样是比较符合期望的。 接着修改: if(b_sys_enter_stop_mode ) { b_sys_enter_stop_mode = 0; Sys_Sleep(); PA1_Interrupt_Config(DISABLE); Sys_WakeUp(); } 现象是:按下PA1(EXTI1),芯片进入stop模式,但再按PA1,就唤不醒了,我的程序是唤醒之后才禁止中断,似乎程序又冲过了一样,搞不明白。 其实我想到了用独立看门狗IWDG,修改代码如下: if(b_sys_enter_stop_mode ) { b_sys_enter_stop_mode = 0; Sys_Sleep(); Sys_WakeUp(); IWdog_Init(); while(1); } 我的独立看门狗是1s,这样按下PA1(EXTI1),进入休眠,再次按下PA1(EXTI1),马上看门狗就导致系统复位了,我的项目这么做也可以, 只是还搞不清楚外部中断唤醒到底问题出在哪里?还请高手指点一二。。。 |
|
相关推荐
15个回答
|
|
|
|
|
|
file:///C:UsersAdministratorAppDataRoamingTencentUsers413351855QQWinTempRichOle@OK(QES952K`Q%N$SSOD$39.png 程序唤醒后从先进入唤醒的外部中断,然后执行进入STOP休眠的下一条代码。 如果是这样的话,我在程序里面价格状态判断应该就没问题了,在外部中断里面修改成如下: else if(EXTI_GetITStatus(EXTI_Line1)!= RESET ) { EXTI_ClearITPendingBit(EXTI_Line1); if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0) { if(mcu_state == MCU_IS_RUNNING) b_sys_enter_stop_mode = 1; } 很是奇怪,仿真的时候,程序执行玩sys_sleep()之后,直接执行sys_WakeUp()了, 怎么芯片执行 PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); 并不进入stop模式。 |
|
|
|
60user142 发表于 2018-9-29 09:38 方便加下QQ吗,413351855,这样沟通起来更快 |
|
|
|
不是太明白啊
|
|
|
|
|
|
|
|
STOP以后,是从STOP后面继续执行。如果是在线仿真需要设置开启休眠功能。
|
|
|
|
60user142 发表于 2018-9-29 09:38 休眠模式下在线调试可能不太准确,你尽量将程序的运行信息打印出来(比如到串口或者USB),这样能很清楚的看到到底程序是怎么运行的。 一会有空我在F303RE的这个NUCLEO开发板上写个按键中断触发和唤醒STOP的测试程序。 |
|
|
|
|
|
|
|
亲爱的娜娜 发表于 2018-9-29 11:03 我没有这个开发板,我改改管脚,在我的板子上试下吧 |
|
|
|
似乎找到原因了,我有点怀疑是IO口切换状态的时候出的问题,于是我在IO口切换状态的时候,添加了延时。 暂时测试出来效果很好: 外部中断0和1都可以唤醒,只是外部中断0怎么一下子中断了3次,我设置的是上升沿下降沿都中断,应该是2次才读,可能有抖动吧 我会继续测试stop模式的 |
|
|
|
如果是按我的那个测试程序改的话,无论如何都不应该连续发生2次按键中断事件,更别说3次了。这说明进入中断函数里配置IO的状态并没有关闭中断使能才导致又发生中断。 |
|
|
|
加个串口打印,不就知道了
|
|
|
|
亲爱的娜娜 发表于 2018-9-29 11:39 不是的,那是外部中断0产生的中断,外部中断0我是用来检测交直流的,所以我设置的是上升下降沿都产生中断。我现在用来开关机键是外部中断1,外部中断1是很好的,每次就是一次中断。 |
|
|
|
60user142 发表于 2018-9-29 12:08 看来你把这个问题解决了啊,恭喜!! |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2136 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1970 浏览 3 评论
4566 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2116 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2629 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 05:30 , Processed in 0.740259 second(s), Total 70, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号