一、配置参数
Priority Group:
- stm32f103使用了4位中断优先级设置,一共可实现16个可编程的优先等级。
- 优先级的配置需要使用NVIC,即嵌套向量中断控制器。NVIC控制着整个芯片中断相关的功能,跟内核紧密耦合,是内核里面的一个外设。
- 在具体配置时一般只用ISER、ICER和IP这3个寄存器,其中ISER用于使能中断,ICER用于清除中断,IP用于设置中断优先级。
- 用于表达优先级分组的寄存器NVIC_IPRTx宽度为8位,但是f103只使用其中高4位。
- 这4位又被分为抢占优先级和次优先级两组。多个中断同时响应时,抢占优先级高的就会先于抢占优先级低的执行;如果抢占优先级相同,就比较子优先级;如果子优先级也相同,就比较它们的硬件中断编号,编号越小优先级越高。
- 优先级的分组由内核外设SCB的应用程序中断及复位控制寄存器AIRCR的PRIGROUP[10:8]位决定。实际配置时程序中通过调用库函数NVIC_PriorityGroupConfig()实现。
优先级分组 | 主优先级 | 次优先级 | 描述 |
NVIC_PriorityGroup_0 | 0 | 0~15 | 主-0bit,子-4bit |
NVIC_PriorityGroup_1 | 0~1 | 0~7 | 主-1bit,子-3bit |
NVIC_PriorityGroup_2 | 0~3 | 0~3 | 主-2bit,子-2bit |
NVIC_PriorityGroup_3 | 0~7 | 0~1 | 主-3bit,子-1bit |
NVIC_PriorityGroup_4 | 0~15 | 0 | 主-4bit,子-0bit |
CubeMX中的Priority Group共有5个选项,与上面表格中的配置相对应,该选项配置完毕后,再在NVIC Interrupt Table中对各中断优先级分别进行配置。
0 bits for pre-emption priority 4 bits for subpriority
1 bits for pre-emption priority 3 bits for subpriority
2 bits for pre-emption priority 2 bits for subpriority
3 bits for pre-emption priority 1 bits for subpriority
4 bits for pre-emption priority 0 bits for subpriority
NVIC Interrupt Table:
- f103在内核上搭建了一个异常响应系统,支持10个系统异常和外部中断,这部分一般不需要开发者进行配置
Non maskable interrupt:不可屏蔽中断。RCC时钟安全系统(CSS)连接到NMI向量
Hard fault interrupt:所有类型的错误
Memory management fault:存储器管理
Prefetch fault, memory access fault:预取指失败,存储器访问失败
Undefined instruction or illegal state:未定义的指令或非法状态
System service call via SWI instruction:通过SWI指令调用的系统服务
Debug monitor:调试监控器
Pendable request for system service:可挂起的系统服务
Time base: System tick timer:系统嘀嗒定时器
- 按照程序功能需要,主要配置两个中断
DMA1 channel1 global interrupt:用于ADC采样数据处理
USART1 global interrupt:用于接收串口数据
二、生成代码
/* USART1 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
/* DMA interrupt init */
/* DMA1_Channel1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
void DMA1_Channel1_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
/* USER CODE END DMA1_Channel1_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_adc1);
/* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
/* USER CODE END DMA1_Channel1_IRQn 1 */
}
/**
* @brief This function handles USART1 global interrupt.
*/
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
三、小结
中断的配置并不复杂,但前提是首先要完成相应外设功能的配置,否则无法显示相应外设的中断,也就无法进行配置。