打印
[MCU]

STM8L休眠唤不醒问题

[复制链接]
2500|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
@若水|  楼主 | 2017-1-10 15:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
系统环境:Win7 32bit
软件环境:IAR 1.40.1




没修改前的外部中断的代码为:
INTERRUPT_HANDLER(EXTI1_IRQHandler,9)
{
  Init_key();//初始化管脚
  EXTI_ClearITPendingBit(EXTI_IT_Pin1);//清中断标志
}
如果发生多次中断事件,即在初始化管脚前发生,在一次中断执行完成后,再响应
下一次中断时,可能执行完后就会进入到休眠状态中,但由于管脚在上次中断已被配置
为非中断管脚,即不会再响应后面的按键中断事件。即出现MCU唤不醒的情况。这种情况
出现的概率还很高。




1、在外部中断函数中,配置CFG->GCR寄存器
CFG->GCR = 0x00;//这句话写在外部中断中,此寄存器可查阅数据手册或参考手册
即强制恢复上下文切换,这样可以防止多次进入中断时,执行完某次中断后,
直接进入到休眠状态。
例如,我的外部中断代码为:
INTERRUPT_HANDLER(EXTI1_IRQHandler,9)
{
  CFG->GCR = 0x00;//AL位设置为0,即唤醒时,恢复上下文切换执行
  EXTI_ClearITPendingBit(EXTI_IT_Pin1);//清除中断标志
}


2、在main函数中,进入休眠前后的代码如下所示:
Key_Exti();//进入休眠前需要初始化的外部中断管脚
halt();//进入休眠状态的代码
Init_key();//等待外部中断发生,并恢复上下文切换后,需要初始化的管脚
disableInterrupts();//关闭全局中断,此处可选,视代码环境而定


完成以上两步后,唤不醒的问题即可解决。


在STM8L101的库中,好像没有定义CFG->GCR寄存器,编译时,会报错。
此时可参考 TIM1 的定义:
#define TIM1                        ((TIM1_TypeDef *) TIM1_BASE)
进行以下添加:
1、
typedef struct CFG_struct
{
  __IO uint8_t GCR; /*!< Global Configuration register */
}
CFG_TypeDef;


2、
#define CFG_BASE                    (uint16_t)0x7F60


3、
#define CFG                         ((CFG_TypeDef *) CFG_BASE)


三步即可将CFG->GCR寄存器添加进来,然后再编译,不会再出现相关错误。

相关帖子

沙发
@若水|  楼主 | 2017-1-10 15:53 | 只看该作者
这个贴子的内容,首次发贴是发在个人博客中,因为是新注册的21ic号,故复制过来开了个贴子

使用特权

评论回复
板凳
tzcll| | 2017-11-25 23:02 | 只看该作者
楼主你好,我想问一下,你出现唤不醒的频率大概是多高。
还有就是,我不太理解    “如果发生多次中断事件,即在初始化管脚前发生,在一次中断执行完成后,再响应
下一次中断时,可能执行完后就会进入到休眠状态中,但由于管脚在上次中断已被配置
为非中断管脚,即不会再响应后面的按键中断事件。即出现MCU唤不醒的情况。这种情况
出现的概率还很高。”这段,一般进入睡眠状态都需要一定条件,比如无按键动作1s内进入睡眠模式,所以怎么会出现执行完中断就进入休眠状态呢。  手上有个无线遥控的项目遇到一样的问题亟待解决,麻烦楼主指点一下,谢谢!

使用特权

评论回复
地板
@若水|  楼主 | 2017-11-27 08:27 | 只看该作者
tzcll 发表于 2017-11-25 23:02
楼主你好,我想问一下,你出现唤不醒的频率大概是多高。
还有就是,我不太理解    “如果发生多次中断事件 ...

你看我修改前与修改后的中断代码,因为按键按下,可能会发生抖动,这样就有多次中断产生了

使用特权

评论回复
5
tzcll| | 2017-11-27 10:41 | 只看该作者
@若水 发表于 2017-11-27 08:27
你看我修改前与修改后的中断代码,因为按键按下,可能会发生抖动,这样就有多次中断产生了 ...

CFG->GCR寄存器默认就是0啊   我程序中并没有操作他。

使用特权

评论回复
6
@若水|  楼主 | 2017-11-27 18:23 | 只看该作者
tzcll 发表于 2017-11-27 10:41
CFG->GCR寄存器默认就是0啊   我程序中并没有操作他。

我用的是STM8L的单片机,不知你用的是哪一款单片机

使用特权

评论回复
7
tzcll| | 2017-11-27 19:54 | 只看该作者
@若水 发表于 2017-11-27 18:23
我用的是STM8L的单片机,不知你用的是哪一款单片机

我也是啊  stm8l101f3  做无线收发  

使用特权

评论回复
8
@若水|  楼主 | 2017-11-28 13:16 | 只看该作者
那应该可以直接参考我的代码

使用特权

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

本版积分规则

个人签名:专注于以太网  GPRS GSM CAN 485 继电器等工控模块 小店:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-6466605198.19.7OO7ja&id=522606430970 回头之人,永远无法见到真相

26

主题

2686

帖子

6

粉丝