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

摘要:
EXTI_SWIER功能:允许我们通过程序控制启动中断/事件行。1.生成事件的线路的最终产物是一个脉冲信号,可以被其他外围电路使用,例如定时器TIM、模数转换器ADC等。关于外部中断寄存器EXTI-˃SWIER的使用,我一开始就感到困惑。我觉得手册没有解释清楚。随着我对EXTI-˃SWIER函数的理解,我编写了一个验证程序并做了一个实验。

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

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

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

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

关于外部中断寄存器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已经触发。

免责声明:文章转载自《外部事件/中断的区别及EXTI-&amp;gt;SWIER的用途》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇chromium浏览器开发系列第三篇:chromium源码目录结构Docker的4种网络模式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

时间片轮询-应用程序架构

大致应用程序的架构有三种:1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用程序即可。 2. 时间片轮询法,此方法是介于顺序执行与操作系统之间的一种方法。 3. 操作系统,此法应该是应用程序编写的最高境界。 下面就分别谈谈这三种方法的利弊和适应范围 1. 前后台顺序执行法 前后台程序一般是指没有...

STM32学习笔记——定时器中断(向原子哥学习)

定时器中断 STM32的定时器功能十分强大,有TIME1和TIME8等高级定时器,也有TIME2~TIME5等通用定时器,还有TIME6和TIME7等基本定时器。在本章中,我们将利用TIM3的定时器中断来控制DS1的翻转,在主函数用DS0的翻转来提示程序正在运行。选择难度适中的通用定时器来介绍。 1、STM32通用定时器简介 STM32的通用定时器是一个通...

go语言学习--内核态和用户态(协程)

go中的一个特点就是引入了相比于线程更加轻量级的协程(用户态的线程),那么什么是用户态和内核态呢? 一、什么是用户态和内核态 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈...

FreeRTOS理解

列表的插入 初始化 插入步骤   在图3-1中我们看到寄存器xPSR被初始为0x01000000,其中bit24被置1,表示使用Thumb指令;寄存器PC被初始化为任务函数指针vTask_A,这样当某次任务切换后,任务A获得CPU控制权,任务函数vTask_A被出栈到PC寄存器,之后会执行任务A的代码;LR寄存器初始化为函数指针prvTaskExitErr...

STM32+IAP方案 实现网络升级应用固件

关注了这个概念有些日子了,这段时间总算有机会实战==网络升级应用固件,这里记录下遇到的问题,及解决方案。 原理与网上流传的串口作为传输手段 一致;不同之处,无非我这里使用了网络设备传输。==(lwip)TFTP客户端的应用. 参考: IAR环境下STM32+IAP方案的实现STM32浅谈之IAP.pdf基于IAP和Keil MDK的远程升级设计kei...

Linux内核分析总结

周子轩 原创作品转载注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 笔记: 冯诺依曼体系结构的核心思想是存储程序计算机。在计算机中有两种指令,一是用户指令,一是系统调用。 Linux是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统...