分享

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

 龙之吻6iinxl8c 2018-05-08

USART(Universal Synchronous/Asynchronous Receiver/Transmitter,即通用同步/异步收发器)串行通信是单片机最常用的一种通信技术,通常用于单片机和电脑之间以及单片机和单片机之间的通信。

5.1 USART串行通信协议

5.1.1 波特率和数据格式

USART通信中的同步通信功能很少用到,大多情况下只采用异步通信,只能实现异步通信功能的接口就称之为UART。UART通信通常以字节为单位组成数据帧,由通信收发双方根据预先约定的波特率(传输速率)进行通信。

波特率表示每秒发送二进制数据位的速率,单位是bps,即位/秒,波特率越高,传输速度越快,常用的UART通信波特率有2400,4800,9600,115200等等。在进行串行通信之前,通信双方需要设置波特率保持一致,否则不能正常通信。

单片机标准串口进行通信时,没有数据传输时通信线路保持高电平状态。当要发送数据时,先发送一位0,用以表示开始发送,叫做起始位。然后再按照低位在前,高位在后的顺序发送8位数据。当8位数据发送完毕时,再发送一位1表示停止位。对于接收端而言,开始时传输线路一直保持高电平,一旦检测到低电平,便准备开始接收数据。当接收完8位数据时,便检测停止位,检测完毕后,表示一帧数据发送完毕,开始准备接受下一帧数据。为了确保数据准确性,通常会在数据位之后设置校验位。

串行通信的数据帧的格式由起始位、数据位、奇偶校验位(可选)和停止位等部分组成,如图5-1所示。

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

图5-1 串口数据发送格式示意图

5.1.2 TTL通信接口和RS232通信接口

电脑和单片机之间进行串口通信,通常使用USB转UART芯片,将USB通信协议转成UART协议和单片机通信,如图5-2所示,CH340的6脚和7脚接到USB口上的D-和D+,3脚和4脚接到STM32的UART接口引脚上。Kingst-32F1开发板上CH340的3脚和4脚通过跳线帽选择连接在STM32F103ZE单片机USART1的PA10和PA9引脚上。拔掉跳线帽USB转串口模块可以单独使用,注意连接外部串口时设备之间要共地。

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

图5-2 USB转串口电路

单片机的串口接口标准一般是TTL或者CMOS,而除此之外,UART通信还有一种RS232串行通信接口,台式电脑和早期的工业专用的笔记本电脑通常带RS232接口。

RS232标准是个反逻辑,也叫做负逻辑。为何叫负逻辑?它的TXD和RXD的电压,-3V~-15V代表是1,+3~+15V代表是0。低电平代表的是1,而高电平代表的是0,所以称之为负逻辑。9针RS232串口是不能和单片机直接连接的,需要用一个电平转换芯片MAX232或者SP3232来完成,这两个芯片只是设计公司不同,其他是完全兼容的,具体电路如图5-3所示。Kingst-32F1开发板中RS485和RS232共用USART2,使用时可以通过跳线帽选择。

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

图5-3 RS232转串口电路图

5.2 STM32F103ZE单片机USART串口介绍

STM32F103ZE单片机内部集成有3(USART)+2(UART)个串行通信接口,如表5-1所示。

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

在使用异步通信时也就是相当于有5个UART模块,并且这5个模块能同时进行数据发送和接收,互不干扰。除此之外STM32的USART模块支持8位或9位长度的数据字;可配置1位或2位的停止位。

USART外设发送和接收的数据是通过数据寄存器(USART_DR)传输的。该寄存器兼具读和写的功能,实际上它是由发送数据寄存器(TDR)和接收数据寄存器(RDR)两个寄存器组成,就好比一个房间有两个门,一个只进不出,一个只出不进,如图5-4所示。

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

图5-4 USART数据发送和接收简易结构图

