基于STM32串口通信的车联网终端设计
2018-08-23罗洋坤
罗洋坤
(湖南汽车工程职业学院,湖南 株洲 412001)
0 引言
随着汽车行业朝向物联网方向发展和应用,其车联网的终端设备性能至关重要。普通的51单片机已经无法满足车联网高速数据处理需求,在性能方面也存在较大的不稳定性,因此研究应用一种廉价和性能满足数据处理需求的终端设备成为关键。白昊等采用串口模块,使串口设备以无线形式接入网络[1];李晓丹设计的嵌入式网关系统由STM32通过串口与网络模块实现远程控制[2];余欢等以STM32为硬件平台开发了一套针对科研人员使用的农业环境数据采集终端系统,采集数据实时传输到远端服务器的同时也保存至TF卡[3-4];陈振亚等采用STM32F407作为主控芯片实现与智慧社区综合管理平台服务器的数据处理[5]。由于在构建的车联网系统中存在远程传输数据的实时性,因此终端必须在很短的时间内完成大量连续数据的串口传输和内部批量处理数据[6]。
设计中采用STM32F407芯片强大的处理速度和高性能的外设为车联网终端性能提供硬件保证,充分利用DMA和SPI技术相互结合发挥出STM32在终端数据处理性能,并使得远程数据的传输过程更加稳定[7]。
1 车联网终端设计
在考虑车联网终端设计成本和性能整体因素后选择STM32F407芯片作为终端设备处理芯片。STM32F407芯片基于ARM Cortex-M3架构,基于STM32F407芯片设计终端控制电路,STM32核心电路图,如图1所示。STM32F407拥有完善的时钟启动机制,在启动时选择系统时钟,复位时内部8 MHz晶振作为CPU时钟,可使用多个预比较器用于配置AHB频率,包括高速APB2和低速APB1,高速APB2最高频率为72 MHz,低速APB1最高频率为36 MHz,这种时钟模式和启动机制完全满足车联网终端设备的要求,其时钟频率较高,保证了整个车联网终端设备的运行速度。
STM32外围接口丰富,时钟频率更快,模块化程序结构。STM32F407除了在硬件方面性能卓越外,其精髓之一在于其拥有自己的库。使用查找表的方式非常麻烦,其往往通过查阅来操作相关寄存器的配置是因为1或者0,这种方式的弊端在于使用频繁造成巨大的时间消耗,会给进行二次开发带来巨大压力,方便进行二次开发才是最重要的规划[8]。
STM32提供的许多函数接口,直接调用这些函数接口就可以配置STM32的寄存器,不用挖空心思去了解库底层的寄存器操作,而且对于寄存器的操作根据函数接口和调用参数非常清晰。
在车联网终端中STM32F407与多个SPI设备相连,必然要分清楚哪个SPI设备有效,于是SPI总线必然有一根片选信号线。SPI信号线选择分析如图1所示,可以看到MCU连接了3个SPI设备,独立的片选信号SS1、SS2和SS3谁是低电平决定了哪个设备可以开始SPI通信。而SCK、MOSI和MISO这3个信号线则是被3个SPI设备共用。SCK是时钟信号线(Serial Clock),STM32F407决定了时钟频率,MOSI是STM32F407控制芯片输出输入信号线,从STM32控制终端输出数据,由其他接收设备接收。MISO是主机输入从机输出信号线,数据从从机输出,由主机接收[9]。
图1 SPI信号线选择分析图
2 SPI和DMA 通信数据传输
SPI在通信数据传输中其模式由时钟极性(CPOL)和时钟相位(CPHA)配置,2*2=4,意味着有4种模式。CPOL影响的是4根信号线之中的SCK信号线,CPOL=0时SCK=0;CPOL=1时SCK=1。CPOL的值决定了SPI通信设备处于空闲状态时SCK信号线是高电平还是低电平。CPHA就是指是奇数边沿采样还是偶数边沿采样,其中的MOSI和MISO这2个信号线采样[10]。使用SPI协议通信时,主机和从机的时序要保持一致,意味着主机和从机有一样的SPI模式。STM32方面的用SPI来支持车联网终端性能,这样是为了使用DMA功能来提高数据传输和处理的实时性能,单次传输可选择为8或16位,波特率预分频系数(最大为FPCLK/2),时钟极性(CPOL)和相位(CPHA)可编程设置,数据顺序的传输顺序可进行编程选择,MSB在前或LSB 在前,可触发中断的专用发送和接收标志,使用DMA进行数据传输操作。
当从车联网终端的外设接收数据时,MISO数据线接收信号通过移位寄存器处理发送到接收缓冲区,直接读取接收缓冲区变量,当发数据给车联网终端设备的其他外设时,先把数据写入发送缓冲区变量,通过硬件用移位寄存器处理,再输出到MOSI数据线。CPU先花时间把ADC外设寄存器的数据读取回内存,也就是程序里面设定变量去存储这些数据,然后CPU花时间对变量进行运算处理。问题在于怎样不让CPU花时间在把ADC外设的寄存器的数据读取回内存这个过程上。在车联网终端设备中STM32F407和其他外设以及内存之间的关系非常紧密,因此联系它们的总线显得至关重要,而数据要在内存和外设之间进行传输,或者外设直接互相传输,这样的工作由DMA去做。
3 DMA 总线架构
在STM32中,DMA是以外设的身份被添加到Cortex内核之外的。STM32的系统结构如图2所示。内核Cortex通过DCODE经过总线矩阵协调,把数据再存放到SRAM中,这个过程非常浪费CPU,使用DMA的优势在于,其DMA总线与矩阵协调,AHB把车联网终端设备的外设ADC数据经过DMA通道之后,自动保存到内存SRAM中[11]。该过程独立于STM32F407内核,数据转移的同时CPU可以做其他事情,此时的CPU已经告别了中转站的身份。DMA直接存储器存取中的“直接”就体现在点到点的数据转移[12-13]。
图2 STM32的系统结构
4 性能分析
通过结合SPI和DMA的优势,使得车联网终端设备中STM32F407可以发挥出其最佳性能,通过测试,STM32F407可以高速处理目前车联网的终端数据信息,车联网终端数据延时过长得到了根本改善,性能也非常稳定,连续测试20天没有出现死机和数据丢失的情况。
4.1 SPI和DMA程序优化分析
程序在软件程序的改进优化方面,通过以下过程实现了SPI和DMA技术结合的最佳软件性能。其中,main函数首先调用了USART1_Config()、DMA_Config()及LED_GPIO_Config()分别配置串口和DMA。在进行DMA传输的过程中CPU还在控制着其他车联网程序过程。需要特别主意的是USART_DMACMD(USART1,USART_DMAREQ_TX,ENABLE)是库函数,调用这个库函数就实现了允许车联网终端串口外设向DMA发出请求,请求DMA传输数据。调用这个函数之后,DMA开始响应串口的请求,根据DMA配置把数组中的数据一个个地转移到终端车联网设备的串口数据寄存器,并由串口向外发送这些数据。
4.2 串口的DMA配置分析
前面车联网终端串口向DMA发出数据传输请求,那么需要对串口的DMA初始化配置。为了开启外设的DMA时钟,填充要进行DMA传输的初始化结构体,使能DMA功能。外设地址是数据寄存器的地址,通过DMA把内存数组里的数据转移保存到这个数据寄存器中,串口直接按照串口协议自动发送这个数据寄存器接收到的数据[14]。这里需要注意的是外设地址需要算出来进行宏定义的,但是地址不需要自增,而内存地址往往是一个数组名,这样就需要进行自增设置。在使能DMA中选择通道不是随便选择,需要根据映射图配置。外设在使用DMA前需要向DMA控制器发送请求信息,DMA在接收到请求后才会根据DMA配置进行数据转移。
在车联网设计的终端中DMA被配置为:数据传输方向从内存(数组SendBuff)到USART1外设的数据寄存器(USART1_DR_Base),要传输的数据总量为SENDBUFF_SIZE(5 000字节),并且传输时内存地址自增,外设地址固定,DMA模式为非循环模式,DMA通道为DMA1的CHANNEL4。在车联网终端设备的软件中通过system_stm32f10x.c文件进行时钟配置,包括系统时钟和总线时钟,STM32F407的系统频率并非等同于外部晶振频率,设备系统通过STM32F407的内部寄存器对晶振频率进行倍频和分频处理,或者使用STM32F407自带的时钟。
在车联网终端设备上的外设都与该时钟频率密切关联,因此在车联网终端设备的程序设计上对该文件的时钟配置至关重要。此外misc.c文件包括了车联网终端外设对STM32F407芯片中的中断向量控制器的访问函数,因此在配置车联网终端设备的STM32407中断时,要把该文件添加到整个车联网软件工程中。最后还有一个配置使用了与外设的头文件stm32f10x_conf.h[15]。
5 结束语
针对车联网远程短时间内连续传输和处理大量数据的问题,设计采用STM32强大的外设为车联网终端性能提供了硬件保证,利用DMA和SPI技术相互结合发挥出STM32在终端数据处理和传输的最佳性能[16]。经过测试分析,串口通信性能的提高可以使得车联网信息处理速度更快,使得车联网系统更加适应高速数据趋势。但是网络通信的实时性能以后会越来越高标准要求,因此如何组建更好的终端设计结构将是进一步研究的课题。