STM32
直播中

王凯

7年用户 1323经验值
私信 关注
[问答]

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

程序在附件也有
#include  
#include  

#define uchar unsigned char  
#define uint  unsigned 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();



}


回帖(2)

丁峙昌

2024-5-7 15:14:45
没有清中断标记吧
举报

张桂英

2024-5-7 17:41:33
STM8在关闭总中断后仍然响应外部中断的原因可能是:

1. 外部中断配置问题:即使总中断被关闭,如果外部中断的配置仍然处于激活状态,它仍然可以响应外部事件。请检查您的代码,确保在关闭总中断之前,您已经正确地配置了外部中断。

2. 代码中的其他中断服务例程:请检查您的代码,确保没有其他中断服务例程(ISR)在运行,这可能会导致程序响应外部中断。

3. 硬件问题:如果上述两个原因都排除了,那么可能是硬件问题。请检查您的STM8微控制器和外部中断引脚,确保它们没有短路或损坏。

关于您提供的代码片段,它包含了一些变量定义和两个延时函数(Delay_10ms 和 Delay_200ms)。这些函数使用循环来实现延时,但它们与STM8响应外部中断的问题无关。为了解决外部中断的问题,请检查您的中断配置和中断服务例程。

如果您需要进一步的帮助,请提供更多关于您的STM8项目和中断配置的详细信息。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分