RT-Thread 外设中断优先级设置多少合适?

发布于 2021-04-30 15:21:34

在使用STM32F429 阿波罗开发板。 使用 UART2 。 执行官方UART中断接收和轮询发送例程。设置UART2 为中断接收,轮询发送。发现它并不能工作。
参考文档https://docs.rt-thread.org/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart
最后,经过单步调试。发现问题是,出现在UART2 的RX和TX没有进行硬件初始化。
HAL_UART_MspInit 加入了一些代码。 就OK了。但是,我对与USART2 中断优先级的设定有些问题。 我的问题是, 对于USART2 中断优先级设置成多少,不会影响OS的正常运行。现在我的软件系统用到的外设是 timerusart2 ,将来可能会用到 LCD 触摸屏

 void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(huart->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspInit 0 */
      

  /* USER CODE END USART1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();
  
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART1 GPIO Configuration    
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
  /* USER CODE BEGIN USART1_MspInit 1 */

  /* USER CODE END USART1_MspInit 1 */
  }
  // !!! ADD NEW CODE HERE 
    else if(huart->Instance==USART2) 
    {
        __HAL_RCC_USART2_CLK_ENABLE();
  
                __HAL_RCC_GPIOA_CLK_ENABLE();
                /**USART1 GPIO Configuration    
                PA2     ------> USART2_TX
                PA3    ------> USART2_RX 
                */
                GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_PULLUP;
                GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
                HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
            
                /* USART2 interrupt Init */
                /*Set priority ? How much is appropriate*/
                //HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
                //HAL_NVIC_EnableIRQ(USART2_IRQn);
                
    }

}

查看更多

关注者
0
被浏览
86
mii
mii 2021-04-30

这一部分涉及到您程序整体设计,但应当注意中断中不要操作过于复杂的逻辑。其实通常默认优先级也满足平常需求,除非你要求该中断要有最优先的实时响应,可以调整为最优先。

3 个回答
flashman2002
flashman2002 2021-04-30

如果是st的系列芯片,其管脚初始化的代码会自动生成,你不必为此操心。

cxhxy12345
cxhxy12345 2021-04-30

建议你uart的中断优先级要比定时器高,如果你的定时器不是要求很高精度的情况下。但也要看你的uart串口运行允许的最高波特率是多少,如果波特率是9600或则19200则中断优先级都无所谓。但如果波特率上M了,就要考虑这个问题了。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览