STM32F051空闲中断实现串口不定长数据接收
- 目的
- 编程软件
- 配置串口开中断
- 中断程序
- 运行结果
- 碰到的问题
目的
在串口输入不定长数据时,通过串口空闲中断来断帧接收数据。
编程软件
STM32CubeIDE
STM32CubeMX配置MCU。通过对端口配置,自动生成程序,减少编程量。
配置串口开中断
配置串口打开中断有两条指令,可以将这两条指令放在:
static void MX_USART1_UART_Init(void)下面,注意,还是要放在用户代码段,这样再重新生成C/C++软件时不会被清除。
/* USER CODE BEGIN USART1_Init 2 */
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);//接收中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//空闲中断
/* USER CODE END USART1_Init 2 */
中断程序
在stm32f0xx_it.c文件下找到void USART1_IRQHandler(void),在其中的用户代码段中添加:
/* USER CODE BEGIN USART1_IRQn 0 */
//接收中断
uint8_t rxData = 0;
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
{
HAL_UART_Receive(&huart1, &rxData, 1, 1000);
if(Cnt < 256)
{
rx_buff[Cnt] = rxData;
Cnt++;
}
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE);
}
// 空闲中断
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET)
{
//一帧数据接收完成
USART1_IdleCallback(rx_buff, Cnt);
Cnt = 0;
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
}
/* USER CODE END USART1_IRQn 0 */
// 此处是原来已经有的程序,保留:
HAL_UART_IRQHandler(&huart1);
接着在这一部分的程序下面添加回调函数:
/* USER CODE BEGIN 1 */
//回调函数
void USART1_IdleCallback(uint8_t *pData,uint16_t len)
{
while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC) != SET);
HAL_UART_Transmit(&huart1, pData, len, 1000);
}
/* USER CODE END 1 */
这一部分执行将串口输入的数据回显输出到串口。
运行结果
碰到的问题
当波特率为2.5Mbps时,问题就出现了,发送字符没有问题,但设备返回的字节用中断和空闲接收都不起作用了。用定长接收,收到一定的次数就会停止,不接收了,但监视看字节还是在进行,只是我们的接收停止了。哪位高手能指点一下。谢谢!