打印
[STM8]

STM8S无法正常中断

[复制链接]
716|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
要实现的功能比较简单,BS818A芯片接收到触摸屏的按键信号后,会在BIN3引脚输出一个低电平,STM8S则在PC4脚接收外部中断,再进一步对按键信号进行处理。但是每次触摸了屏幕后,程序都会死掉

使用特权

评论回复
沙发
xxrs| | 2021-5-9 22:35 | 只看该作者

还有什么现象?能再详细描述下吗?

使用特权

评论回复
板凳
zhenykun|  楼主 | 2021-5-9 22:36 | 只看该作者

使用特权

评论回复
地板
zhenykun|  楼主 | 2021-5-9 22:40 | 只看该作者
触摸的时候测量到BIN3脚的电平确实是变低的,也只有在开启了enableInterrupts();  //开启总中断 后才发生程度死掉的情况,但是不知道程序死在什么位置

使用特权

评论回复
5
zhenykun|  楼主 | 2021-5-9 22:42 | 只看该作者

使用特权

评论回复
6
zhaoxqi| | 2021-5-9 22:44 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
7
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();
}  

使用特权

评论回复
8
yszong| | 2021-5-9 22:48 | 只看该作者
你那Delayms(100); 具体靠什么实现的?

使用特权

评论回复
9
juventus9554| | 2021-5-9 22:51 | 只看该作者
里面有涉及到中断吗?

使用特权

评论回复
10
supernan| | 2021-5-9 22:53 | 只看该作者
代码里有哪些中断?

使用特权

评论回复
11
heweibig| | 2021-5-9 22:55 | 只看该作者
你中断里不要有那个开关中断的操作,除非你有特别目的。

使用特权

评论回复
12
zhenykun|  楼主 | 2021-5-9 23:01 | 只看该作者
我的延迟函数就是简单的循环,不涉及中断的

使用特权

评论回复
13
heweibig| | 2021-5-9 23:06 | 只看该作者
中断向量出错了

使用特权

评论回复
14
zhenykun|  楼主 | 2021-5-9 23:08 | 只看该作者
INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 1)
改为
INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5)
PORTC对应的中断源是EXTI2、中断向量号是5

使用特权

评论回复
15
zhenykun|  楼主 | 2021-5-9 23:10 | 只看该作者
这个在stm8s_it.h文件中有定义,之前没有注意到。嘻嘻

使用特权

评论回复
16
chuxh| | 2021-5-9 23:12 | 只看该作者

使用边沿中断而非电平中断应该就可以了。

使用特权

评论回复
17
llljh| | 2021-5-9 23:15 | 只看该作者
不管如何,在中断函数里执行延时和等待按键松开,这个程序思路非常低级

使用特权

评论回复
18
dingy| | 2021-5-9 23:15 | 只看该作者
只适合单任务的简单场合。

使用特权

评论回复
19
zhenykun|  楼主 | 2021-5-9 23:18 | 只看该作者

明白了,多谢大家讨论这么多哈

使用特权

评论回复
20
ipman| | 2021-5-9 23:55 | 只看该作者
中断里面 Delayms(100); ??你真行

使用特权

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

本版积分规则

868

主题

11535

帖子

3

粉丝