STM32 DMA+IDLE实现不定长数据接收

#步骤如下
1.打开STM32cubemx,我的版本号是4.27.0,新建工程,选择芯片,例如STM32F103R8T6
2.左侧使能串口1,sys那里选择serial wire,否则导致后面无法下载程序,配置时钟,使能串口中断
3.在configuration页面配置DMA,如下所示
在这里插入图片描述
4.点击生成代码,在keil打开,在HAL_UART_IRQHandler(&huart1);前面添加 UsartReceive_IDLE(&huart1);此函数实现如下:
void UsartReceive_IDLE(UART_HandleTypeDef *huart)//IDLE接收数据
{
uint32_t temp;

if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))
{
    __HAL_UART_CLEAR_IDLEFLAG(&huart1);
    HAL_UART_DMAStop(&huart1);
    temp = huart1.hdmarx->Instance->CNDTR;
    UsartType.RX1_Size =  RX_LEN - temp;
    UsartType.RX_flag=1;
    HAL_UART_Receive_DMA(&huart1,(uint8_t *)UsartType.RX1_pData,RX_LEN);
}

}
在主程序前面使能DMA接收,使能串口中断,main里面轮询flag就行,数据分析判断,清除flag

参考以下文章:
http://www.firebbs.cn/thread-24555-1-1.html
http://www.firebbs.cn/thread-23695-1-1.html
http://www.waveshare.net/study/article-644-1.html

发布了24 篇原创文章 · 获赞 1 · 访问量 1826

猜你喜欢

转载自blog.csdn.net/qq_27182175/article/details/101287413