第8章 USART与开发实例_第1页
第8章 USART与开发实例_第2页
第8章 USART与开发实例_第3页
第8章 USART与开发实例_第4页
第8章 USART与开发实例_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章USART与开发实例8.1串行通信基础无论是RS-232还是RS-485,均可采用通用异步收发数据格式。通用异步收发器(UniversalAsynchronousReceiver/Transmitter,UART)通信的数据格式如图8-1所示。8.1.1串行异步通信数据格式图8-1通用异步收发器(UART)通信的数据格式(1)通信线上无数据时线路应处于逻辑1状态(高电平)。(2)发送字符时,先送起始位(逻辑0,低电平),紧接数据位,有效数据位为5~8位。(3)之后根据需要加奇偶校验位,最后是停止位(逻辑1,高电平),位数可选1、1.5或2位。串行同步通信是由1~2个同步字符和多字节数据位组成,同步字符作为起始位以触发同步时钟开始发送或接收数据;多字节数据之间不允许有空隙,每位占用的时间相等;空闲位需发送同步字符。串行同步收发通信的数据格式如图8-2所示。8.1.2串行同步通信数据格式图8-2串行同步收发通信的数据格式8.2STM32的USART工作原理通用同步/异步收发器可以说是嵌入式系统中除了GPIO外最常用的一种外设。USART因简单通用,被广泛用于各种计算机和单片机的数据交换。USART接口物理连接简单,仅需2~3根线实现通信。嵌入式系统常用USART进行调试,发送运行状态信息,便于定位错误。USART通信的另一个优势是可以适应不同的物理层。8.2.1USART介绍例如,使用RS-232或RS-485可以明显提升USART通信的距离,无线FSK(FrequencyShiftKeying,频移键控)调制可以降低布线施工的难度。所以USART口在工控领域也有着广泛的应用,是串行接口的工业标准(IndustryStandard)。SM32F407微控制器的小容量产品有2个USART,中等容量产品有3个USART,大容量产品有3个USART+2个UART。USART主要特性如下:(1)全双工,异步通信。(2)NRZ标准格式。(3)分数波特率发生器系统。发送和接收共用的可编程波特率,最高达10.5Mb/s。(4)可编程数据字长度(8位或9位)。(5)可配置的停止位(支持1或2个停止位)。(6)LIN主发送同步断开符的能力以及LIN从检测断开符的能力。当USART硬件配置成LIN时,生成13位断开符;检测10/11位断开符。(7)发送方为同步传输提供时钟。8.2.2USART的主要特性(8)IRDASIR编码器/解码器。在正常模式下支持3/16位的持续时间。(9)智能卡模拟功能。智能卡接口支持ISO7816-3标准中定义的异步智能卡协议;智能卡用到0.5和1.5个停止位。(10)单线半双工通信。(11)可配置的使用DMA的多缓冲器通信。在SRAM中利用集中式DMA缓冲接收/发送字节。(12)单独的发送器和接收器使能位。(13)检测标志:接收缓冲器满;发送缓冲器空、传输结束标志。(14)校验控制:发送校验位、对接收数据进行校验。(15)四个错误检测标志:溢出错误、噪声错误、帧错误、校验错误。(16)10个带标志的中断源:CTS改变、LIN断开符检测、发送数据寄存器空、发送完成、接收数据寄存器满、检测到总线为空闲、溢出错误、帧错误、噪声错误、校验错误。(17)多处理器通信:如果地址不匹配,则进入静默模式。(18)从静默模式中唤醒:通过空闲总线检测或地址标志检测。(19)两种唤醒接收器的方式:地址位(MSB,第9位),总线空闲。STM32F407微控制器USART接口通过三个引脚与其他设备连接在一起,其内部结构如图8-3所示。8.2.3USART的功能图8-3USART内部结构任何USART双向通信至少需要两个引脚:接收数据输入(RX)和发送数据输出(TX)。RX:接收数据串行输入。通过过采样技术区别数据和噪声,从而恢复数据。TX:发送数据串行输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时,TX引脚处于高电平。在单线和智能卡模式下,此I/O被同时用于数据的发送和接收。(1)总线在发送或接收前应处于空闲状态。(2)一个起始位。(3)一个数据字(8或9位),最低有效位在前。(4)0.5、1.5、2个的停止位,由此表明数据帧结束。(5)分数波特率生成器采用12位整数和4位小数的格式表示。这种设计允许更精确地设置波特率,从而确保串行通信的准确性和一致性。(6)一个状态寄存器(USART_SR)。(7)数据寄存器(USART_DR)。(8)一个波特率寄存器(USART_BRR),12位的整数和4位小数。(9)一个智能卡模式下的保护时间寄存器(USART_GTPR)。1.波特率控制波特率控制即图8-3下部虚线框的部分。通过对USART时钟的控制,可以控制USART的数据传输速度。通过改变USART外设时钟源的分频系数USARTDIV,可以设置USART的波特率。波特率决定了USART数据通信的速率,通过设置波特率寄存器(USART_BRR)配置波特率。标准USART的波特率计算公式:波特率=fPCLK/(8x(2−OVER8)×USARTDIV)式中,fPCLk是USART总线时钟;OVER8是过采样设置;USARTDIV是需要存储在USART_BRR中的数据。USART_BRR由以下两部分组成。(1)USARTDIV的整数部分:USART_BRR的位15:4,即DIV_Mantissa[11:0]。(2)USARTDIV的小数部分:USART_BRR的位3:0,即DIV_Fraction[3:0]。2.收发控制收发控制即图8-3的中间部分。该部分由若干个控制寄存器组成,如USART控制寄存器(ControlRegister)CR1、CR2、CR3和USART状态寄存器(StatusRegister)SR等。通过向以上控制寄存器写入各种参数,控制USART数据的发送和接收。同时,通过读取状态寄存器,可以查询USART当前的状态。USART状态的查询和控制可以通过库函数实现。3.数据存储转移数据存储转移即图8-3上部灰色的部分。它的核心是两个移位寄存器:发送移位寄存器和接收移位寄存器。这两个移位寄存器负责收发数据并进行并串转换。1)USART数据发送过程USART发送时,DMA或指令先写数据到发送寄存器(TDR)。发送控制器自动将TDR数据加载到移位寄存器,逐位通过Tx引脚发送。TDR转移完成生成TXE事件,发送完成生成TC事件,均可状态寄存器查询。2)USART数据接收过程USART数据接收是USART数据发送的逆过程。USART接收数据时,数据由RX引脚逐位进入接收移位寄存器。接收控制器再将其转移到接收数据寄存器(RDR)。最后,内核指令或DMA将RDR数据读入内存。当接收移位寄存器的数据转移到接收数据寄存器后,会产生接收数据寄存器非空/已满事件RXNE。可以通过编程USART_CR1寄存器中的M位,选择8或9位字长,如图8-4所示。起始位传输时,TX引脚保持低电平;停止位传输时,TX引脚为高电平。空闲符号视为全1数据帧,紧接下一帧的起始位。断开符号为全0帧,结束时插入1至2停止位应答。发送接收共用波特率发生器,设置使能位即可为两者产生时钟信号。图8-4中的LBCL(LastBitClockPulse,最后一位时钟脉冲)为控制寄存器2(USART_CR2)的第8位。在同步模式下,该位用于控制是否在CK引脚上输出最后发送的那个数据位(最高位)对应的时钟脉冲。8.2.4USART的通信时序0:最后一位数据的时钟脉冲不从CK输出;1:最后一位数据的时钟脉冲会从CK输出。图8-4USART通信时序STM32F407系列微控制器的USART主要有以下各种中断事件:(1)发送期间的中断事件包括发送完成(TC)、清除发送(CTS)、发送数据寄存器空(TXE)。(2)接收中断事件包括:空闲总线检测(IDLE)、溢出错误(ORE)、接收寄存器非空(RXNE)、校验错误(PE)、LIN断开检测(LBD)、噪声错误(NE)和帧错误(FE)。如果设置了对应的使能控制位,这些事件就可以产生各自的中断。如书中表8-1所示。8.2.5USART的中断下面介绍STM32F407的USART相关寄存器名称,可以用半字(16位)或字(32位)的方式操作这些外设寄存器。(1)状态寄存器(USART_SR)。(2)数据寄存器(USART_DR)。(3)波特比率寄存器(USART_BRR)。(4)控制寄存器1(USART_CR1)。(5)控制寄存器2(USART_CR2)。(6)控制寄存器3(USART_CR3)。(7)保护时间和预分频寄存器(USART_GTPR)。8.2.6USART的相关寄存器8.3USART的HAL驱动程序串口的驱动程序头文件是stm32f4xx_hal_uart.h。串口操作的常用HAL函数如书中表8-2所示。1. 串口初始化函数HAL_UART_Init()用于串口初始化,主要是设置串口通信参数。其原型定义如下:HAL_StatusTypeDefHAL_UART_Init(UART_HandleTypeDef*huart)其中,参数huart是UART_HandleTypeDef类型的指针,是串口外设对象指针。在STM32CubeMX生成的串口程序文件usart.c里,会为一个串口定义外设对象变量,如:UART_HandleTypeDefhuartl;//USART1的外设对象变量8.3.1常用功能函数结构体类型UART_HandleTypeDef的定义如下,各成员变量的意义见注释:typedefstruct_UART_HandleTypeDef{UART_TypeDef*Instance;//UART寄存器基址UART_InitTypeDefInit;//UART通信参数uint8_t*pTxBuffPtr;//发送数据缓冲区指针uint16_tTxXferSize;//需要发送数据的字节数_IOuint16_tTxXferCount;//发送数据计数器,递增计数uint8_t*pRxBuffPtr;//接收数据缓冲区指针uint16_tRxXferSize;//需要接收数据的字节数_IOuint16_tRxXferCount;//接收数据计数器,递减计数DMA_HandleTypeDef*hdmatx;//数据发送DMA流对象指针DMA_HandleTypeDef*hdmarx;//数据接收DMA流对象指针HAL_LockTypeDefLock;//锁定类型_IOHAL_UART_StateTypeDefgState;//UART状态_IOHAL_UART_StateTypeDefRxState;//发送操作相关的状态_IOuint32_tErrorCode;//错误码}UART_HandleTypeDef;结构体UART_HandleTypeDef的成员变量Init是结构体类型UART_InitTypeDef,它表示串口通信参数。在STM32CubeMX中,用户可以可视化地设置串口通信参数,生成代码时会自动生成串口初始化函数。2. 阻塞模式数据传输串口数据传输有两种模式:阻塞模式和非阻塞模式。(1)阻塞模式(blockingmode)就是轮询模式,例如,使用函数HAL_UART_Transmit()发送一个缓冲区的数据时,这个函数会一直执行,直到数据传输完成或超时之后,函数才返回。(2)非阻塞模式(non-blockingmode)是使用中断或DMA方式进行数据传输,例如,使用函数HAL_UART_Transmit_IT()启动一个缓冲区的数据传输后,该函数立刻返回。数据传输的过程引发各种事件中断,用户在相应的回调函数中进行处理。以阻塞模式发送数据的函数是HAL_UART_Transmit(),其原型定义如下:HAL_StatusTypeDefHAL_UART_Transmit(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout)其中,参数pData是缓冲区指针;参数Size是需要发送的数据长度(字节);参数Timeout是超时,用嘀嗒信号的节拍数表示。3. 非阻塞模式数据传输以中断或DMA方式启动的数据传输是非阻塞式的。以中断方式发送数据的函数是HAL_UART_Transmit_IT(),其原型定义如下:HAL_StatuaTypeDetHAL_UART_Transmit_IT(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize)其中,参数pData是需要发送的数据缓冲区指针,参数Size是需要发送的数据长度(字节)。这个函数以中断方式发送一定长度的数据,若函数返回值为HAL_OK,表示启动发送成功,但并不表示数据发送完成了。在HAL驱动程序中,每个外设都有一些以“_HAL”为前缀的宏函数。这些宏函数直接操作寄存器,主要是进行启用或禁用外设、开启或禁止事件中断、判断和清除中断标志位等操作。串口操作常用的宏函数如表8-3所示。8.3.2常用的宏函数表8-3串口操作常用的宏函数这些宏函数中的参数_HANDLE_是串口外设对象指针,参数_INTERRUPT_和_IT_都是中断事件类型。一个串口只有一个中断号,但是中断事件类型较多,文件stm32f4xx_hal_uart.h定义了这些中断事件类型的宏,全部中断事件类型定义如下:#defineUART_IT_PE((uint32_t)(UART_CR1_REG_INDEX<<28U|USART_CR1_PEIE))#defineUART_IT_TXE((uint32_t)(UART_CR1_REG_INDEX<<28U|USART_CR1_TXEIE))#defineUART_IT_TC((uint32_t)(UART_CR1_REG_INDEX<<28U|USART_CR1_TCIE))#defineUART_IT_RXNE((uint32_t)(UART_CR1_REG_INDEX<<28U|USART_CR1_RXNEIE))#defineUART_IT_IDLE((uint32_t)(UART_CR1_REG_INDEX<<28U|USART_CR1_IDLEIE))#defineUART_IT_LBD((uint32_t)(UART_CR2_REG_INDEX<<28U|USART_CR2_LBDIE))#defineUART_IT_CTS((uint32_t)(UART_CR3_REG_INDEX<<28U|USART_CR3_CTSIE))#defineUART_IT_ERR((uint32_t)(UART_CR3_REG_INDEX<<28U|USART_CR3_EIE))一个串口只有一个中断号,也就是只有一个ISR(中断服务程序),例如,USART1的全局中断对应的ISR是USART1_IRQHandler()。在STM32CubeMX自动生成代码时,其ISR框架会在文件stm32f4xx_it.c中生成,代码如下:voidUSART1_IRQHandler(void)//USART1中断ISR{HAL_UART_IRQHandler(&huart1);//串口中断通用处理函数}所有串口的ISR都是调用HAL_UART_IRQHandler()这个处理函数,这个函数是中断处理通用函数。8.3.3中断事件与回调函数8.4采用STM32CubeMX和HAL库的USART串行通信应用实例STM32F4的USART的功能有很多。最基本的功能就是发送和接收。其功能的实现需要串口工作方式配置、串口发送和串口接收三部分程序。本节只介绍基本配置,其他功能和技巧都是在基本配置的基础上完成的,读者可参考相关资料。HAL库提供的串口相关操作函数。8.4.1STM32F4的USART的基本配置流程1)串口参数初始化(波特率/停止位等),并使能串口。串口作为STM32的一个外设,HAL库为其配置了串口初始化函数。接下来看看串口初始化函数HAL_UART_Init相关知识,定义如下:HAL_StatusTypeDefHAL_UART_Init(UART_HandleTypeDef*huart);该函数只有一个入口参数huart,为UART_HandleTypeDef结构体指针类型,俗称串口句柄,它的使用会贯穿整个串口程序。一般情况下,会定义一个UART_HandleTypeDef结构体类型全局变量,然后初始化各个成员变量。接下来看看结构体UART_HandleTypeDef的定义:typedefstruct{USART_TypeDef *Instance;UART_InitTypeDef Init;uint8_t *pTxBuffPtr;uint16_t TxXferSize;IOuint16_t TxXferCount;uint8_t *pRxBuffPtr;uint16_t RxXferSize;IOuint16_t RxXferCount;DMA_HandleTypeDef *hdmatx;DMA_HandleTypeDef *hdmarx;HAL_LockTypeDef Lock;IOHALUARTStateTypeDef gState;IOHALUARTStateTypeDefRxState;__IOuint32_t ErrorCode;}UART_HandleTypeDef; 该结构体成员变量非常多,一般情况下载调用函数HAL_UART_Init对串口进行初始化的时候,只需要先设置Instance和Init两个成员变量的值。2)使能串口和GPIO口时钟。要使用串口,所以必须使能串口时钟和使用到的GPIO口时钟。例如要使用串口1,所以必须使能串口1时钟和GPIOA时钟(串口1使用的是PA9和PA10)。3)GPIO口初始化设置(速度、上下拉等)以及复用映射配置。4)开启串口相关中断,配置串口中断优先级。5)编写中断服务函数。串口1中断服务函数为:voidUSART1_IRQHandler(void);当发生中断的时候,程序就会执行中断服务函数。然后在中断服务函数中编写它们相应的逻辑代码即可。6)串口数据接收和发送。STM32F4的发送与接收是通过数据寄存器USART_DR实现的,这是一个双寄存器,包含了TDR和RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据时,也是存在该寄存器内。HAL库操作USART_DR寄存器发送数据的函数是:HAL_StatusTypeDefHAL_UART_Transmit(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout);通过该函数向串口寄存器USART_DR写入一个数据。HAL库操作USART_DR寄存器读取串口接收到的数据的函数是:HAL_StatusTypeDefHAL_UART_Receive(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout);通过该函数可以读取串口接收到的数据。为利用USART实现开发板与计算机的通信,需要用到一个USB转USART的IC电路,选择CH340G芯片实现这个功能。CH340G是一个USB总线的转接芯片,实现USB转USART、USB转IrDA或者USB转打印机接口。使用其USB转USART功能,具体电路设计如图8-5所示。在本实例中,编写一个程序实现开发板与计算机串口调试助手通信,在开发板上电时通过USART1发送一串字符串给计算机,然后开发板进入中断接收等待状态,如果计算机有发送数据过来,开发板就会产生中断,在中断服务函数接收数据,并马上把数据返回发送给计算机。8.4.2STM32F4的USART串行通信应用硬件设计图8-5USB转USART的硬件电路设计STM32F407ZGT6有四个USART和两个UART,其中USART1和USART6的时钟来源于APB2总线时钟,其最大频率为84MHz,其他四个的时钟来源于APB1总线时钟,其最大频率为42MHz。USART_InitTypeDef结构体成员用于设置USART工作参数,并由外设初始化配置函数,比如MX_USART1_UART_Init()调用,这些设定参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。初始化结构体定义在stm32f4xx_hal_usart.h文件中,初始化库函数定义在stm32f4xx_hal_usart.c文件中,编程时可以结合这两个文件内注释使用。8.4.3 STM32F4的USART串行通信应用软件设计USART_InitTypeDef结构体如下。typedefstruct{uint32_tBaudRate;//波特率uint32_tWordLength;//字长uint32_tStopBits;//停止位uint32_tParity;//校验位uint32_tMode;//UART模式uint32_tHwFlowCtl;//硬件流控制uint32_tOverSampling;//过采样模式}USART_InitTypeDef;这些结构体成员说明如下,其中括号{}内的文字是对应参数在STM32HAL库中定义的宏:(1)BaudRate:波特率设置。一般设置为2400、9600、19200、115200。HAL库函数会根据设定值计算得到UARTDIV值,并设置UART_BRR寄存器值。(2)WordLength:数据帧字长,可选8位或9位。它设定UART_CR1寄存器的M位的值。如果没有使能奇偶校验控制,一般使用8数据位;如果使能了奇偶校验则一般设置为9数据位。(3)StopBits:停止位设置,可选0.5个、1个、1.5个和2个停止位,它设定USART_CR2寄存器的STOP[1:0]位的值,一般选择1个停止位。(4)Parity:奇偶校验控制选择,可选USART_PARITY_NONE(无校验)、USART_PARITY_EVEN(偶校验)以及USART_PARITY_ODD(奇校验),它设定UART_CR1寄存器的PCE位和PS位的值。(5)Mode:UART模式选择,有USART_MODE_RX和USART_MODE_TX,允许使用逻辑或运算选择两个,它设定USART_CR1寄存器的RE位和TE位。(6)HwFlowCtl:设置硬件流控是否使能或禁能。硬件流控可以控制数据传输的进程,防止数据丢失,该功能主要在收发双方传输速度不匹配的时候使用。(7)OverSampling:设置采样频率和信号传输频率的比例。1.通过STM32CubeMX新建工程通过STM32CubeMX新建工程的步骤如下:(1)新建文件夹。在Demo目录下新建文件夹USART,这是保存本章新建工程的文件夹。(2)新建STM32CubeMX工程。在STM32CubeMX开发环境中新建工程。(3)选择MCU或开发板。CommercialPartNumber和MCUs/MPUsList选择STM32F407ZGT6,选择StartProject启动工程。(4)保存STM32CubeMX工程。执行STM32CubeMX菜单File→SaveProject命令,保存工程。(5)生成报告。执行STM32CubeMX菜单File→GenerateReport命令生成当前工程的报告文件。(6)配置MCU时钟树。在STM32CubeMXPinout&Configuration子页面下,选择SystemCore→RCC,HighSpeedClock(HSE)根据开发板实际情况,选择Crystal/CeramicResonator(晶体/陶瓷晶振)。(7)配置MCU外设。首先配置USART1,在STM32CubeMXPinout&Configuration子页面下选择Connectivity→USART1,对USART1进行设置。Mode选择Asynchronous,HardwareFlowControl(RS232)选择Disable,ParameterSettings具体配置如图8-6所示。图8-6USART1配置页面NVIC配置页面如图8-7所示。图8-7NVIC配置页面在CodeGeneration子页面,Selectforinitsequenceordering栏勾选USART1globalinterrupt,NVICCodeGeneration配置页面如图8-8所示。图8-8NVICCode

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论