STM32L011 无法在 rx 模式下设置 USART
Posted
技术标签:
【中文标题】STM32L011 无法在 rx 模式下设置 USART【英文标题】:STM32L011 cannot set USART in rx mode 【发布时间】:2021-04-25 16:30:46 【问题描述】:我正在使用 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, (uint8_t*) g_commandReceived,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 包,所以我不太了解这个功能是如何工作的。
【问题讨论】:
【参考方案1】:我假设您正在寻找的是一种通过 USART 为任何接收到的消息引发中断的方法。
要让中断与 STM HAL 函数一起工作,通常是这样的方法:
-
确保在 NVIC 中启用了中断,
通过
HAL_UART_Receive_IT
启用外设的中断生成,
编写一个名称与启动程序集文件中定义的名称匹配的中断服务程序。对于 USARTx (x=1,2,..),它将是 USARTx_IRQHandler
如果缺少其中一个步骤,则很可能无法正常工作。在外设级别启用中断生成 (HAL_UART_Receive_IT
) 是不够的,因为如果未在 NVIC 级别启用中断,NVIC 将不会跳转到 ISR。
【讨论】:
以上是关于STM32L011 无法在 rx 模式下设置 USART的主要内容,如果未能解决你的问题,请参考以下文章
Stm32L151RCxxx USART 挂起问题,同时基于中断的 TX/RX
STM32Cube STM32L053闹钟唤醒LL库和HAL库