STM32 系统中,中断优先级分为抢占优先级(Group Priority)和响应优先级(Subpriority)。抢占优先级不同时,高的可以打断低的;抢占优先级相同,响应优先级不同时,不可打断;若两优先级均相同,已先响应到达时间早的中断。
抢占优先级和响应优先级通过 NVIC_PriorityGroupConfig 函数进行设置,本质上是对 SCB_AIRCR 寄存器中的 PRIGROUP 字段进行设置。
PRIGROUP
而具体的每种向量的中断优先级,以及某些系统错误的中断优先级,可以在 NVIC->IPR 寄存器和 SCB->PRI_N 寄存器中设置。
下图是 STM32 中各个中断的具体信息。
向量中断表
通过 NVIC_InitTypeDef 类和 NVIC_Init() 函数,可以对每个中断的优先级及使能等信息进行设置,下图为对 USART 中断进行设置。
中断设置
NVIC_Init()函数,本质上是对 NVIC->ICER、NVIC->ISER 和 NVIC->IPR 寄存器进行设置,其中 ICER 和 ISER 共同控制使能或失能中断,当 ISER 置 1 时,ICER 对应位会置 0,反之同理。NVIC 寄存器如下图所示。
NVIC
USART 中断同样有多种中断组成,如下图所示。
USART中断
通过 USART_ITConfig()函数对 USART 中不同中断使能,本质上是对 USART 的 CR1、CR2、CR3 寄存器进行配置。
以接收中断 RXNEIE 为例:
- 首先,通过 USART_ITConfig()函数将 USART->CR1 中的 RXNEIE 位置 1,允许产生中断。
- 当 USART->DR 寄存器接收到数据时,USART->SR 寄存器中 RXNE 位被硬件置 1,产生中断。
- 进入中断处理程序,读出数据,自动或手动清理标志位。
另外,通过 USART_InitTypeDef类、USART_ClockInitTypeDef类、USART_Init()等函数能够对基本的 USART 串口参数进行配置,本质好像同样是对 USART 的 CR1、CR2、CR3、BRR 等寄存器进行设置,以后有时间试更多的东西再说。
网友评论