0

我是 USART 通信的新手,如果我问了一个愚蠢的问题,请原谅我。

我正在使用 STM32F0discovry 板和使用 IAR EWARM 的代码。我的主要功能是这样的。我在 main 函数之后还有一个 HAL_UART_RxCpltCallback 函数。

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  NVIC_EnableIRQ(USART1_IRQn);
  //HAL_UART_Receive_IT(&huart1,buffer,1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
   
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    //HAL_UART_Receive(&huart1,buffer2,10); // unit: milli second
    HAL_UART_Receive_IT(&huart1,buffer,1); // unit: milli second
    HAL_Delay(100);
    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0))
    {
      HAL_UART_Transmit(&huart1,buffera,1,100);
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET);
    }
  }
  
  /* USER CODE END 3 */
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
   if(buffer[0] == 'a' )
    {
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
    }
    else if(buffer[0] == 'b' )   
    {
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8);
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
    }
    else if(buffer[0] == 'c' )   
    {
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
    }
   //HAL_UART_Receive_IT(&huart1,buffer,1); // unit: milli second
}

我正在阅读一些教程,想知道是否应该将我的函数放在 USART1_IRQHandler 函数中。

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 */
}

还是应该将我的代码放在 HAL_UART_RxCpltCallback 函数中?我很困惑,感谢您花时间阅读本文!

4

1 回答 1

0

void USART1_IRQHandler(void)是触发 USART1 IRQ 时由 CPU 执行的实际中断处理程序。它通过调用将实际工作委托给 STM32 HAL HAL_UART_IRQHandler(&huart1);

HAL_UART_IRQHandler是所有 UART 中断的通用 IRQ 处理程序,这就是为什么它需要一个 UART 句柄,以便知道是什么 UART 触发了中断。

通过HAL_UART_IRQHandler查询触发中断的 UART 的实际状态位来确定实际发生了什么事件。基于此,它调用实际的处理函数。

然后处理函数执行实际工作。如果您开始接收并且已收到所有请求的字节,它将调用HAL_UART_RxCpltCallback.

在那里,您应该检查是否为您期望的 UART 调用了该函数,然后您可以处理数据。

有许多这样的回调函数,可以在 HAL 的文档中找到。

于 2021-01-06T09:42:28.293 回答