【发布时间】:2019-01-13 03:10:14
【问题描述】:
我一直在尝试使用 STMCubeMX 4.26.0 版生成的 HAL 框架代码在 STM32F4 板上实现基本的每字节 UART Rx 中断
很简单 - 我想通过 Rx 中断在 UART1 中接收一个字符并在 UART 6 上传输它
我已经成功实现了我想要实现的投票版本
uint8_t in_usart1[10];
HAL_StatusTypeDef usart1_status;
usart1_status = HAL_UART_Receive(&huart1, in_usart1, 1, 1);
if (usart1_status != HAL_TIMEOUT)
{
HAL_UART_Transmit(&huart6, in_usart1, 1, 100);
}
我已在 STMCubeMX 中启用了 UART 1 NVIC 中断,并且 stm32f4xx_it.c 包含我已将自己的用户处理程序添加到的 IRQ 处理程序:
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 */
HAX_USART1_IRQHandler(&huart1); /* My Handler */
/* USER CODE END USART1_IRQn 1 */
}
我看过很多关于 UART_Receive_IT() 的评论 - 但我怀疑这是基于旧版本的 HAL,因为 UART_Receive_IT() 在 stm32f4xx_hal_uart.c 中定义
我的怀疑是我需要启用中断/清除中断标志,因为我在调试时,永远不会调用 USART1_IRQHandler()
有没有人有任何代码来演示我想要实现的目标?我的 google-foo 让我失望了
编辑: 我已经更接近了...在 main.c 我添加了(cmets 是现有代码)
/* USER CODE BEGIN PV */
uint8_t rx_buffer;
/* USER CODE END PV */
...
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, (uint8_t *)rx_buffer, 10);
/* USER CODE END 2 */
然后创建:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1)
{
HAL_UART_Transmit(&huart6, &rx_buffer, 1, 100);
}
}
现在 Rx 中断被触发 - 但它在 USART6 Tx 上有点不稳定,并且 Rx 中断只被触发一次
【问题讨论】: