[STM8]

STM8S无法正常中断,求各位路过的大神慷慨相...

[复制链接]
988|6
手机看帖
扫描二维码
随时随地手机跟帖
spartacusepic|  楼主 | 2019-7-1 20:50 | 显示全部楼层 |阅读模式
本帖最后由 spartacusepic 于 2019-7-1 20:51 编辑

要实现的功能比较简单,BS818A芯片接收到触摸屏的按键信号后,会在BIN3引脚输出一个低电平,STM8S则在PC4脚接收外部中断,再进一步对按键信号进行处理。但是每次触摸了屏幕后,程序都会死掉:
QQ图片20190701201741.png

触摸的时候测量到BIN3脚的电平确实是变低的,也只有在开启了enableInterrupts();  //开启总中断 后才发生程度死掉的情况,但是不知道程序死在什么位置,现在把程序贴上来,求大神看下问题在哪里。
20190701200822237.png


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();
}  




使用特权

评论回复
香水城| | 2019-7-1 22:09 | 显示全部楼层
问你下,你那Delayms(100); 具体靠什么实现的?里面有涉及到中断吗?
代码里有哪些中断?

还有,你中断里不要有那个开关中断的操作,除非你有特别目的。

使用特权

评论回复
spartacusepic|  楼主 | 2019-7-2 12:43 | 显示全部楼层
香水城 发表于 2019-7-1 22:09
问你下,你那Delayms(100); 具体靠什么实现的?里面有涉及到中断吗?
代码里有哪些中断?

我的延迟函数就是简单的循环,不涉及中断的

使用特权

评论回复
spartacusepic|  楼主 | 2019-7-2 12:45 | 显示全部楼层
昨天夜里排查到问题了,原来是我的中断向量出错了。
INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 1)
改为
INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5)
PORTC对应的中断源是EXTI2、中断向量号是5

这个在stm8s_it.h文件中有定义,之前没有注意到。嘻嘻

使用特权

评论回复
sky.sun.zz| | 2019-7-2 13:09 | 显示全部楼层
使用边沿中断而非电平中断应该就可以了。

使用特权

评论回复
gx_huang| | 2019-7-2 13:18 | 显示全部楼层
不管如何,在中断函数里执行延时和等待按键松开,这个程序思路非常低级,只适合单任务的简单场合。

使用特权

评论回复
yediezeus| | 2019-7-3 08:46 | 显示全部楼层

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

7

帖子

0

粉丝