你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

求助STM8L进入halt休眠后外中断唤醒死机

[复制链接]
风-417456 提问时间:2015-8-4 15:52 /
首先说明一下电路上,我设置PB3接了按键并设置为外中断唤醒。
在休眠前单单配置PB3口
PB_DDR &= 0xf7;
PB_CR1 |= 0x08;
PB_CR2 |= 0x08;
这个时候进入休眠后按键按下每次都可以正常启动
但是一旦休眠前对PB的其他引脚也进行配置就会出现按键第一次按下后能正常启动,但是当再次休眠后,按键按下去就不再能唤醒单片机了,只能上电重启
这是什么情况引起的
收藏 评论6 发布时间:2015-8-4 15:52

举报

6个回答
风-417456 回答时间:2015-8-5 10:43:13
本帖最后由 风-417456 于 2015-8-5 10:47 编辑

没人知道吗?自己顶一下。以下是中断配置
void Interrupt_init(void)
{
//        EXTI_CR3 = 0x02;
        EXTI_CR1 |= 0x80;
        
        ITC_SPR3 |= 0x40;
}

程序连续运行就会出现第二次唤醒失败。但是在中断程序174行设断点仿真运行的话是每次都可以正常唤醒的
QQ截图20150805104411.jpg

外中断唤醒

外中断唤醒
zhuoyemp4 回答时间:2015-8-5 11:02:34
请参考
实现功能:T2每进中断让PD口输出翻转,10次后进入halt,PB1外部中断唤醒,唤醒时让PC口翻转。看到的现象就是LED以1s间隔闪烁,闪10次后停机,用PB1按键唤醒后PC口输出取反,PD口LED接着闪烁。
void initcpu();
void Init_GPIO(void);
void delay(unsigned char ms);
void  Tim2INIT(void);
unsigned int i;
u8 TIM1S;

int main()
{
      Init_GPIO();  
      initcpu();
        Tim2INIT();
        enableInterrupts();
        while(1)
        {  
          if(TIM1S>10)
             {
               TIM1S=0;
               GPIOD->ODR=0x08;//进入Halt前关掉LED
               GPIOB->CR2=0x02; //PB1使能外部中断
               halt();  //进入halt模式
             }
        }
}

void Init_GPIO(void)
{
  GPIOB->DDR=0x00;
  GPIOB->CR1=0x02;  //PB1上拉输入
  GPIOB->CR2=0x00;  //PB禁止外部中断
  EXTI->CR1 = 0x08;  //PB1下降沿触发
  
  GPIOC->DDR=0x08;
  GPIOC->CR1=0x08;
  GPIOC->CR2=0x00;
  GPIOC->ODR=0x00;
  
  GPIOD->DDR=0x08;
  GPIOD->CR1=0x08;
  GPIOD->CR2=0x00;
  GPIOD->ODR=0x00;  //LED低亮
}
void initcpu()
{
        
        //CLK->CKDIVR&= (uint8_t)(~0x18);/*时钟复位*/
        CLK->CKDIVR= (uint8_t)0x01;   /*设置时钟为内部16M高速时钟*/
        disableInterrupts();  //close all interrupt
}


void delay(unsigned char i)
{
  unsigned int j;
  j=65535;
  while(i--)
  {
    while(j--);
  }
}
void  Tim2INIT(void)
{
        CLK->PCKENR1|=0x20;
        TIM2->ARRH=0xf4;
        TIM2->ARRL=0x24;
        TIM2->CNTRH=0x00;
        TIM2->CNTRL=0x00;
        TIM2->PSCR=0x08;//256分频
        TIM2->CR1=0x80;
        TIM2->EGR=0x00;
        TIM2->IER|=0x01;
        TIM2->CR1|=0x01;   
}

INTERRUPT_HANDLER(TIM2_UPD_OVF_TRG_BRK_IRQHandler,13)
{
      TIM2->SR1 &= 0xfe;
          TIM1S++;
       GPIOD->ODR=~GPIOD->ODR;
      return;
        
}

INTERRUPT_HANDLER(EXTI1_IRQHandler,4)  //PB1外部中断
{
       GPIOB->CR2=0x00; //PB禁止外部中断
       GPIOC->ODR=~GPIOC->ODR;
      return;
        
}
zhuoyemp4 回答时间:2015-8-5 11:11:02
进入halt前开启外部中断,唤醒后或者进入唤醒源中断服务函数时关掉外部中断
风-417456 回答时间:2015-8-5 13:00:11
zhuoyemp4 发表于 2015-8-5 11:11
进入halt前开启外部中断,唤醒后或者进入唤醒源中断服务函数时关掉外部中断 ...

一开始就是这样写的,但是也会出问题,后人说是中断重入了,所以把关总中断给去掉了
zhuoyemp4 回答时间:2015-8-5 13:27:49
风-417456 发表于 2015-8-5 13:00
一开始就是这样写的,但是也会出问题,后人说是中断重入了,所以把关总中断给去掉了
...

总中断开启就没必要关了
风-417456 回答时间:2015-8-5 14:05:49
zhuoyemp4 发表于 2015-8-5 13:27
总中断开启就没必要关了

现在好了,不知道算不算解决了。
之前都是清中断标志位后才关引脚中断,现在调换一下,先关引脚中断后清中断标志位正常了。还是没有搞清楚具体原因
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版