尝试使用CubeMX做stm32开发之七:NVIC配置

一、配置参数

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()实现。
表1:优先级分组真值表
优先级分组主优先级次优先级描述
NVIC_PriorityGroup_000~15主-0bit,子-4bit
NVIC_PriorityGroup_10~10~7主-1bit,子-3bit
NVIC_PriorityGroup_20~30~3主-2bit,子-2bit
NVIC_PriorityGroup_30~70~1主-3bit,子-1bit
NVIC_PriorityGroup_40~150主-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 */
}

 三、小结

        中断的配置并不复杂,但前提是首先要完成相应外设功能的配置,否则无法显示相应外设的中断,也就无法进行配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forster-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值