STM32F10x.h单片机中断通过寄存器配置

代码在后面,前面为理论部分

  1. 中断服务函数void handle(void),不需要声明,快进快出,避免死循环,大量循环,以及大量延迟函数
  2. 中断有硬中断(硬件触发),软中断(软件触发);单片机的中断是硬件处理机制
  3. 接下来都是单片机的中断,都是实际存在的而且固定的东西

分为

内部中断:

       内核引发的中断:系统中断(异常)

       内核外引发的:片上外设中断,例:串口、ADC引发的

外部中断

       外设引发的,例按键,通过GPIO

STM32F10x.h单片机中断通过寄存器配置_第1张图片

STM32F10x.h单片机中断通过寄存器配置_第2张图片

STM32F10x.h单片机中断通过寄存器配置_第3张图片

NVIC:中断嵌套向量控制器(受内核控制)

在内核手册里,但是我们不用寄存器设置,直接用库函数设置;

NVIC_SetPrority()

作用:

  1. 设置中断优先级
  2. 使能中断(让开关生效)
  3. 根据中断编号匹配中断服务函数

优先级:用数字表示,数字越小,优先级越高。

占先优先级(抢占优先级):高的中断可以打断占先优先级低的中断,例:在中断中执行中断;事件1(占先2),事件2(占先3),可以在事件2执行过程中执行事件1;

次级优先级:当占先优先级一样,次级优先级高的先执行;

次级优先级高的中断不可以打断次级优先级低的中断

STM32F10x.h单片机中断通过寄存器配置_第4张图片

STM32F10x.h单片机中断通过寄存器配置_第5张图片

该图包含了我们要操作的具体部位

STM32F10x.h单片机中断通过寄存器配置_第6张图片

故当设置外部中断时候要注意分开引脚号避免冲突 

 代码实现:

接下来进入正题:

绑定输入线GPIO需要配置:

外部中断配置寄存器:1EXIT通道2)哪个端口

AFIO->EXTICR[0] &= ~(0XF << 0);//PA0EXTI0绑定

EXTI->FTSR |= (0X1 << 0);//EXTI0选择下降沿

EXTI->IMR |= (0X1 << 0);//开放EXTI0的中断请求

STM32F10x.h单片机中断通过寄存器配置_第7张图片

//NVIC配置

NVIC_SetPriorityEXTI0_IRQn, 1;//数据设置优先级,10x1

NVIC_SetPriority_group(5)//下图,设置一次就行(main函数中)

STM32F10x.h单片机中断通过寄存器配置_第8张图片

NVIC_EnableIRQEXTI0_IRQN//中断使能

//EXTIO_IRQN为中断编号

接下来写中断执行服务函数(无需调用)

//先判断挂起寄存器,先清除挂起寄存器

void EXTI0_Handler(void)

{

      if(EXTI->PR & (0X1 << 0))//判断是否为1

{//清除中断

      EXTI->PR |= (0X1 << 0);

//写要执行的代码

flag ^= 1;//异或实现开关反转

}

}

作业:

按键1呼吸灯,按键2流水灯,按键3中断;

你可能感兴趣的:(单片机,stm32,嵌入式硬件)