最近在使用STM32F103单片机进行串口接收处理不定长数据测试时有两个需求。1、需要接收不定长的数据。2、提高串口响应速度。
一直看过很多贴子关于串口+DMA+完成中断的用法,但是没有找到合适的。参考了很多资料自己整理一份程序代码,供大家参考。
软件链接:https://download.csdn.net/download/shaozp529/11573556
软件设计思路:
接收函数串口接收映射到对应的DMA通道上,串口初始化时需要将串口完成中断打开,当串口接收的一组数据后,在中断中处理DMA接收数据,并获取接收的数据长度,最终在主函数中进行串口数据解析。这样串口不会频繁进中断
发送函数串口发送映射到对应的DMA通道上,DMA对应的通道的DMA中断也打开,DMA发送完毕之后触发DMA发送完成中断,在中断中需要反转485使能引脚。详细参考代码。
软件资源已上传到我的账户上:但是资源链接暂时无法上传,可以在我账户下发寻找。
串口初始化函数:
/**************************************************************************************
*【函 数 名】:void USART1_RS4851_Configuration(void)
*【功 能】:串口1配置用于485与上位机通讯
*【接口变量】:无
*【内部变量】:无
*【返 回 值】:无
*【撰 写 人】:邵志鹏 撰写日期:2017年10月25日
*【修 改 人】: 修改日期: 修改原因:
**************************************************************************************/
void USART1_RS485_Configuration(void)
{
/*串口中断源优先级 和DMA中断优先级在main函数初始化函数中集中处理*/
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 配置USART1-TX脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 配置USART1-RX脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_R/D PA11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP