基于DMA的串口接收空闲中断研究

2020-05-23 07:49李队员
宿州学院学报 2020年3期
关键词:空闲电控队列

李队员 ,朱 广

1.安徽交通职业技术学院城市轨道交通与信息工程系,安徽合肥,230051;2.安徽建筑大学机械与电气工程学院,安徽合肥,230601

在通信领域,通信方式有两种,一种是并行通信,计算机和I/O口设备间通过多条传输线通信,在时钟的作用下,数据各位能同时传送;另外一种则是串行通信,待传输的数据位通常按低位在前高位在后传送,在一根数据线或一对差分的双绞线上传输。串行通信一个时钟上升沿只能传输一个数据位,速度慢,但是由于传输设备线束较少,成本低,可利用现有的通信设备和技术手段进行远程通信;并行传输设备成本高,但通信速度快,适合近距离数据传输。与并口通信相比,串口通讯具有硬件简单、软件易实现等优点,广泛应用于工控领域[1]。数据的收发常采用中断或查询方式进行[2]。但这两种方式数据的传输均需要CPU的参与,使得其他任务得不到高效执行[3]。

据此,设计者常采用直接内存存取(DMA)来管理串口数据的收发,允许在存储器和外设之间直接读写数据,不经过CPU,也不需要CPU干预[4]。DMA完成一帧数据的接收,如果利用DMA自身产生的接收完成中断来通知CPU,就需要将DMA接收中断的数据长度设置成定长,而实际传输的数据长度往往不固定,文献3采用DMA加定时器超时的方式较好地解决了不定长数据传输的问题,但需要额外的定时器及外部监控触发条件。

在充分利用DMA和串口自身资源的情况下,本文提出一种基于DMA的串口接收空闲中断来完成不定长数据传输的新方法。

1 方案设计及实现

1.1 硬件设计

方案的硬件为高铁商务舱电控盒系统,该电控盒主控通过RS485总线将脚控、腿控、背控有机联系起来,响应按键操作,依据按键功能调整座椅姿态。主控通过串口与笔记本电脑相连,接收座椅运行所需的参数配置并支持故障或状态实时查询。采用意法半导体的STM32F103VET6作为电控盒主控CPU,该款CPU属于Corte-M3内核,片上自带可擦除的512K的FLASH和64K的RAM,主时钟8M可以通过内部PLL倍频配置,达到72M的工作频率,同时该款CPU具有7通道DMA控制器,满足电控盒硬件要求,如图1所示。

图1 硬件总体框图

计算机与主控模块通信,由于STM32F103为TTL电平,需要转换成RS-232电平才能被计算机接收和识别。考虑到高铁接触网复杂的电磁环境以及机车进站刹车减速和出站的启动加速,采用抗干扰能力较强的SP3232E作为RS-232电平转换芯片,该款芯片具有以下几点特性:(1)3.0~5.5 V供电;(2)120 kbps传输率;(3)15 kv空气放电;(4)8 kv接触放电。能够满足稳定可靠的通信要求。

1.2 软件实现

方案的软件采用开源的实时嵌入式操作系统的μCOS II。由于是商务舱VIP座椅以及乘客的特殊性,座椅的各个部件控制需及时。和其他开源的嵌入式操作系统相比,μCOS II系统内核可裁剪,可读性强,易于移植。该系统属于强占式实时操作系统,其系统的响应时间非常短,通常在毫秒或微秒级,能够满足高铁座椅对实时性的要求。实时数据量大,为了提高通讯效率,需要采用不同长度的数据包,在不占用其他硬件资源的情况下,基于DMA的空闲中断是最佳选择。 将串口1作为CPU与PC机的通讯接口,硬件总体框图见图2,通过串口通讯完成参数的配置、故障诊断和状态查询等功能。

图2 串口电路

STM32F103VET6串口1的DMA1通道见表1,使用通道5完成串口数据接收。

表1 串口1外设DMA1通道

对于串口接收,为了协调数据接收和处理的不同步以及防止数据的丢失,创建了一个5行10列的二维数组u8 USART1_Rec_Buf1[5][10]作为串口的接收缓存,存放DMA转存过来的数据;对接收缓存,需要创建一个消息队列static void*AppUart1QStag[5]来指向,这个队列有5个元素,以便更好地访问所接收到的数据。

