系统环境: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寄存器添加进来,然后再编译,不会再出现相关错误。
|