[STM8] STM8有时不能唤醒

[复制链接]
1480|17
 楼主| happy_10 发表于 2021-7-6 21:06 | 显示全部楼层 |阅读模式
STM8有时不能唤醒
supernan 发表于 2021-7-6 21:11 | 显示全部楼层

还有什么现象?能再详细描述下吗?
 楼主| happy_10 发表于 2021-7-6 21:13 | 显示全部楼层
用STM8L做一个遥控器,矩阵按键,MCU平时是休眠(HALT),功耗1uA。
有按键按下则唤醒。现在遇到一个问题:做按键老化测试时,最少140次,最多26000次,MCU就不能被唤醒了,测量电流还是1uA。
重启之后,又能正常工作。
将HALT()前面的中断使能enableInterrupt()屏蔽仍然有这样的问题。
houcs 发表于 2021-7-6 21:15 | 显示全部楼层
还有什么现象?能再详细描述下吗?
 楼主| happy_10 发表于 2021-7-6 21:17 | 显示全部楼层
按键矩阵:使用的是内部上拉,改用外部上拉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);
}
 楼主| happy_10 发表于 2021-7-6 21:19 | 显示全部楼层
做了一个串口调试程序,发现问题在按键测试到27812次时,程序有进入休眠,休眠按键按下有中断,但是没有被唤醒,然后再按按键就没有中断了(按键中断关闭了端口中断)。
 楼主| happy_10 发表于 2021-7-6 21:21 | 显示全部楼层

现在修改成加入标志sleepflag,休眠前置位,休眠后清零,只有sleepflag为0后,才关闭中断。
试试效果。
stly 发表于 2021-7-6 21:23 | 显示全部楼层
多怀疑程序吧
dengdc 发表于 2021-7-6 21:25 | 显示全部楼层

删除休眠前的全局中断使能,简化按键中断初始化和休眠之间的处理,缩短时间,降低按键在这段时间按下的概率
jlyuan 发表于 2021-7-6 21:27 | 显示全部楼层
调整中断的处理方式:确保MCU唤醒之后再关闭中断,这样确保即便当次没有唤醒,再按一次,仍可以唤醒MCU来正常工作
huanghuac 发表于 2021-7-6 21:33 | 显示全部楼层
楼主你好,我正在学习STM8的唤醒,能看看你修改后的代码吗???
supernan 发表于 2021-7-6 21:35 | 显示全部楼层
1uA很不错哦
jiahy 发表于 2021-7-6 21:37 | 显示全部楼层

用的是中断模式唤醒吗
jiaxw 发表于 2021-7-6 21:38 | 显示全部楼层
原因是什么,之前怎么经过一定次数后,就失效了
zhuhuis 发表于 2021-7-6 21:41 | 显示全部楼层
确保MCU唤醒之后再关闭中断
zhanghqi 发表于 2021-7-6 21:43 | 显示全部楼层
是偶尔的问题,还是很频繁的。
 楼主| happy_10 发表于 2021-7-6 21:44 | 显示全部楼层

嗯,我再好好缕一缕吧,有了好消息及时通知大家
SantaBunny 发表于 2023-3-6 21:53 | 显示全部楼层
程序有没有错误的地方,比如要设置唤醒的代码。建议详细看一下手册
您需要登录后才可以回帖 登录 | 注册

本版积分规则

744

主题

7973

帖子

6

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