8. 嵌套向量中断控制器NVIC

8. 嵌套向量中断控制器NVIC

  8.1 NVIC简介

  8.2 EXTI中断

  8.3 USART中断

  8.4 TIM中断

  8.5 ADC中断

  8.1 NVIC简介

  • 接口数据传送控制方式有查询、中断和DMA等,中断是重要的接口数据传送控制方式
  • STM32中断控制分为全局和局部2级,全局中断由NVIC控制,局部中断由设备控制
  • NVIC支持多个内部异常和多达240个外部中断。从广义上讲,异常和中断都是暂停正在执行的程序转去执行异常或中断处理程序,然后再返回原来的程序继续执行。从狭义上讲,异常由内部事件引起,而中断由外部硬件产生
  • 异常和中断的处理与子程序调用有相似之处,但也有本质下列区别:
  • (1)什么时候调用子程序是确定的,而什么时候产生异常和中断是不确定的
  • (2)子程序的起始地址由调用程序给出,而异常和中断程序的起始地址存放在地址表中
  • (3)子程序的执行一般是无条件的,而异常和中断处理程序的执行要先使能
  • STM32异常和中断(异常)

  • STM32异常和中断(中断)

  • NVIC通过6种寄存器对中断进行管理

  • STM32支持16个中断优先级,使用8位中断优先级设置的高4位,并分为抢占优先级和响应优先级,抢占优先级在前,响应优先级在后,具体位数分配通过应用程序中断及复位控制寄存器AIRCR的优先级分组PRIGROUP位段(AIRCR[10:8])设置

  • 抢占优先级高(数值小)的中断可以中断抢占优先级低(数值大)的中断,而响应优先级高的中断不能中断响应优先级低的中断

8.2 EXTI

  • 每个配置为输入方式的GPIO引脚都可以配置成外部中断/事件方式EXTI
  • 每个中断/事件都有独立的触发和屏蔽,触发请求可以是上升沿、下降沿或者双边沿触发

  • 每个外部中断都有对应的悬起标志,系统可以查询悬起标志响应触发请求,也可以在中断允许时以中断方式响应触发请求

  • 系统默认的外部中断输入线EXTI0-15是PA0-15,可以通过AFIO的EXTI控制寄存器(AFIO_EXTICR1-4)配置成其他GPIO引脚(访问EXTI控制寄存器时必须先使能AFIO时钟)

  • 另外四个EXTI线的连接方式为:

        EXTI16连接到PVD中断

        EXTI17连接到RTC闹钟中断

        EXTI18连接到USB唤醒中断

        EXTI19连接到以太网唤醒中断

  • EXTI通过6个寄存器进行操作

  • EXTI的2级中断控制

  • 按键中断初始化程序段
RCC->APB2ENR |= 1;             //开启AFIO时钟

AFIO->EXTICR[2] |= 0x0011;     //EXTI9=PB.9,EXTI8=PB.8

EXTI->IMR |= 0x0300;           //允许EXTI9和EXTI8中断

EXTI->FTSR |= 0x0300;          //EXTI9和EXTI8下降沿触发

NVIC->ISER[0] |= 1<<23;        //允许EXTI9-8中断
  • 按键中断处理子程序
void EXTI9_5_IRQHandler(void)
{
    if(EXTI->PR & 1<<8 )         //KEY1按下(PR.8=1)
        flag = 0;

    if(EXTI->PR & 1<<9 )         //KEY2按下(PR.9=1)
        flag = 1;

    EXTI->PR |= 0x0300;         //清除中断触发请求
}
  • 对比按键处理的查询和中断实现方法可以看出:中断实现方法的初始化子程序有些复杂
  • 处理子程序的主要区别是:查询处理Key_Proc()判断的是GPIOB->IDR(电平),中断处理EXTI9_5_IRQHandler()判断的是EXTI->PR(边沿)

8.3 USART中断

  • USART的2级中断控制

  • USART中断初始化程序段
USART->CR1 |= 1<<5;         //允许RXNE中断

NVIC->ISER[1] |= 1<<5;      //允许USART1全局中断
  • USART中断处理子程序
void USART1_IRQHandler(void)

8.4 TIM中断

  • TIM的2级中断控制

  • TIM1中断初始化程序段
TIM1->DIER |= 1;             //允许更新中断

NVIC->ISER[0] |= 1<<25;      //允许TIM1更新中断
  • TIM1中断处理子程序
void TIM1_UP_IRQHandler(void)
  • TIM2中断初始化程序段
TIM2->DIER |= 6;             //允许捕获/比较2-1中断

NVIC->ISER[0] |= 1<<28;      //允许TIM2全局中断
  • TIM2中断处理子程序
void TIM2_IRQHandler(void)

8.5 ADC中断

  • ADC的2级中断控制

  • ADC中断初始化程序段
ADC1->CR1 |= 1<<5;             //允许转换结束中断

ADC1->CR1 |= 1<<7;             //允许注入通道转换结束中断

NVIC->ISER[0] |= 1<<18;        //允许ADC1和ADC2全局中断
  • ADC中断处理子程序
void ADC_IRQHandler(void)

猜你喜欢

转载自blog.csdn.net/SherlockHolmess/article/details/87990538