风-417456 发表于 2015-8-4 15:52:22

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

首先说明一下电路上,我设置PB3接了按键并设置为外中断唤醒。
在休眠前单单配置PB3口
PB_DDR &= 0xf7;
PB_CR1 |= 0x08;
PB_CR2 |= 0x08;
这个时候进入休眠后按键按下每次都可以正常启动
但是一旦休眠前对PB的其他引脚也进行配置就会出现按键第一次按下后能正常启动,但是当再次休眠后,按键按下去就不再能唤醒单片机了,只能上电重启
这是什么情况引起的

风-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行设断点仿真运行的话是每次都可以正常唤醒的

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);
voidTim2INIT(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--);
}
}
voidTim2INIT(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
总中断开启就没必要关了
现在好了,不知道算不算解决了。
之前都是清中断标志位后才关引脚中断,现在调换一下,先关引脚中断后清中断标志位正常了。还是没有搞清楚具体原因
页: [1]
查看完整版本: 求助STM8L进入halt休眠后外中断唤醒死机