• 外部事件/中断的区别及EXTI->SWIER的用途


    EXTI_SWIER作用:允许我们通过程序控制就可以启动中断/事件线

    1、产生事件的线路最终的产物是一个脉冲信号,这个脉冲信号可以给其他外设电路使用,比如定时器TIM、模拟数字转换器ADC等等。

    2、产生中断线路目的是把输入信号输入到NVIC,进一步会运行中断服务函数,实现功能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。

    关于外部中断寄存器EXTI->SWIER的用途,刚开始我也是云里雾里,感觉手册说的不是很清楚。凭借自己对EXTI->SWIER功能的理解,自己写了验证程序,做了一个实验。实验成功了;实验平台是野火mini开发板。

        实验原理是:定义两个中断线EXTI0(PA0)和EXTI13(PC13)用来管理两个按键KEY0和KEY1,然后编写中断服务函数,中断服务函数的思路是,按下KEY0时,在LCD上显示“SWIER+KEY0:”;按下KEY1时就将LCD上显示的
    SWIER+KEY0:”清除掉以证明KEY1按键已按下,同时也证明了外部中断线EXTI13已经触发(主函数会有相关的操作)。下面是两个中断服务函数(至于配置和分组函数就不贴出来了):
    void EXTI0_IRQHandler(void)    //KEY0按键
    {
        if(EXTI_GetITStatus(EXTI_Line0) != RESET) 
          {

            LCD_DispStr(20, 80, (uint8_t *)"SWIER+KEY0:", RED);  //显示SWIER+KEY0:
           EXTI_ClearITPendingBit(EXTI_Line0);    
         }  
    }
    void EXTI15_10_IRQHandler(void)  //KEY1按键
    {
       if(EXTI_GetITStatus(EXTI_Line13) != RESET) 
       {
           // LCD_DispStr(20, 60, (uint8_t *)"SWIER+KEY1:", RED); 
            LCD_DispStr(20, 80, (uint8_t *)"SWIER+KEY0:", WHITE);    //清除LCD显示的SWIER+KEY0:
            EXTI_ClearITPendingBit(EXTI_Line13);     
            EXTI->SWIER=0;  //清除EXTI->SWIER寄存器相应的位,这种写法有点不规范,其实是应该将EXTI->SWIER寄存器的bit13清零即复位
       }  
    }
    主函数:
    int main(void)
    {  u8 m=0;
      LCD_Init(); 
      LED_GPIO_Config();
      delay_init();
      uart_init(9600);

      EXTI_PC13_Config(); 
      EXTI_PA0_Config();

      LCD_Clear(0, 0, 240, 320, WHITE); 


      EXTI->IMR|=1<<13;//  
      EXTI->EMR|=1<<13;//
      EXTI->SWIER=0;

    while( 1 )
    {
        m++;
       LCD_DispNumber(100, 100, m, WHITE); //显示m的值
       delay_ms(500);
      if(m==10)
       {
         EXTI->SWIER|=1<<13;  //软件触发中断线13,
          m=0;
       
       }
    }

    主函数其实很简单,程序运行之后,先按下KEY0按键这时会在LCD上显示“SWIER+KEY0”;同时,在LCD上每隔500ms显示一次m的值,当m等于10的时候程序将 EXTI->SWIER寄存器的bit13位置1,这时就相当于按下KEY1按键只不过是由程序执行的而已,这时LCD上显示的“SWIER+KEY0”会被清除;证明外部中断线EXTI13已经触发。

  • 相关阅读:
    判断是否微信浏览器,是的话,加入自己想加的功能
    Spring MVC源码(三) ----- @RequestBody和@ResponseBody原理解析
    Spring MVC源码(二) ----- DispatcherServlet 请求处理流程 面试必问
    Spring MVC源码(一) ----- 启动过程与组件初始化
    spring5 源码深度解析----- IOC 之 bean 的初始化
    spring5 源码深度解析-----IOC 之 循环依赖处理
    spring5 源码深度解析-----IOC 之 属性填充
    spring5 源码深度解析----- IOC 之 bean 创建
    spring5 源码深度解析----- IOC 之 开启 bean 的加载
    spring5 源码深度解析----- IOC 之 自定义标签解析
  • 原文地址:https://www.cnblogs.com/leo0621/p/8185160.html
Copyright © 2020-2023  润新知