退出嵌入式单片机原理及应用电气工程学院仪器科学与工程系1ARM嵌入式系统概述2STM32单片机结构和最小系统3基于标准外设库的C语言程序设计基础4STM32通用输入输出GPIO5STM32外部中断6STM32通用定时器7STM32通用同步/异步收发器USART8直接存储器存取DMA9STM32的模数转换器ADC10STM32的集成电路总线I2C11STM32的串行外设接口SPI第7章STM32通用同步/异步收发器USART7.1串行通信基础7.2STM32的USART的结构特性7.3USART相关寄存器7.4STM32串行通信的工作方式7.5USART应用设计7.6串行通信接口抗干扰设计退出7.1串行通信的基本概念7.1.1并行通信与串行通信计算机的CPU与外部设备之间的信息交换,以及计算机与计算机之间的信息交换过程称为通信。1.并行通信数据字节的各位同时传送的通信方式。并行通信的优点是数据传送速度快,缺点是占用的传输线条数多,适用于近距离通信。2.串行通信:数据字节的各位一位一位地依次传送的通信方式。串行通信的速度慢,但占用的传输线条数少,适用于远距离的数据传送。3.波特率:每秒钟传送的二进制数据的位数。串行通信数据传输形式:异步(AsynchronousCommunication)同步(SynchronousCommunication)串行通信的方式:单工(a)、半双工(b)和全双工(c)(simplexhalfduplexfullduplex)发送器A站接收器B站单工通信(a)发收A站发收B站发收A站发收B站(b)(c)7.1.2串行通信方式7.1.2串行通信方式异步通信方式:单片机的串行通信使用的是异步串行通信,异步通信是指发送方和接收方采用独立的时钟,即双方没有一个相同的参考时钟作为基准。在异步通信中数据一般以一个字符为单位进行传送。用一帧来表示一个字符,一帧信息由起始位(为0信号,占1位)、数据位(传输时低位在先,高位在后)、奇偶较验位(可要可不要)和停止位(为1信号,可1位、1位半或2位)组成。同步通信方式:在同步通信中,每个数据块的开头以同步字符SYN加以指示,使发送与接受双方取得同步。数据块的各字符之间没有起始位和停止位,提高了通信的速度。但为了能保持同步传送,在同步通信中须用一个时钟来协调收发器的工作,这就增加了设备的复杂性。7.1.3串行通信的数据传输形式-异步通信格式7.1.3串行通信的数据传输形式-异步通信格式7.1.3串行通信的数据传输形式-异步通信格式7.1.3串行通信的数据传输形式-异步通信格式7.1.4波特率7.2STM32的USART的结构特性STM32有3-5个的全双工的异步串行通信USART接口,可实现设备之间的串行数据传输。外部引脚:接收数据输入(RX)发送数据输出(TX)清除发送(nCTS)发送请求(nRTS)发送器时钟输出(CK)内部包括:发送数据寄存器(TDR)接收数据寄存器(RDR)移位寄存器IrDA串行红外编解码模块硬件数据流控制器、时钟控制、发送控制、唤醒单元、接收控制、中断控制和波特率控制等。PA口16脚PB口16脚PC口3脚PD口2脚USART2_TX:USART2_RX::USART1_TX:USART1_RXUSART3_RX:USART3_TX:串口2串口1串口3STM32F103Cx:拥有3个USARTPA口16脚PB口16脚PC口16脚PD口3脚:USART1_RTS:USART1_CTS:USART1_RX:USART1_TX:USART1_CKUSART2_CTS:USART2_RTS:USART2_TX:USART2_RX:USART2_CK::USART3_RTS:USART3_CTS:USART3_CKUSART3_RX:USART3_TX:STM32F103RBT6包含3个USART:USART1、USART2、USART3。CR1CR37.3USART相关寄存器USART的功能是通过操作相应寄存器实现的数据寄存器(USART_DR)控制寄存器1(USART_CR1)控制寄存器2(USART_CR2)控制寄存器3(USART_CR3)状态寄存器(USART_SR)波特比率寄存器(USART_BRR)保护时间和预分频寄存器(USART_GTPR)数据寄存器(USART_DR):用于保存接收或者发送的数据7.3USART相关寄存器数据寄存器(USART_DR):用于保存接收或者发送的数据7.3USART相关寄存器控制寄存器1(USART_CR1)UE:USART使能0:USART分频器和输出被禁止1:USART使能M:字长0:1位起始位,8位数据位,n个停止位1:9位数据位WAKE:唤醒方式0:被空闲总线唤醒1:被地址标记唤醒PCE:校验控制使能PS:校验选择0:偶校验1:奇校验PEIE,TXEIE,TCIE,RXNEIE,IDLEIETE:发送使能RE:接收使能RWU:接收唤醒SBK:发送断开帧7.3USART相关寄存器控制寄存器2(USART_CR2)LINEN:LIN模式使能STOP[1:0]:停止位个数CLKEN:时钟使能CPOL:时钟极性CPHA:时钟相位LBCL:最后一位时钟脉冲LBDIE:LIN断开符检测中断使能LBDL:LIN断开符检测长度ADD[3:0]:本设备USART节点的地址7.3USART相关寄存器控制寄存器3(USART_CR3)7.3USART相关寄存器控制寄存器3(USART_CR3)DMAT:DMA使能发送DMAR:DMA使能接收7.3USART相关寄存器状态寄存器(USART_SR)CTS:CTS标志LBD:LIN断开检测ORE:过载错误NE:噪声错误标志FE:帧错误标志TXE:发送数据寄存器空当TDR寄存器的数据被硬件转移到移位寄存器的时候,由硬件置位,可以通过操作USART_DR寄存器清除此位TC:发送完成当包含数据的一帧发送完,并且TXE=1时,由硬件置位,由软件序列清除(先读USART_SR,然后写入USART_DR)RXNE:读数据寄存器非空当RDR移位寄存器中数据转移到USART_DR寄存器中,由硬件置位,通过读USART_DR清除此位IDLE:总线空闲监测PE:校验错误7.3USART相关寄存器波特率发生器(USART_BRR)DIV_Mantissa[11:0]:USARTDIV的整数部分DIV_Fraction[3:0]:USARTDIV的小数部分7.3USART相关寄存器保护时间和预分频寄存器(USART_GTPR)7.3USART相关寄存器7.4STM32串行通信的工作方式7.4.1数据发送和接收1.数据发送(1)通过在USART_CR1寄存器上置位UE位来激活USART。(2)编程USART_CR1的M位来定义字长。(3)在USART_CR2中编程停止位的位数(4)如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按照多缓冲器通信中的描述配置DMA寄存器。7.4.1数据发送和接收1.数据发送(5)利用USART_BRR寄存器选择要求的波特率。(6)设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。(7)把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。在只有一个缓冲器的情况下,对每个待发送的数据重复本步骤。(8)在USART_DR寄存器中写入最后一个数据后,要等待TC=1,它表示最后一个数据帧的传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输。(1)将USART_CR1寄存器的UE置1来激活USART;(2)编程USART_CR1的M位来定义字长;(3)在USART_CR2中编写停止位的个数;2.数据接收7.4.1数据发送和接收(4)如果需多缓冲器通信,选择USART_CR3中的DMA使能位(DMAR),按照多缓冲器通信所要求的配置DMA寄存器;(5)利用波特率寄存器USART_BRR选择所需的波特率;(6)设置USART_CR1的RE位,激活接收器,使它开始寻找起始位。2.数据接收7.4.1数据发送和接收7.4.2硬件流控制硬件流控制常用的有RTS/CTS流控制和DTR/DSR(数据终端就绪/数据设置就绪)流控制。硬件流控制必须将相应的电缆线连上,用RTS/CTS(请求发送/清除发送)流控制时,应将通讯两端的RTS、CTS线对应相连,数据终端设备(如计算机)使用RTS来起始调制解调器或其它数据通讯设备的数据流,而数据通讯设备(如调制解调器)则用CTS来起动和暂停发往计算机的数据流。这种硬件握手方式的过程为:我们在编程时根据接收端缓冲区大小设置一个高位标志(可为缓冲区大小的75%)和一个低位标志(可为缓冲区大小的25%),当缓冲区内数据量达到高位时,我们在接收端将RTS线置高电平,当发送端的程序检测到CTS为高后,就停止发送数据,直到接收端缓冲区的数据量低于高位而将RTS置低电平。RTS用来标明接收设备有没有准备好接收数据。什么是硬件流控制模式?硬件流控制:利用nCTS输入和nRTS输出可以控制2个设备间的串行数据流7.4.2硬件流控制7.5USART应用设计7.5.1USART常用库函数STM32标准库中提供了几乎覆盖所有USART操作的函数,所有USART相关函数均在stm32f10x_usart.c和stm32f10x_usart.h中定义和声明库函数:USART_DeInit函数USART_Init函数USART_StrucInit函数USART_Cmd函数USART_ITConfig函数USART_DMACmd函数USART_SetAddress函数USART_WakeUpConfig函数USART_ReceiverWakeUpCmd函数USART_LINBreakDetectionConfig函数USART_LINCmd函数USART_SendData函数7.5.1USART常用库函数库函数(续):USART_ReceiveData函数USART_SendBreak函数USART_SetGuardTime函数USART_SetPrescaler函数USART_SmartCardCmd函数USART_SmartCardNackCmd函数USART_HalfDuplexCmd函数USART_IrDAConfig函数USART_IrDACmd函数USART_GetFlagStatus函数USART_ClearFlag函数USART_GetITStatus函数USART_ClearITPendingBit函数7.5.1USART常用库函数USART_Init(USART1,&USART_InitStructure);7.5.1USART常用库函数——USART_Init()}typedefstruct{uint32_tUSART_BaudRate;uint16_tUSART_WordLength;uint16_tUSART_StopBits;uint16_tUSART_Parity;uint16_tUSART_Mode;uint16_tUSART_HardwareFlowControl;}USART_InitTypeDef;7.5.1USART常用库函数——USART_Init()USART_InitTypeDefUSART_BaudRate该参数用来设置串口传输的波特率。波特率可以由以下公式计算:波特率=fPCLK/(16*USARTDIV)IntegerDivider=((APBClock)/(16*(USART_InitStruct-USART_BaudRate)))FractionalDivider=((IntegerDivider-((u32)IntegerDivider))*16)+0.57.5.1USART常用库函数——USART_Init()STM32单片机常用的波特率及其误差:7.5.1USART常用库函数——USART_Init()USART