本文主要是介绍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.8EXTI->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)
这篇关于8. 嵌套向量中断控制器NVIC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!