USART发送数据的大体流程:数据通过内部总线,先发送到TDR中,然后再由TDR移送到'发送移位寄存器',最后数据通过移位从TXD引脚输出。当TDR中的数据传送到移位寄存器后,TDR为空,同时硬件会设置一个'发送数据寄存器空(TXE)'的标志位,此时可以把下一帧数据写入TDR中,而不必等到移位寄存器发送完所有位,向TDR中写入数据会清除TXE标志位。当一帧数据发送完成(停止位发送后)且TXE=1(TDR为空),即没有数据再写入到TDR时,硬件会设置一个'发送完成(TC)'标志位,表示最后一帧数据发送完毕,USART发送过程标志位状态如图5-5所示。如果设置了TXEIE(TXE中断使能位)或TCIE(TC中断使能位),当TXE或TC标志位被置位时,程序会执行串口中断服务函数。需要注意的是当USART发送功能(TE位)激活后(初始化或复位时),将发送一个空闲帧(0xFF),如果此时没有数据发送,则TXE标志位和TC标志位会一直处于'置位'状态,如果使能了TXEIE或TCIE,程序会重复执行串口中断服务函数,这将会大量占用CPU资源。

在使用串口中断发送数据时,只要TDR寄存器为空,就可以写入数据,而不需要等待数据发送完成,因此通常选择检测TXE标志位,而不是TC标志位。由于TDR寄存器一旦为空,TXE标志位会硬件置位,进而触发中断,所以当不发送数据时要及时关闭发送中断。

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

图 5-5 USART发送数据过程状态图

USART接收数据的流程要比发送数据简单很多。数据的最低有效位首先从RXD引脚移入到'接收移位寄存器',当一帧数据接收完成,接收移位寄存器将数据发送到接收数据寄存器(RDR)中。此时硬件会设置一个接收数据寄存器非空标志位(RXNE),表示数据已经被接收并且可以读出,如果设置了接收中断,当检测到RXNE标志位时会执行中断服务函数。读取接收数据寄存器(RDR)中的数据可以自动清除RXNE标志位。RXNE标志位在下一字符接收前也可以手动清除,避免溢出错误。

5.3 USART配置流程

5.3.1 配置流程

USART中配置流程并不复杂,只需要按照要求设置相应参数即可。在配置时要分清USART标志位和USART中断标志位,具体流程如下:

(1) 使能USART时钟及配置相关引脚:在使能USART时钟时,注意STM32F103ZE单片机的USART1模块位于APB2总线上,USART2、USART3、UART4、UART5位于APB1总线上。USART双向通信时至少需要TXD和RXD两个引脚,其中TXD引脚配置为复用推挽输出模式,RXD引脚配置为浮空输入模式。

(2) USART外设初始化参数设置:初始化时要设置USART的波特率、数据长度、停止位、是否使用校验位、使能USART的发送功能和接收功能,一旦激活发送功能,USART会发送一个空闲帧,最后使用USART_Init初始化函数进行初始化。

(3) USART中断优先级设置:通过NVIC_Init函数配置串口中断优先级。

(4) 使能USART中断:通过USART_ITConfig函数使能串口发送中断和串口接收中断。注意在此只使能串口接收中断,发送中断必须在发送前使能,发送完毕后关闭,否则程序会重复执行中断服务函数。

(5) 使能USART外设:通过USART_Cmd函数使能USART外设,一旦使能,USART便开始工作。

(6) 编写USART中断服务函数:串口中断服务函数需要使用中断向量表中定义的函数名称,具体如表5-2所示,中断服务函数依旧是保存在stm32f10x_it.c文件中。

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

5.3.2 初始化参数

USART初始化结构体的成员,包括波特率、数据长度、停止位数、校验位、模式设置、硬件控制流设置。在对USART初始化结构体成员设置参数时参考表5-3 USART初始化结构体参数设置列表。

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

5.3.3 USART中断设置

USART_ITConfig函数是使能或者失能USART模块的中断,函数原型如下:void USART_ITConfig(USART_TypeDef* USARTx, u16 USART_IT, Functional StateNewState),待使能或者失能的 USART 中断源如表5-4所示。USART发送数据时分为查询方式和中断方式,因查询方式会较长时间的占用CPU,可能耽误对其它事件的响应处理,因此实际项目开发中一般采用中断方式发送和接收数据,本章就以中断方式为例来配置USART。初始化时先使能'接收中断(USART_IT_RXNE)',而'发送中断(USART_IT_TXE)'即用即开,用完关闭。

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

采用中断方式发送数据和接收数据时,当程序进入中断服务后需要判断到来的是哪个中断源,然后执行相应的函数。因此需要使用中断标志位检测函数USART_GetITStatus(USART_TypeDef* USARTx, u16 USART_IT)检测USART相应中断标志的状态,比如:USART_GetITStatus (USART1, USART_IT_TXE)表示获取发送中断标志位状态,其他中断标志位可以参考表5-5。

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

当检测到相应中断标志为后,有些硬件会自动清除相应标志位,而硬件不能自动清除时往往需要手动清除,此时可以使用USART_ClearITPendingBit(USART_TypeDef* USARTx, u16 USART_IT)中断标志位清除函数,清除相应标志位。中断标志位清除函数和中断标志位检测函数使用相同的USART中断标志位参数,如表5-5所示。比如清除'发送数据寄存器空(TXE)'标志位代码如下:USART_ClearITPendingBit(USART_IT_TXE);

5.3.4 USART通信实例

单片机串口主要用于单片机与电脑以及单片机之间进行信息交互。通过前面几节,基本了解了STM32串口的基本状况和配置流程,接下来就是用USART1做一个简单的串口收发实验,实现串口助手发送单个字符到Kingst32-F1开发板,Kingst32-F1开发板收到字符后,对字符进行加1,然后重新发回到串口助手,并通过数码管显示该字符的十六进制数。首先还是先建立usart.c和usart.h驱动文件,根据前几节所讲的配置流程,编写USART驱动函数,具体代码如下:

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

5.3 实用串口通信例程

在实际应用中,单片机串口和计算机的上位机软件之间往往需要信息交互,从而实现上

位机发送指令,单片机通过串口接收指令并做出应答,然后执行相应的操作,这就要求通信双方具有一个合理的通信机制和逻辑关系。

在实际通信中,传输一帧(多个字节)数据时往往都是连续不断的发送的,即发送完一个字节后会紧接着发送下一个字节,期间没有间隔或间隔很短,而当这一帧数据都发送完毕后,就会间隔很长一段时间(相对于连续发送时的间隔来讲)不再发送数据,也就是通信总线上会空闲一段较长的时间。根据这种现象可以建立一种程序机制:设置一个定时器用来计算总线的空闲时间。定时器在有数据传输时(即单片机接收到数据时)清零,而在总线空闲时(没有接收到数据时)时累加,当它累加到一定时间(例程里是30ms)后,就可以认定一帧完整的数据已经传输完毕了,于是告诉其它程序可以来处理数据了,本次的数据处理完后就恢复到初始状态,再准备下一次的接收。那么用于判定一帧结束的空闲时间取多少合适呢?它取决于多个条件,并没有一个固定值,这里介绍几个需要考虑的原则:第一,这个时间必须大于传输一个字节的时间,很明显单片机接收中断产生是在一个字节接收完毕后,也就是一个时刻点,而其接收过程程序是无从知晓的,因此在至少一个字节传输时间内绝不能认为空闲已经时间达到了。第二,要考虑发送方的系统延时,因为不是所有的发送方都能让数据严格无间隔的发送,因为软件响应、关中断、系统临界区等等操作都会引起延时,所以还得再附加几个到十几个ms的时间。选取的30ms是一个折中的经验值,它能适应大部分的波特率(大于1200)和大部分的系统延时(PC机或其它单片机系统)情况。

利用这种程序机制,上位机可以通过串口向单片机发送指令,进而控制相应的模块,这个在实际项目中是非常有意义的。结合第四章的舞台灯光例程,设计一个基于计算机串口调试助手发送相应指令到单片机模拟舞台灯光程序中的按键选择功能,实现舞台灯光变换,其余与舞台灯光实验完全相同。RGB控制指令如表5-6所示,单片机接收到控制指令后,如果指令正确,返回'done.',错误时返回'error.'。其中type后面跟随数字1~13,用来表示模式,比如发送type 1选择模式1,如果type后面跟随其他字符,虽然也会返回'done.'但是并不会执行动作函数,仅表示发送指令格式正确。speed faster和speed slower指令用于控制闪缩和渐变速度,发送一次指令,速度变化一个等级。

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

具体代码如下:

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

ARM嵌入式编程与实战应用(STM32F1系列)第5章 USART串口通信

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多