创建一个串口事件控制块OS_EVENT*AppUart1Q,来指向这个队列的数据结构,并且通过UCOS II的库函数OSQCreate建立队列和事件之间的映射关系,AppUart1Q=OSQCreate(AppUart1QStag,5)。 在串口处理任务void usart1_task(void *p_arg) 中添加定时查询串口消息队列的代码程序,msg = (INT8U *)OSQPend(AppUart1Q,OS_TICKS_PER_SEC/50,&lerr);当串口队列中有数据时,if((msg != (void *)0)条件成立,可以依据通讯协议对数据进行解析,执行相关功能。

1.2.1 串口配置

串口发送需要进行波特率、数据长度以及硬件流等基本设置,波特率通常指的是1秒钟内发送的数据位数。发送数据线TXD,在没有发送数据的状态下,为高电平,当有数据要发送时,先输出1个位的低电平,叫起始位,紧接着是要输出的待发送的8位有效数据位,最后输出一个位的高电平作停止位。函数名void USART_Config(void),串口初始化见图3。

图3 串口初始化

1.2.2 DMA配置

将串口数据接收寄存器接收到的数据直接拷贝到内部数据缓冲区。需要配置DMA的源地址和目的地址,函数名void USART1_DMA_Configure(u8 bufs),串口的DMA配置见图4。

图4 串口的DMA配置

1.2.3 串口中断配置

STM32F103VET6有60个可屏蔽中断和10个内核中断,16级的中断优先级可以配置和编程。对于常用的60个可屏蔽中断,需要进行ISER使能、ICER禁止和IP优先级配置。

当程序在处理中断服务函数时有可能产生另一个中断,这时需要一个NVIC机制来调解即向量中断控制器(Nested Vectored Interrupt Controller)可嵌套,事先安排好不同的中断优先级。

中断使能。对于ISER中断使能寄存器组中,通常由ISER[0]和ISER[1]来管理,其中ISER[0]的bit0~bit31对应中断序号0~31。ISER[1]的 bit0~27对应中断序号32~59,中断使能需要中断对应的bit位置1,禁止中断需要在ICER中断使能寄存器组中,对相应的中断位写1达到禁止中断的作用。

优先级配置。NVIC中断向量的优先级配置由一个4 位的数字来决定,根据抢占优先级和响应优先级组合方式的不同,可以配置16 种优先级,抢占优先级在前,子优先级在后。

STM32F103VET6有抢占优先级和响应优先级。低优先级的中断在执行时遇到高优先级的中断可以被响应,即执行完高优先级的中断后再执行低优先级中断。同级优先级不同时遇到时按顺序执行,若同时遇到则要比较其子优先级的高低决定执行顺序[5]。

中断配置。为使CPU不参与数据接收的过程,需禁止串口的接收中断,使能串口空闲中断,在程序正常执行的过程中,DMA接收数据,当接收完成后,产生串口空闲中断,以便程序进入中断服务函数处理接收到的串口数据,处理完成后再返回到原断点,因此需要对串口的中断进行配置。配置函数为void NVIC_Configuration(void),串口中断配置见图5。

图5 串口中断配置

1.2.4 串口空闲接收中断

一帧数据接收完毕,在一定时间内无后续数据,串口产生空闲中断。在串口空闲中断中设置新的DMA接收缓存[6],同时发送消息进串口消息队列,通知应用程序处理。

void USART1_IRQHandler(void)

{

__O uint32_t tmp = 0;

if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)

{

USART_ClearFlag(USART1,USART_IT_IDLE);

tmp = USART1->SR; tmp = USART1->DR;

OSQPost(AppUart1Q,(void *)( USART1_Rec_Buf1[buf_sel]));

buf_sel++;if(buf_sel >= 0x05) buf_sel = 0x00;

USART1_DMA_Configure(buf_sel);

}

}

2 实验验证

软件开发平台采用Keil uVision5,Keil uVision5是美国Keil Software公司出品的一款支持C语言开发,操作界面友好,支持在线仿真的集成IDE开发环境。

实验方案硬件由一台笔记本电脑,通过USB转串口的RS232电缆与电控盒主控相连,打开笔记本电脑的串口调试助手,选择串口及参数设置,输入待发的两包不定长数据包,同时主控在keil 5的操作界面下[7]需进行以下配置,如图6所示。

图6 配置选项卡

(1)在option for target的output选项中,勾选Degug Information以及Create HEX File两个选项。

(2)在Debug选项卡中选择J-LINK/J-TRACE Cortex硬件仿真。

(3)在Utilities→Settings→Flash Download→Programming Algorithm选项中选择STM32F10x High-density Flash。

设置完成后,点击Debug进行在线仿真。

在主界面下的View→Watch Windows→Watch1打开Watch1窗口。

在Watch1的窗口添加观察变量USART1_Rec_Buf1,并对接收到的数据进行观察,实验方案见图7。

图7 实验方案

在串口调试助手界面下,波特率选择19200Bps,8个数据位,1个停止位,无奇偶校验位,无流控制以及HEX发送。手动间隔一定时间发送不定长的两帧数据,第1次发送 AA 08 07 06,第2次发送AA 01 02 03 04 05。见图8所示。

图8 串口调试助手

图9 仿真结果

在线仿真查看接收缓存数据,缓存接收到的数据如图9 所示,从图9可以看出,串口调试助手手动下发的不定长两包数据与采用空闲中断[8]接收到的数据相同。

3 结 论

DMA是数据传输方式,利用CPU自带的DMA控制器,将外设接收到的数据直接拷贝到内存空间。本研究中,DMA在硬件串口的DR寄存器和RAM缓冲区USART1_Rec_Buf1[bufsel]间开辟直接传输数据的通道,不需要CPU主控芯片的实时控制和参与,也不需要类似中断处理程序保留现场和恢复现场的操作,大大减小了CPU的负担和实时嵌入式操作系统内核切换开销,提高了CPU的程序执行效率和响应时间。

基于DMA的串口接收空闲中断的方法较好地解决不定长数据串口接收的问题,节约了CPU的资源,简化了硬件设计,运行稳定。该方法已成功应用于高铁商务舱座椅电控盒主控系统,该电控盒打破了某国外集团对中国高铁商务舱座椅电控系统长期的垄断地位,实际上该方法也用于主控与脚控、腿控和背控之间的相互通讯,对于其他应用的串行通讯,也具有一定的推广或参考价值。

猜你喜欢
空闲电控队列
队列里的小秘密
基于多队列切换的SDN拥塞控制*
“鸟”字谜
西湾村采风
在队列里
彪悍的“宠”生,不需要解释
丰田加速驶入自动驾驶队列
WLAN和LTE交通规则
ECAS空气悬架电控系统介绍
东风雪铁龙C5各电控系统电路图解析(九)——ESP电控系统上篇