[STM8] STM8S无法正常中断

[复制链接]
1147|24
 楼主| zhenykun 发表于 2021-5-9 22:29 | 显示全部楼层 |阅读模式
要实现的功能比较简单,BS818A芯片接收到触摸屏的按键信号后,会在BIN3引脚输出一个低电平,STM8S则在PC4脚接收外部中断,再进一步对按键信号进行处理。但是每次触摸了屏幕后,程序都会死掉
xxrs 发表于 2021-5-9 22:35 | 显示全部楼层

还有什么现象?能再详细描述下吗?
 楼主| zhenykun 发表于 2021-5-9 22:36 | 显示全部楼层
 楼主| zhenykun 发表于 2021-5-9 22:40 | 显示全部楼层
触摸的时候测量到BIN3脚的电平确实是变低的,也只有在开启了enableInterrupts();  //开启总中断 后才发生程度死掉的情况,但是不知道程序死在什么位置
 楼主| zhenykun 发表于 2021-5-9 22:42 | 显示全部楼层
zhaoxqi 发表于 2021-5-9 22:44 | 显示全部楼层

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
 楼主| zhenykun 发表于 2021-5-9 22:47 | 显示全部楼层
int main(void)
{
  /* Infinite loop */
   
    //uint16_t adc_res;                    //用于储存最新的ADC结果
    HT1621Values Seg_LCD;                //第一次指令后没有变量定义
    uint32_t BGJ_num_disp = 0;           //累计次数
    uint32_t BGJ_num_default = 97;       //数量设定值

    uint32_t BGJ_ratio_buff;
    uint8_t ratio_addr;
   
    KEY_VALUE = 22222;

  
    disableInterrupts();                 //关闭中断

    RCC_HSI_Configuration();             //时钟配置
    GPIO_Configuration();
   
    GPIO_Init(LED_PORT, LED_PIN, GPIO_MODE_OUT_PP_LOW_FAST); //初始LED
    LED_OFF();

    HT1621_PortInit();                   //屏幕处理端口设置
    HT1621_Init();                       //显示屏初始化

    HT1621_AllOn(11);                    //开启所有段码管
    Delayms(500);                        //延时使LCD工作电压稳定

    disableInterrupts();                 //关闭总中断
    GPIO_DeInit(GPIOC);
    GPIO_Init(GPIOC, GPIO_PIN_5, GPIO_MODE_IN_PU_NO_IT); //PC5口关闭中断
    GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); //PC6口关闭中断
    GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT); //PC7口关闭中断

    GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);    //PC4口浮空输入使能中断
    EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿触发
    EXTI_Configuration();
   
    enableInterrupts();                  //开启总中断

  while (1)
  {  
   Ht1621Wr_BGJ_Num(KEY_VALUE);          //显示当前值
   Delayms(500);    //延时500MS
  }
}



INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 1)  
{  
  disableInterrupts();
    if((GPIOC->IDR & GPIO_PIN_4) == 0)  //检测是不是低电平  
    {  
      Delayms(100);                     //消抖处理
      if((GPIOC->IDR & GPIO_PIN_4) == 0)//检测是不是低电平
      {
        while(!(GPIOC->IDR  & GPIO_PIN_4)); //松手检测
        {
          KEY_VALUE = KEY_VALUE + 1;
        }
      }
    }  
   enableInterrupts();
}  
yszong 发表于 2021-5-9 22:48 | 显示全部楼层
你那Delayms(100); 具体靠什么实现的?
juventus9554 发表于 2021-5-9 22:51 | 显示全部楼层
里面有涉及到中断吗?
supernan 发表于 2021-5-9 22:53 | 显示全部楼层
代码里有哪些中断?
heweibig 发表于 2021-5-9 22:55 | 显示全部楼层
你中断里不要有那个开关中断的操作,除非你有特别目的。
 楼主| zhenykun 发表于 2021-5-9 23:01 | 显示全部楼层
我的延迟函数就是简单的循环,不涉及中断的
heweibig 发表于 2021-5-9 23:06 | 显示全部楼层
中断向量出错了
 楼主| zhenykun 发表于 2021-5-9 23:08 | 显示全部楼层
INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 1)
改为
INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5)
PORTC对应的中断源是EXTI2、中断向量号是5
 楼主| zhenykun 发表于 2021-5-9 23:10 | 显示全部楼层
这个在stm8s_it.h文件中有定义,之前没有注意到。嘻嘻
chuxh 发表于 2021-5-9 23:12 | 显示全部楼层

使用边沿中断而非电平中断应该就可以了。
llljh 发表于 2021-5-9 23:15 | 显示全部楼层
不管如何,在中断函数里执行延时和等待按键松开,这个程序思路非常低级
dingy 发表于 2021-5-9 23:15 | 显示全部楼层
只适合单任务的简单场合。
 楼主| zhenykun 发表于 2021-5-9 23:18 | 显示全部楼层

明白了,多谢大家讨论这么多哈
ipman 发表于 2021-5-9 23:55 | 显示全部楼层
中断里面 Delayms(100); ??你真行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

868

主题

11535

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部