zoukankan      html  css  js  c++  java
  • stm8s 中断重复进入

    设置:

    进入睡眠代码,设置外部中断唤醒

        /*两个按键和底座输入设置为外部中断*/
        /* PD4 PD6 PA2使能外部中断 */
        PD_DDR_DDR4 = 0;
        PD_CR1_C14 = 1;
        PD_CR2_C24 = 1;
        
        PD_DDR_DDR6 = 0;
        PD_CR1_C16 = 1;
        PD_CR2_C26 = 1;
        
        PA_DDR_DDR2 = 0;
        PA_CR1_C12 = 1;
        PA_CR2_C22 = 1;
    
        EXTI_CR1 = 0x00;  //所有端口 低电平和下降沿都中断(00是下降沿触发  01 上升沿 10 下降沿 11 上升沿和下降沿)
    
        asm("halt"); /* 进入停机模式 */

    中断函数

    #pragma vector = EXTI3_vector
    __interrupt void EXTI_PORTD_IRQHandler(void)
    {
      asm("sim");//关中断
      
      machine_sleep_init = 0;
    }
    
    #pragma vector = EXTI0_vector
    __interrupt void EXTI_PORTA_IRQHandler(void)
    {
      asm("sim");//关中断
    
      machine_sleep_init = 0;
    }

    现象:

    偶尔会一直进入中断,在中断中出不来,导致程序无法运行

    解决:

        PA_DDR_DDR2 = 0;//关闭中断
        PA_CR1_C12 = 1;
        PA_CR2_C22 = 0;
    
        EXTI_CR1 = 0x00;  //所有端口 低电平和下降沿都中断(00是下降沿触发  01 上升沿 10 下降沿 11 上升沿和下降沿)
    
        /*两个按键和底座输入设置为外部中断*/
        /* PD4 PD6 PA2使能外部中断 */
        PD_DDR_DDR4 = 0;
        PD_CR1_C14 = 1;
        PD_CR2_C24 = 1;
        
        PD_DDR_DDR6 = 0;
        PD_CR1_C16 = 1;
        PD_CR2_C26 = 1;
        
        PA_DDR_DDR2 = 0;
        PA_CR1_C12 = 1;
        PA_CR2_C22 = 1;
        
        asm("halt"); /* 进入停机模式 */
    #pragma vector = EXTI3_vector
    __interrupt void EXTI_PORTD_IRQHandler(void)
    {
      asm("sim");//关中断
      
      PD_DDR = 0;//设置为上拉输入
      PD_CR1  = 1;
      PD_CR2  = 0;
      
      machine_sleep_init = 0;
    }
    
    #pragma vector = EXTI0_vector
    __interrupt void EXTI_PORTA_IRQHandler(void)
    {
      asm("sim");//关中断
      
      PA_DDR = 0;//设置为上拉输入
      PA_CR1  = 1;
      PA_CR2  = 0;
      
      machine_sleep_init = 0;
    }

    总结:

      stm8s中断没有标志位可以清除,在设置中断的时候顺序:

      1.关总中断

      2.关闭IO中断

      3.设置中断触发条件

      4.开启IO中断

      5.开总中断

      在中断服务函数中,先关闭总中断,再关闭IO的中断即可

  • 相关阅读:
    Fiddler: Creation of interception certificate failed.
    ip地址检查正则表达式 兼容ipv4,ipv6
    母版页与子页的启动过程
    erlang 读取confg文件异常 could not start kernel pid error in config file
    转义字符 显示形式 转换成 实际形式 \\n to \n
    How to use epoll? A complete example in C
    Lex & Flex 词法分析器实践(未完,持续更新)
    我理解的爱情———柳智宇 (转载)
    Learning by doing 系列文章概述
    锁与RCU数据共享机制
  • 原文地址:https://www.cnblogs.com/-yjx-/p/12502512.html
Copyright © 2011-2022 走看看