在STM32H7上接收IrDA报文
Receiving IrDA message on STM32H7
我正在尝试在带有 HAL 驱动程序的 STM32H7 板上以 IrDA 模式使用 USART 接收一些数据。
我在 gpio 引脚上得到了预期的回复(波特率、逻辑和时序都正常)但是由于某种原因数据从未移动到 USART 的 RDR 寄存器并且当我尝试读取时我只是在第一次尝试时得到零,然后超时(轮询模式)。
填充 IRDA 句柄结构后,我调用 HAL_IRDA_DeInit()
和 HAL_IRDA_Init()
。我在 HAL_IRDA_MSP_Init()
中配置 GPIO 并发送到达目标的第一条消息(使用 HAL_IRDA_Transmit()
)。然后目标发送一个回复,我可以在 UART_RX pin 上查看。在这里发生了一些事情……或者更好的是没有发生。如果我用 HAL_IRDA_Receive()
(一次 1 个字节)读取 UART,我只得到零然后超时。
IRDA_HandleTypeDef hirda4;
void vIrdaInit(void)
{
hirda.Instance = USART3;
hirda.Init.BaudRate = 60100;
hirda.Init.WordLength = IRDA_WORDLENGTH_9B;
hirda.Init.Parity = IRDA_PARITY_NONE;
hirda.Init.Mode = IRDA_MODE_TX_RX;
hirda.Init.Prescaler = 1;
hirda.Init.PowerMode = IRDA_POWERMODE_NORMAL;
/* Initialize the IRDA registers. Here also HAL_IRDA_MspInit() will be called */
if (HAL_IRDA_Init(&hirda4) != HAL_OK)
{
Error_Handler();
}
}
/* Initialize IrDA low level resources. This function is called by HAL_IRDA_Init() */
void HAL_IRDA_MspInit(IRDA_HandleTypeDef* irdaHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(irdaHandle->Instance==USART3)
{
/* UART4 clock enable */
__HAL_RCC_USART3_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**UART4 GPIO Configuration
PB10 ------> USART3_RX
PB11 ------> USART3_TX
*/
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF7_UART3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
}
此处调用 HAL_IRDA_Transmit()/HAL_IRDA_Receive():
if(HAL_IRDA_Transmit(&hirda (uint8_t*)TxBuf, sizeof(RxBuf), 5000)!= HAL_OK)
{
Error_Handler();
}
memset(RxBuf, '[=12=]', sizeof(RxBuf));
for (i = 0; i < 8; i++)
{
// blocks here until timeout or data
if(HAL_IRDA_Receive(&hirda, (uint8_t*)RxBuf, 1, 500)!= HAL_OK)
{
Error_Handler();
}
}
第一次进入循环时,我提升了 RXNE 标志,但在 RDR 中只有 0。以下迭代总是导致超时(来自 IRDA_WaitOnFlagUntilTimeout()
)。我不知道去哪里看...我接收到的脉冲大于周期的 3/16,电平还可以,但似乎我无法通过 SIR 接收解码器和数据寄存器获取消息。
更新: 这里是接收信号的截图:
波特率很好,存在起始位和停止位,消息(9 位)就是我在等待的内容。但不被解码器识别并传递给UART。
在调用 init 函数之后添加一个 1 字节的虚拟读取让我成功读取了一次而没有超时。问题是在那之后,Receive()
函数再次启动到 return 超时。我能找到的唯一解决方法是在调用 Receive()
函数之前重新初始化 UART。这允许我检索完整的消息。它很草率,但它确实有效。
我试图找到发生变化的寄存器,但无法找出导致问题的原因。
我正在尝试在带有 HAL 驱动程序的 STM32H7 板上以 IrDA 模式使用 USART 接收一些数据。
我在 gpio 引脚上得到了预期的回复(波特率、逻辑和时序都正常)但是由于某种原因数据从未移动到 USART 的 RDR 寄存器并且当我尝试读取时我只是在第一次尝试时得到零,然后超时(轮询模式)。
填充 IRDA 句柄结构后,我调用 HAL_IRDA_DeInit()
和 HAL_IRDA_Init()
。我在 HAL_IRDA_MSP_Init()
中配置 GPIO 并发送到达目标的第一条消息(使用 HAL_IRDA_Transmit()
)。然后目标发送一个回复,我可以在 UART_RX pin 上查看。在这里发生了一些事情……或者更好的是没有发生。如果我用 HAL_IRDA_Receive()
(一次 1 个字节)读取 UART,我只得到零然后超时。
IRDA_HandleTypeDef hirda4;
void vIrdaInit(void)
{
hirda.Instance = USART3;
hirda.Init.BaudRate = 60100;
hirda.Init.WordLength = IRDA_WORDLENGTH_9B;
hirda.Init.Parity = IRDA_PARITY_NONE;
hirda.Init.Mode = IRDA_MODE_TX_RX;
hirda.Init.Prescaler = 1;
hirda.Init.PowerMode = IRDA_POWERMODE_NORMAL;
/* Initialize the IRDA registers. Here also HAL_IRDA_MspInit() will be called */
if (HAL_IRDA_Init(&hirda4) != HAL_OK)
{
Error_Handler();
}
}
/* Initialize IrDA low level resources. This function is called by HAL_IRDA_Init() */
void HAL_IRDA_MspInit(IRDA_HandleTypeDef* irdaHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(irdaHandle->Instance==USART3)
{
/* UART4 clock enable */
__HAL_RCC_USART3_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**UART4 GPIO Configuration
PB10 ------> USART3_RX
PB11 ------> USART3_TX
*/
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF7_UART3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
}
此处调用 HAL_IRDA_Transmit()/HAL_IRDA_Receive():
if(HAL_IRDA_Transmit(&hirda (uint8_t*)TxBuf, sizeof(RxBuf), 5000)!= HAL_OK)
{
Error_Handler();
}
memset(RxBuf, '[=12=]', sizeof(RxBuf));
for (i = 0; i < 8; i++)
{
// blocks here until timeout or data
if(HAL_IRDA_Receive(&hirda, (uint8_t*)RxBuf, 1, 500)!= HAL_OK)
{
Error_Handler();
}
}
第一次进入循环时,我提升了 RXNE 标志,但在 RDR 中只有 0。以下迭代总是导致超时(来自 IRDA_WaitOnFlagUntilTimeout()
)。我不知道去哪里看...我接收到的脉冲大于周期的 3/16,电平还可以,但似乎我无法通过 SIR 接收解码器和数据寄存器获取消息。
更新: 这里是接收信号的截图:
波特率很好,存在起始位和停止位,消息(9 位)就是我在等待的内容。但不被解码器识别并传递给UART。
在调用 init 函数之后添加一个 1 字节的虚拟读取让我成功读取了一次而没有超时。问题是在那之后,Receive()
函数再次启动到 return 超时。我能找到的唯一解决方法是在调用 Receive()
函数之前重新初始化 UART。这允许我检索完整的消息。它很草率,但它确实有效。
我试图找到发生变化的寄存器,但无法找出导致问题的原因。