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

[复制链接]
1369|6
 楼主| spartacusepic 发表于 2019-7-1 20:50 | 显示全部楼层 |阅读模式
本帖最后由 spartacusepic 于 2019-7-1 20:51 编辑

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

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


  1. int main(void)
  2. {
  3.   /* Infinite loop */
  4.    
  5.     //uint16_t adc_res;                    //用于储存最新的ADC结果
  6.     HT1621Values Seg_LCD;                //第一次指令后没有变量定义
  7.     uint32_t BGJ_num_disp = 0;           //累计次数
  8.     uint32_t BGJ_num_default = 97;       //数量设定值

  9.     uint32_t BGJ_ratio_buff;
  10.     uint8_t ratio_addr;
  11.    
  12.     KEY_VALUE = 22222;

  13.   
  14.     disableInterrupts();                 //关闭中断

  15.     RCC_HSI_Configuration();             //时钟配置
  16.     GPIO_Configuration();
  17.    
  18.     GPIO_Init(LED_PORT, LED_PIN, GPIO_MODE_OUT_PP_LOW_FAST); //初始LED
  19.     LED_OFF();

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

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

  24.     disableInterrupts();                 //关闭总中断
  25.     GPIO_DeInit(GPIOC);
  26.     GPIO_Init(GPIOC, GPIO_PIN_5, GPIO_MODE_IN_PU_NO_IT); //PC5口关闭中断
  27.     GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); //PC6口关闭中断
  28.     GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT); //PC7口关闭中断

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

  34.   while (1)
  35.   {  
  36.    Ht1621Wr_BGJ_Num(KEY_VALUE);          //显示当前值
  37.    Delayms(500);    //延时500MS
  38.   }
  39. }



  40. INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 1)  
  41. {  
  42.   disableInterrupts();
  43.     if((GPIOC->IDR & GPIO_PIN_4) == 0)  //检测是不是低电平  
  44.     {  
  45.       Delayms(100);                     //消抖处理
  46.       if((GPIOC->IDR & GPIO_PIN_4) == 0)//检测是不是低电平
  47.       {
  48.         while(!(GPIOC->IDR  & GPIO_PIN_4)); //松手检测
  49.         {
  50.           KEY_VALUE = KEY_VALUE + 1;
  51.         }
  52.       }
  53.     }  
  54.    enableInterrupts();
  55. }  




香水城 发表于 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

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