STM32L011 无法在 rx 模式下设置 USART

问题描述

我使用的是 STM32L011K4T6。我想接收来自 USART2 的命令并从该命令执行特定操作。应忽略不是该命令的数据。

我的问题是我在 USART 上没有收到任何数据。永远不会调用 RxCallback 函数。 RDR 寄存器中从未显示任何数据,所以我认为 HAL_UART_Receive_IT 的行为不像我认为的那样(将 usart 设置为 rx 模式并设置 RX 中断)。

    UartHandle.Instance = USART2;
    UartHandle.Init.Baudrate = 9600;
    UartHandle.Init.WordLength = UART_WORDLENGTH_9B;
    UartHandle.Init.StopBits = UART_STOPBITS_1;
    UartHandle.Init.Parity = UART_PARITY_EVEN;
    UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    UartHandle.Init.Mode = UART_MODE_TX_RX;

    if (HAL_UART_DeInit(&UartHandle) != HAL_OK) {
        Error_Handler();
    }
    if (HAL_UART_Init(&UartHandle) != HAL_OK) {
        Error_Handler();
    }

//Set USART in RX mode
    if (HAL_UART_Receive_IT(&UartHandle,(uint8_t*) g_commandReceived,2)
            != HAL_OK) {
        Error_Handler();
    }

while (1) {
    if (STATE == 0x01) {
    //Open LED,and go back to waiting for a command

       BSP_LED_On(LED3);
       memset(g_commandReceived,0x00,sizeof(g_commandReceived));
       if (HAL_UART_Receive_IT(&UartHandle,2) != HAL_OK) {
        Error_Handler();}
      STATE = 0x00;}
}


   
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) {
   if (UartHandle->Instance == USART2) {
        if ((g_commandReceived[0] == 0x31) && (g_commandReceived[1] == 0x32)) {
            STATE = 0x01;
    }
  }
}

我尝试先发送数据,然后再接收数据,结果奇怪地按预期工作。

if (HAL_UART_Transmit_IT(&UartHandle,(uint8_t*) MyMessege,0x08)
            != HAL_OK) {
        Error_Handler();
    }

while (UartReady != SET) {
}
UartReady = RESET;

/*Put UART peripheral in reception process ###########################*/

if (HAL_UART_Receive_IT(&UartHandle,(uint8_t *) aRxBuffer2,8) != HAL_OK) {
Error_Handler();}

我通常使用自定义 HAL 包,所以我不太了解这个函数是如何工作的。

解决方法

我假设您正在寻找的是一种通过 USART 为任何接收到的消息引发中断的方法。

为了使中断与 STM HAL 函数一起工作,通常采用以下方法:

  1. 确保在 NVIC 中启用中断,
  2. 通过HAL_UART_Receive_IT从外设启用中断生成,
  3. 编写一个中断服务例程,其名称与启动程序集文件中定义的名称相匹配。对于 USARTx (x=1,2,..) 它将是 USARTx_IRQHandler

如果缺少这些步骤之一,那么它很可能不起作用。在外设级别 (HAL_UART_Receive_IT) 启用中断生成是不够的,因为如果在 NVIC 级别未启用该中断,NVIC 将不会跳转到 ISR。