第7章-STM32通用同步异步收发器USART3.ppt
《第7章-STM32通用同步异步收发器USART3.ppt》由会员分享,可在线阅读,更多相关《第7章-STM32通用同步异步收发器USART3.ppt(90页珍藏版)》请在冰豆网上搜索。
退出,嵌入式单片机原理及应用,电气工程学院仪器科学与工程系,1ARM嵌入式系统概述2STM32单片机结构和最小系统3基于标准外设库的C语言程序设计基础4STM32通用输入输出GPIO5STM32外部中断6STM32通用定时器7STM32通用同步/异步收发器USART8直接存储器存取DMA9STM32的模数转换器ADC10STM32的集成电路总线I2C11STM32的串行外设接口SPI,第7章STM32通用同步/异步收发器USART,7.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),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_RX,USART3_RX:
USART3_TX:
串口2,串口1,串口3,STM32F103Cx:
拥有3个USART,PA口16脚,PB口16脚,PC口16脚,PD口3脚,:
USART1_RTS:
USART1_CTS:
USART1_RX:
USART1_TX:
USART1_CK,USART2_CTS:
USART2_RTS:
USART2_TX:
USART2_RX:
USART2_CK:
:
USART3_RTS:
USART3_CTS:
USART3_CK,USART3_RX:
USART3_TX:
STM32F103RBT6包含3个USART:
USART1、USART2、USART3。
CR1,CR3,7.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模式使能STOP1:
0:
停止位个数CLKEN:
时钟使能CPOL:
时钟极性CPHA:
时钟相位LBCL:
最后一位时钟脉冲LBDIE:
LIN断开符检测中断使能LBDL:
LIN断开符检测长度ADD3:
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_Mantissa11:
0:
USARTDIV的整数部分DIV_Fraction3:
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,7.5.1USART常用库函数USART_Init(),typedefstructuint32_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_InitTypeDef,USART_BaudRate该参数用来设置串口传输的波特率。
波特率可以由以下公式计算:
波特率=fPCLK/(16*USARTDIV)IntegerDivider=(APBClock)/(16*(USART_InitStruct-USART_BaudRate)FractionalDivider=(IntegerDivider-(u32)IntegerDivider)*16)+0.5,7.5.1USART常用库函数USART_Init(),STM32单片机常用的波特率及其误差:
7.5.1USART常用库函数USART_Init(),USART_WordLength该参数用来设置在一个帧数据传输中或者接收到的一个帧数据中,数据的位数。
该参数可取的值,USART_StopBits该参数用来设置停止位的数目。
该参数可取的值。
7.5.1USART常用库函数USART_Init(),USART_Parity该参数用来设置一帧数据中奇偶校验的模式。
参数可取的值,注意:
奇偶校验一旦使能,在发送数据的最高位插入经硬件计算得到的奇偶校验位(字长9位时的第9位,字长8位时的第8位)。
7.5.1USART常用库函数USART_Init(),USART_HardwareFlowControl该参数用来设置硬件流控制模式使能还是失能。
该参数可取的值。
7.5.1USART常用库函数USART_Init(),USART_Mode该参数用来设置串口模块发送,接收开启或者关闭。
该参数可取的值:
例:
异步串口1,速率9600,8位数据,1个停止位,无校验,无流量控制,接收发送使能。
7.5.1USART常用库函数USART_Init(),USART_InitStructure.USART_BaudRate=9600;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,7.5.1USART常用库函数USART_Init(),USART_Cmd(USART1,ENABLE);,7.5.1USART常用库函数USART_Cmd(),USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);,7.5.1USART常用库函数USART_ITConfig(),7.5.1USART常用库函数USART_ITConfig(),(帧,噪声,溢出错误),USART_SendData(USART3,0x26);,7.5.1USART常用库函数USART_SendData(),u16RxDATA;RxDATA=USART_ReceiveData(USART2);,7.5.1USART常用库函数USART_ReceiveData(),FlagStatusStatus;Status=USART_GetFlagStatus(USART1,USART_FLAG_TXE);,7.5.1USART常用库函数USART_GetFlagStatus(),7.5.1USART常用库函数USART_GetFlagStatus(),USART_ClearFlag(USART1,USART_FLAG_ORE);,7.5.1USART常用库函数USART_ClearFlag(),ITStatusErrorITStatus;ErrorITStatus=USART_GetITStatus(USART1,USART_IT_ORE);,7.5.1USART常用库函数USART_GetITStatus(),7.5.1USART常用库函数USART_GetITStatus(),USART_ClearITPendingBit(USART1,USART_IT_ORE);,7.5.1USART常用库函数USART_ClearITPendingBit(),7.5.2USART使用流程,USART基本配置流程(见右图)串口是IO口的复用功能:
PA9复用推挽输出;PA10浮空输入,7.5.3USART应用设计1串口收发数据,例1:
利用上位机的串口与STM32的USART1通信。
上位机通过键盘给STM32的串口发送字符,STM32将接收到的字符再传回上位机。
在上位机上通过串口调试助手显示结果。
intmain(void)uint16_ti;USART_Config();while
(1)if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)=SET)i=USART_ReceiveData(USART1);USART_SendData(USART1,i);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!
=SET);,7.5.3USART应用设计1串口收发数据(主程序-查询),voidUSART_Config(void)GPIO_InitTypeDefGPIO_InitStructure;USART_InitTypeDefUSART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init(GPIOA,7.5.3USART应用设计1串口收发数据(串口程序1),USART_InitStructure.USART_BaudRate=9600;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,7.5.3USART应用设计1串口收发数据(串口程序2),将程序下载到开发板,通过串口与PC机相连,打开串口调试助手,串口调试助手显示,7.5.3USART通信实例2串口发送数据,例2:
用串口2发送数据,上位机使用串口调试工具接收并显示。
串口发送完数据后跳变LED2灯。
7.5.3USART通信实例2串口发送数据(主程序),intmain(void)SystemInit();/配置系统时钟gpio_conf();/初始化LED和按键IO口USART2_Config();/初始化串口while
(1)for(unsignedinti=0;i0xfffe;i+)for(unsignedchark=0;k9;k+)asm(nop);Usart2_PutChar(0x34);/从串口2发送数据LED2B();,7.5.3USART应用设计2串口发送数据(串口设置1),voidUSART2_Config(void)/1)定义初始化结构体GPIO_InitTypeDefGPIO_InitStructure;USART_InitTypeDefUSART_InitStructure;/2)开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);,7.5.3USART应用设计2串口发送数据(串口设置2),/3)IO口初始化GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init(GPIOA,7.5.3USART应用设计2串口发送数据(串口设置3),/4)串口参数初始化USART_InitStructure.USART_BaudRate=115200;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART2,/串口2发送数据函数(查询)voidUsart2_PutChar(unsignedchardata)USART_SendData(USART2,data);while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)=RESET);/定义点亮、熄灭、跳变LED2#defineLED2ON()GPIOB-ODR|=GPIO_Pin_6#defineLED2OFF()GPIOB-ODR&=GPIO_Pin_6#defineLED2B()GPIOB-ODR=GPIO_Pin_6,7.5.3USART通信实例2串口发送数据,voidgpio_conf(void)GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);/*配置PB3-7外设为输出*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;/外设口线3-7GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT_PP;/设为推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/50MHzIO口GPIO_Init(GPIOB,7.5.3USART通信实例2串口发送数据(GPIO配置1),/*GPIOC外设时钟使能*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);/*配置PC0-3外设为输入*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;/外设口线0-3GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;/输入GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/50MHzIO口G