djqling 发表于 2017-2-21 09:40:05

STM8关闭了总中断为什么还是响应外部中断?

程序在附件也有
#include <stm8s.h>
#include <stm8s_exti.h>

#define uchar unsigned char
#define uintunsigned int
uint curtain1_down,curtain1_up,curtain2_down,curtain2_up,K1,K2,K3;   
void Delay_10ms()
{
uint y;   
for(y=6150; y>0; y--)//10ms=6150
{

}
}
void Delay_200ms()
{
uint x,y;
for(x=20; x>0; x--)//200ms=20
{
for(y=6150; y>0; y--)//1ms=615
{
}
}
}
void Delay_50ms()
{
uint x,y;
for(x=5; x>0; x--)//200ms=20
{
for(y=6150; y>0; y--)//1ms=615
{
}
}
}
void main(void)
{
      K1=0;
      K2=0;
      K3=0;
      curtain1_down=0;
      curtain2_down=0;
      curtain1_up=0;
      curtain2_up=0;
      GPIO_DeInit(GPIOC);
      GPIO_DeInit(GPIOB);
      GPIO_DeInit(GPIOD);
      GPIO_Init(GPIOC,GPIO_PIN_1,GPIO_MODE_OUT_PP_LOW_SLOW);
      GPIO_Init(GPIOC,GPIO_PIN_2,GPIO_MODE_OUT_PP_LOW_SLOW);
      GPIO_Init(GPIOC,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_SLOW);
      GPIO_Init(GPIOC,GPIO_PIN_4,GPIO_MODE_OUT_PP_LOW_SLOW);
      GPIO_Init(GPIOC,GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_SLOW);
      GPIO_Init(GPIOC,GPIO_PIN_6,GPIO_MODE_OUT_PP_LOW_SLOW);
      GPIO_Init(GPIOC,GPIO_PIN_7,GPIO_MODE_OUT_PP_LOW_SLOW);

      disableInterrupts();
      GPIO_Init(GPIOB,GPIO_PIN_1,GPIO_MODE_IN_PU_IT);
      GPIO_Init(GPIOB,GPIO_PIN_2,GPIO_MODE_IN_PU_IT);
      GPIO_Init(GPIOB,GPIO_PIN_3,GPIO_MODE_IN_PU_IT);
      GPIO_Init(GPIOB,GPIO_PIN_4,GPIO_MODE_IN_PU_IT);
      GPIO_Init(GPIOB,GPIO_PIN_5,GPIO_MODE_IN_PU_IT);
      GPIO_Init(GPIOB,GPIO_PIN_6,GPIO_MODE_IN_PU_IT);
      GPIO_Init(GPIOB,GPIO_PIN_7,GPIO_MODE_IN_PU_IT);
      CLK_HSIPrescalerConfig( CLK_PRESCALER_HSIDIV8);
      EXTI_DeInit();
      EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB , EXTI_SENSITIVITY_FALL_ONLY);
      enableInterrupts();
        while(1)
      {
      }
}

INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler,4)
{
disableInterrupts();
Delay_50ms();
if((GPIO_ReadInputData(GPIOB)&GPIO_PIN_7)==0x00)//窗帘1降                  
{

    curtain1_down=curtain1_down+1;
      if(curtain1_down==1)
      {
      curtain1_up=0;
      GPIO_WriteLow(GPIOC, GPIO_PIN_6);
      Delay_200ms();
      GPIO_WriteHigh(GPIOC, GPIO_PIN_7);
      }
    if(curtain1_down==2)
      {
      curtain1_down=0;
      curtain1_up=0;
      GPIO_WriteLow(GPIOC, GPIO_PIN_6);
      GPIO_WriteLow(GPIOC, GPIO_PIN_7);
      }
   }
   if((GPIO_ReadInputData(GPIOB)&GPIO_PIN_6)==0x00)//窗帘1升                          
{
      curtain1_up=curtain1_up+1;
      if(curtain1_up==1)
      {
          curtain1_down=0;
          GPIO_WriteLow(GPIOC, GPIO_PIN_7);
          Delay_200ms();
          GPIO_WriteHigh(GPIOC, GPIO_PIN_6);
      }
         if(curtain1_up==2)
      {
          curtain1_up=0;
          curtain1_down=0;
          GPIO_WriteLow(GPIOC, GPIO_PIN_7);
          GPIO_WriteLow(GPIOC, GPIO_PIN_6);
      }
}
   if((GPIO_ReadInputData(GPIOB)&GPIO_PIN_5)==0x00)//窗帘2降                          
{

   curtain2_down=curtain2_down+1;
      if(curtain2_down==1)
      {
      curtain2_up=0;
      GPIO_WriteLow(GPIOC, GPIO_PIN_4);
      Delay_200ms();
      GPIO_WriteHigh(GPIOC, GPIO_PIN_5);
      }
    if(curtain2_down==2)
      {
      curtain2_down=0;
      curtain2_up=0;
      GPIO_WriteLow(GPIOC, GPIO_PIN_4);
      GPIO_WriteLow(GPIOC, GPIO_PIN_5);
      }
}

   if((GPIO_ReadInputData(GPIOB)&GPIO_PIN_4)==0x00)//窗帘2升                          
{
      curtain2_up=curtain2_up+1;
      if(curtain2_up==1)
      {
          curtain2_down=0;
          GPIO_WriteLow(GPIOC, GPIO_PIN_5);
          Delay_200ms();
          GPIO_WriteHigh(GPIOC, GPIO_PIN_4);
      }
         if(curtain2_up==2)
      {
          curtain2_up=0;
          curtain2_down=0;
          GPIO_WriteLow(GPIOC, GPIO_PIN_5);
          GPIO_WriteLow(GPIOC, GPIO_PIN_4);
      }
}
   if((GPIO_ReadInputData(GPIOB)&GPIO_PIN_3)==0x00)                          
{
    K1=K1+1;
    if(K1==1)
    {
    GPIO_WriteHigh(GPIOC, GPIO_PIN_3);
    }
    if(K1==2)
    {
      K1=0;
    GPIO_WriteLow(GPIOC, GPIO_PIN_3);
    }
}
   if((GPIO_ReadInputData(GPIOB)&GPIO_PIN_2)==0x00)                          
{
    K2=K2+1;
    if(K2==1)
    {
    GPIO_WriteHigh(GPIOC, GPIO_PIN_2);
    }
    if(K2==2)
    {
      K2=0;
    GPIO_WriteLow(GPIOC, GPIO_PIN_2);
    }
}
   if((GPIO_ReadInputData(GPIOB)&GPIO_PIN_1)==0x00)                          
{
    K3=K3+1;
    if(K3==1)
    {
    GPIO_WriteHigh(GPIOC, GPIO_PIN_1);
    }
    if(K3==2)
    {
      K3=0;
    GPIO_WriteLow(GPIOC, GPIO_PIN_1);
    }
}
//enableInterrupts();



}

adarly 发表于 2017-3-27 08:04:15

没有清中断标记吧

队长shiwo 发表于 2017-3-27 09:46:55

确定关了总中断了吗,试试只关了那个外部中断还会不会触发

xmshao 发表于 2017-3-27 12:08:51

不要在中断程序里任性随意的使用disableInterrupts();和enableInterrupts();

推荐个链接阅读下:一个关于STM8中断应用异常的话题 一个关于STM8中断应用异常的话题

无薪税绵 发表于 2017-3-27 12:26:51

理论上,总中断关闭,是不会发生中断了,应该是程序上的问题。

cldym 发表于 2017-3-27 14:27:12

总中断关闭,是不会发生中断了,应该是程序上的问题

liu553824989 发表于 2017-3-27 16:03:24

本帖最后由 liu553824989 于 2017-3-27 16:05 编辑

总中断是在MAIN函数之前才有用的,在其他地方使用关总中断是没起作用的。因为中断级别大于main函数的级别,所以关总中断失效。所以最好是清掉这个标记位。。
页: [1]
查看完整版本: STM8关闭了总中断为什么还是响应外部中断?