hificwc-319059 发表于 2014-7-16 18:02:47

STM8外中断唤醒有问题

在停机状态,用外中断来唤醒时,只能唤醒一次,为什么这样??????????
 

#include  "iostm8s003f3.h"
#define  nop() asm("nop")
#define K1  PD_IDR_IDR4  //按键
#define LED PD_ODR_ODR2  //LED指示,低亮
void delay(unsigned char i)
{
 unsigned char j;
 j=255;
 while(i--)
 {
  while(j--);
 }
}
void main()
{
 unsigned char temp;
 delay(10);
 PD_CR1 |= 0x10;  //PD4上拉输入
 PD_CR1 |= 0x4;  //
 PD_DDR |= 0x4;  //PD2设置为输出 
 LED=0;
 asm("RIM");  //开总中断
  while(1)
 {
  LED=0;//灯亮;
  delay(255);
  while (!K1)
  {
   temp=0;//延时清0
      delay(255);
   LED=!LED;
  }
  temp++;
  if (temp>20)//按键没按下时,延时再停机
  {
   temp=0;
   PD_CR2 |= 0x10;  //开PD4中断
   EXTI_CR1 = 0x80; //PD4下降沿中断;
   LED=1;//关灯
   asm("halt");  //停机
   nop();nop();nop();nop();nop();
   PD_CR2 = 0x0; //   
  }
 }

#pragma vector=0x08//
__interrupt void EXTI_PD()//PD外中断
{
 nop();
 PD_CR2 = 0x0; //关中断    
}

zhuoyemp4 发表于 2015-5-13 09:57:20

开定时器照样可以唤醒,实现功能: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;
      
}

巅峰残狼 发表于 2014-7-17 16:34:47

RE:STM8外中断唤醒有问题

你初始化的时候开的是总中断,一次外部中断触发之后你关闭了中断,那下次再触发按键的时候总中断开了吗?你把开总中断这一步放到第一个while大循环中试试

hificwc-319059 发表于 2014-7-20 10:26:52

RE:STM8外中断唤醒有问题

总中断开了又没关,不可能外中断后,总中断自动关了吧??

zykzyk-93033 发表于 2014-7-20 10:54:43

RE:STM8外中断唤醒有问题

没有清除中断标志吧:D

有缘于你 发表于 2014-7-20 18:36:27

RE:STM8外中断唤醒有问题

调试下看看程序跑到哪儿去了,是后来一直卡死在中断里面么

feixiang20 发表于 2014-7-23 02:32:45

RE:STM8外中断唤醒有问题

一般不会自动中断或关闭吧

hificwc-319059 发表于 2014-7-23 09:20:42

回复:STM8外中断唤醒有问题

回复第 4 楼 于2014-07-20 10:54:43发表:
没有清除中断标志吧:DSTM8S没有中断标志啊 

hificwc-319059 发表于 2014-7-23 09:21:29

回复:STM8外中断唤醒有问题

回复第 5 楼 于2014-07-20 18:36:27发表:
调试下看看程序跑到哪儿去了,是后来一直卡死在中断里面么
 
都唤不醒了,哪知道程序跑到哪了
 

aaa999kk 发表于 2014-7-24 15:57:39

RE:STM8外中断唤醒有问题

你程序对中断不起作用了吗

hificwc-319059 发表于 2014-7-25 10:42:37

回复:STM8外中断唤醒有问题

回复第 9 楼 于2014-07-24 15:57:39发表:
你程序对中断不起作用了吗
 
是啊,只能唤醒一次,我也搞不明白什么意思:funk:
 
页: [1] 2 3
查看完整版本: STM8外中断唤醒有问题