STM32单片机多串口通信仿真测试技术研究
2015-06-13郭勇,何军
郭 勇,何 军
(南京北方信息控制集团有限公司产品研发中心,江苏南京211153)
0 引言
STM32单片机是基于高性能Cortex-M3内核的32位单片机,外设功能强大,最大工作频率72MHz。本文选用的STM32103VET6芯片,有多达5个USART、3个SPI口和2个I2C口,便于产品与上位机的通信。采用基于库函数的编程方法,能很快地进行产品开发。目前公开的文献没有提及无硬件平台情况下对STM32进行多串口调试的方法,部分文献有介绍用虚拟串口仿真51单片机,但没有提及怎样仿真串口接收通信的情况[1-3]。本文采用基于RealView MDK、VSPD(虚拟串口)和串口调试软件的联合仿真调试技术,可以在没有硬件平台的情况下,完成多串口收发通信软件的开发和测试。
1 多串口通信的软件设计原理
软件流程图如图1所示。
图1 软件流程
本文使用的STM32芯片有多达5个USART,使用其中的3个USART(USART1~USART3)。在不进行管脚重映射的情况下,USART1_Tx管脚为PA9,USART1_Rx管脚为 PA10,USART2_Tx管脚为PA2,USART2_Rx管脚为 PA3,USART3_Tx管脚为PB10,USART3_Rx管脚为PB11。软件的设计采用模块化,包括RCC时钟配置模块,NVIC中断向量配置模块,USART1~USART3管脚配置模块、USART1~USART3初始化模块,USART1~USART3通信模块等。
1.1 RCC时钟设置模块
采用8 MHz外部晶振作为PLL时钟,再倍频到72 MHz。该时钟作为系统时钟,待系统时钟稳定后,再进行各模块时钟的分配[4]。时钟初始化模块部分代码如下:
/*使能串口1时钟,及管脚GPIOA的时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);∥使能串口2时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);/* 使能串口3引脚GPIOB的时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);∥使能串口3时钟
1.2 UASRT通信管脚配置模块
STM32单片机功能管脚由GPIO管脚进行映射,这里仅给出USART1_Tx和USART1_Rx管脚配置的软件代码,USART2和 USART3的管脚配置类似[5]。
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
∥IO口的第九脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
∥IO口的速度
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
∥IO口复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
∥初始化USART1的TX口
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
∥IO口的第十脚
GPIO_InitStructure.GPIO_Mode=
GPIO_Mode_IN_FLOATING;∥IO口悬空输入
GPIO_Init(GPIOA,&GPIO_InitStructure);
∥初始化USART1的RX口
1.3 NVIC中断向量模块的配置
NVIC是中断向量控制器,用来控制多个中断向量的优先级,在NVIC中设置USART1中断为最高优先级,USART2次之,USART3中断优先级最低。本文设置发送为顺序发送,接收为中断响应接收[6]。代码如下:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_DeInit();
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
∥使能USART1中断
NVIC_InitStructure.NVIC_IRQChannel=
USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQChannel;∥使能USART2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQChannel;∥使能USART3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
USART1~USART3的抢占优先级相同,USART1的从优先级值最小,所以USART1的优先级别最高。
1.4 USART的通信配置模块
采用全双工通信,对USART1进行配置,USART1的波特率115 200 bit/s,数据位8位,停止位1位,无校验位,无流量控制,接收、发送使能,采用接收中断方式,USART2和USART3的配置类似。
USART_InitTypeDef USART_InitStructure;
“互联网+”与传统产业的协同融合是通过运用移动互联、云计算、大数据、物联网等互联网信息技术对农业、工业、服务业等产业链各环节进行渗透和嵌入,通过提高产业技术水平,创造新业态、新商业流程、新商业模式,实现产业链上下游的垂直合作或行业间的横向整合。同时,产业协同融合过程中还能够创新产业价值链模式,创新后的价值链接节点融合了互联网产业价值,与原产业相比,融合产业带来了更高的附加值以及更大的利润空间。总体来说,凭借“互联网+”信息技术进行的产业融合,能够提高产业技术水平以及产业附加值,能够实现传统产业结构优化升级目标,核心内涵见图1。
USART_InitStructure.USART_BaudRate=115200;
∥设定传输速率
USART_InitStructure.USART_WordLength=USART_WordLength_8b;∥设定8位数据位
USART_InitStructure.USART_StopBits=USART_StopBits_1;∥设定1个停止位
USART_InitStructure.USART_Parity=USART_Parity_No;∥无校验位
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;∥使用发送和接收功能
∥初始化USART1
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);∥使能USART1接收中断
USART_Cmd(USART1,ENABLE);∥使能 USART1
1.5 USART的中断接收模块
在该中断响应函数中,当USART1接收事件完成时,产生中断信号,通知微处理器进行串口通信的接收处理[7,8]。
void USART1_IRQHandler(void)
{
static unsigned char rx1_num;
unsigned char temp_rx;
if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)∥如果是接收中断
{
uart1_rx[rx1_num]=temp_rx;
}
rx1_num++;∥静态变量,记录USART1接收数据的个数
}
当USART2和USART3产生接收中断时,进入相应的中断函数进行处理。
2 虚拟串口和仿真串口的绑定
传统的USART调试必须有相应的开发板,连接开发板的串口和上位机的串口,开发软件RealView MDK在调试时,有3个串口的仿真输出窗口UART#1,UART#2,UART#3,但这3个窗口只能仿真串口输出,不能仿真串口的接收通信。采用虚拟串口软件VSPD(Virtual Serial Port Driver),可以虚拟出多对串口,如图2所示。分别把每一对虚拟串口中的一个与STM32单片机的每个串口进行绑定,就可以进行串口的通信仿真测试。
图2 产生的3对虚拟串口
本文用 VSPD软件虚拟了3对串口,分别是COM4和 COM5、COM6和 COM7、COM8 和 COM9。COM4发送数据时,COM5接收数据,反之亦然。为了仿真 STM32单片机3个串口的收发通信,把UART1和COM4绑定在一起,把 UART2和 COM6绑定在一起,把UART3和COM8绑定在一起。因为虚拟串口COM4和COM5互相通信,所以用COM5发数据,可以模拟串口COM4的中断接收数据。配置文件为COM4_OUT.txt,把后缀名改为.ini。内容如下[9,10]:
MODE COM4 115200,0,8,1
ASSIGN COM4<S1IN> S1OUT
MODE COM6 115200,0,8,1
ASSIGN COM6<S2IN> S2OUT
MODE COM8 115200,0,8,1
ASSIGN COM8<S3IN> S3OUT
ASSIGN
文件的作用是配置COM4的波特率为115 200 bit/s,8个数据位,1个停止位,无校验位,把COM4和STM32的第1个串口绑定在一起,配置COM6的波特率与COM4一样,绑定COM6和STM32的第2个串口在一起,依次类推。把COM4_OUT.ini文件放在工程文件中,编译后,就可以利用 RealView MDK软件和串口调试软件进行串口的通信仿真测试。
3 USART通信发送、接收数据测试
3.1 发送数据测试
设置 3个发送数组,uart1_tx[64]、uart2_tx[64]、uart3_tx[64],因为 COM4 和 COM5 相连接,当COM4发送数据时,COM5接收数据,由图3可知,当 COM4发送数组 uart1_tx[64]的数据时,COM5的接收区正确显示数组uart1_tx[64]的数据。COM8和COM9相连,由图4可知,COM9的接收区正确显示数组 uart3_tx[64]的数据[11]。
uart1_tx[64]={0x11,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x3a,0x5b,0x2c,0x2d,0x3e,0x4f,0x4c,0x2d……
0xaa,0xab,0xac,0xad,0xae,0xaf,0xaf,0xaf};
uart3_tx[64]={0x31,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x3f,……
0x8a,0x8b,0x6c,0x6d,0xe7,0xf7,0xa3,0xb5,
0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xcf,0xcf};
图3 COM5接收数据测试
图4 COM9接收数据测试
3.2 接收数据测试
用 uart1_rx[64]、uart2_rx[64]和 uart3_rx[64]分别模拟COM4、COM6和COM8中断接收数据,这时COM5、COM7和COM9分别发出数据。该实验用于测试多串口中断接收通信的准确率[12]。
图5 uart1_rx接收前后对比
图7 COM5发送数据
对比图5和图7可知,uart1_rx[64]正确接收到COM5发出的64个数据,表明COM4中断接收通信正确。对比图6和图8可知,uart2_rx[64]正确接收到COM7发送的64个数据,表明COM6中断接收通信正确。
图8 COM7发送数据
4 结束语
针对目前广泛使用的STM32单片机,介绍一种使用VSPD(虚拟串口)结合串口调试软件进行多串口收发通信的仿真测试方法。论述了虚拟串口和仿真串口的绑定方法,并给出了相应模块的软件代码。仿真实验结果表明,该方法可以在没有硬件平台的条件下,精确地进行多个串口发送和接收通信的测试,并能得到很好的结果。
[1]李 宁.基于MDK的STM32处理器开发应用[M].北京:北京航空航天大学出版社,2008.
[2]喻金钱,喻 斌.STM32F系列ARM Cortex-M3核微控制器开发与应用[M].北京:清华大学出版社,2011.
[3]刘波文.ARM Cortex-M3应用开发实例详解[M].北京:电子工业出版社,2011.
[4]张爱民,王云沼.STM32微控制器的可靠串口通信技术研究[J].单片机与嵌入式系统,2013,10(2):21 -24.
[5]陈 宫,王三胜,张庆荣,等.基于STM32F103VCT6的微位移控制系统设计[J].现代电子技术,2012,35(3):144-147.
[6]郭 勇,杨 欢.RS(63,45)编译码器的设计与 FPGA实现[J].无线电通信技术,2011,37(2):54 -58.
[7]勾慧兰,刘光超.基于STM32的最小系统及串口通信的实现[J].工业控制计算机,2012,25(9):26-29.
[8]郭 勇,陈艳玲.多发多收网络仿真器的FPGA实现及测试[J].无线电工程,2013,43(1):4 -6.
[9]索云天,梁龙学,林冲锋.基于STM32的多点温度采集系统设计[J].兰州交通大学学报,2013,32(6):61 -63.
[10]薛震宇.基于虚拟串口的嵌入式系统测试卡设计[J].仪表技术,2008,10(2):54 -58.
[11]郭 勇,何 军.基于RS IP核编译码器的设计与FPGA 实现[J].无线电通信技术,2015,41(1):90-93.
[12]孙林军,贺锋涛.基于STM32F103控制液晶的接口实现[J].电视技术,2013,37(1):77-79.