[STM8] STM8有时不能唤醒

[复制链接]
1196|16
 楼主| jlyuan 发表于 2017-10-29 13:33 | 显示全部楼层 |阅读模式
STM8有时不能唤醒
hanwe 发表于 2017-10-29 13:34 | 显示全部楼层
还有什么现象?能再详细描述下吗?
 楼主| jlyuan 发表于 2017-10-29 13:36 | 显示全部楼层
用STM8L做一个遥控器,矩阵按键,MCU平时是休眠(HALT),功耗1uA。
有按键按下则唤醒。现在遇到一个问题:做按键老化测试时,最少140次,最多26000次,MCU就不能被唤醒了,测量电流还是1uA。
重启之后,又能正常工作。
将HALT()前面的中断使能enableInterrupt()屏蔽仍然有这样的问题。
langgq 发表于 2017-10-29 13:37 | 显示全部楼层
还有什么现象?能再详细描述下吗?
 楼主| jlyuan 发表于 2017-10-29 13:38 | 显示全部楼层
按键矩阵:使用的是内部上拉,改用外部上拉10K电阻,一样会卡在那里不能唤醒。
贴上代码:
void McuHalt(void)
{
  DISABLE_INT(); //先关闭中断避免在进入休眠前有端口中断发生  
  CLK_Peripheral_Disable();
  EnableKeyIsr(ENABLE);//使能端口下降沿中断并将行扫描的端口设置为低
  TIM4_Cmd(DISABLE);
  nop();
  __halt();
  nop();
  KeyPressEvent(); //真正唤醒后才关闭中断   
  TIM4_Cmd(ENABLE);
  CLK_Peripheral_Enable();  
}



//按键接收中断 下降沿中断

#pragma vector=10
__interrupt void EXTI0_IRQHandler(void)
{
  OSSetEvent(KEY_TASK,KEY_INT_EVENT);
  EXTI_ClearITPendingBit(EXTI_IT_Pin0);
}

#pragma vector=11
__interrupt void EXTI1_IRQHandler(void)
{   
  EXTI_ClearITPendingBit(EXTI_IT_Pin1);
}
 楼主| jlyuan 发表于 2017-10-29 13:41 | 显示全部楼层
做了一个串口调试程序,发现问题在按键测试到27812次时,程序有进入休眠,休眠按键按下有中断,但是没有被唤醒,然后再按按键就没有中断了(按键中断关闭了端口中断)。
 楼主| jlyuan 发表于 2017-10-29 13:43 | 显示全部楼层
现在修改成加入标志sleepflag,休眠前置位,休眠后清零,只有sleepflag为0后,才关闭中断。
试试效果。
bqyj 发表于 2017-10-29 13:45 | 显示全部楼层
删除休眠前的全局中断使能,简化按键中断初始化和休眠之间的处理,缩短时间,降低按键在这段时间按下的概率
zhuhuis 发表于 2017-10-29 13:46 | 显示全部楼层
调整中断的处理方式:确保MCU唤醒之后再关闭中断,这样确保即便当次没有唤醒,再按一次,仍可以唤醒MCU来正常工作
songqian17 发表于 2017-10-29 13:48 | 显示全部楼层
楼主你好,我正在学习STM8的唤醒,能看看你修改后的代码吗???
heweibig 发表于 2017-10-29 13:50 | 显示全部楼层
1uA很不错哦
jiahy 发表于 2017-10-29 13:52 | 显示全部楼层
用的是中断模式唤醒吗
shimx 发表于 2017-10-29 13:53 | 显示全部楼层
原因是什么,之前怎么经过一定次数后,就失效了
 楼主| jlyuan 发表于 2017-10-29 13:55 | 显示全部楼层
其实还是不大明白,我再琢磨琢磨吧,多谢了哈,结贴了先
tzcll 发表于 2017-11-26 20:06 | 显示全部楼层
请问楼主问题解决了么
CCompton 发表于 2017-11-28 11:06 | 显示全部楼层
确保MCU唤醒之后再关闭中断
xixi2017 发表于 2017-11-28 17:01 | 显示全部楼层
是偶尔的问题,还是很频繁的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

880

主题

12030

帖子

4

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