|
STM32F4 HAL,串口IDLE接收空闲中断+DMA------波特率1200,数据接收错误;
PS:把MX_USART1_UART_Init函数中程序默认波特率设置改为2400、115200,串口助手调试通信正常。
程序如下:
初始化函数如下:
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 1200; //波特率
huart1.Init.WordLength = UART_WORDLENGTH_8B; //字长为9位数据格式
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE; //校验位
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
//DMA接收函数(启动DMA接收),此句一定要加,不加接收不到第一次传进来的实数据,是空的,且此时接收到的数据长度为缓存器的数据长度
HAL_UART_Receive_DMA(&huart1,USART1_RE.Data_BUFF2,BUFFER_SIZE);
}
中断处理如下:
void USART1_IRQHandler(void)
{
uint32_t tmp_flag = 0;
uint32_t temp;
tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位
if((tmp_flag != RESET))//idle标志被置位
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
//temp = huart1.Instance->SR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
//temp = huart1.Instance->DR; //读取数据寄存器中的数据
//这两句和上面那句等效
HAL_UART_DMAStop(&huart1); // 停止DMA传输,防止
temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 获取DMA中未传输的数据个数
//temp = hdma_usart1_rx.Instance->NDTR;// 读取NDTR寄存器,获取DMA中未传输的数据个数,
USART1_RE.Data_Num = BUFFER_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
//一帧数据接收完成
USART1_RE.END_FG = 1;
}
/* USER CODE BEGIN USART2_IRQn 0 */
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
主函数如下:
......
if((USART1_RE.END_FG))
{
USART1_RE.END_FG = 0;
HAL_UART_Transmit_IT(&huart1, USART1_RE.Data_BUFF2, USART1_RE.Data_Num);//自收自发
while (huart1.gState != HAL_UART_STATE_READY)//test 20230103 发送未完成:延时1毫秒,等待发送完成
{
HAL_Delay(1);//延时
}
for(uint8_t i = 0;i <= USART1_RE.Data_Num; i++)
USART1_RE.Data_BUFF2 = 0;
USART1_RE.Data_Num = 0;
HAL_UART_Receive_DMA(&huart1,USART1_RE.Data_BUFF2,BUFFER_SIZE);//重新打开DMA接收
}
测试如下:
|
-
波特率1200测试图
|