目录
一.USART
USART支持大部分电子设备之间的通讯。支持电脑与单片机,单片机与单片机之间的通讯。
STM32F10x系列USART引脚有5个,分别是USART1-5。其中USART1挂载在APB2总线上,其余四个挂载在APB1上。
每个USART都包括常用引脚TX,RX,(SCLK,nCTS,nRTS,n表示低电平有效)。SCLK用在同步通信时。查找手册中引脚的描述,找到各个USART的对应引脚。
复用功能IO和调试配置AFIO用来实现重映射。
二.数据发送/接收的相关寄存器和流程
数据寄存器USART_DR:9位有效,包括一个发送数据寄存器TDR和一个接收数据寄存器RDR。一个地址对应两个物理内存。
USART的控制寄存器有CR1,CR2,CR3。
- CR1的M位决定字长,0->8位,n个停止位;1->9位,n个停止位;
- STOP停止位
- PCE:使能校验控制
- PS:选择校验位
- PEIE:校验中断使能
- PE:校验错误
- UE:串口使能
- TE/RE:发送/接收使能
数据发送和接收流程:UE=1,TE=1;数据来自CPU/DMA->TDR->发送移位寄存器->TX
- TXE=1,数据被转移到移位寄存器,发送数据寄存器为空;TC:发送完成;
- UE=1,RE=1;数据来自RX引脚->接收移位寄存器->RDR->CPU/DMA
- RXNE:读数据寄存器非空;
- RXNEIE,TXEIE,TCIE都是数据在发送或者接收之后可以触发中断
三.数据传输的速度--波特率
波特率寄存器USART_BRR:USARTDIV的整数部分位4-15;小数部分位0-3;
波特率=时钟频率/(16*USARTDIV);USARTDIV是有小数部分的。小数部分写入值需要计算=实际的小数值*16。
四.USART使用固件库编程
USART初始化结构体成员:BaudRate,wordlength,stopsits,parity,mode,hardwareflowcontrol
同步时钟初始化结构体成员:clock,cpol极性,cpha相位,lastbit最后一个位的时钟脉冲 。同步时钟极性表示串口空闲时是低或高电平,相位=1表示第二个边沿进行数据捕获。极性和相位是配合使用的。
先配置串口初始化结构体成员,调用初始化函数;如果是异步通信,则不需要设置同步时钟;
- 串口初始化:void USART_Init(USART_TypeDef*USARTx,USART_InitTypeDef* USART_InitStruct)
- 中断配置:void USART_ITConfig(USART_TypeDef*USARTx,uint16_t USART_IT,FunctionalState NewState)
- 串口使能:void USART_Cmd(USART_TypeDef*USARTx,FunctionalState NewState)
- 数据发送:void USART_SendData(USART_TypeDef*USARTx,uint16_t,Data)
- 数据接收:void USART_ReceiveData(USART_TypeDef*USARTx,uint16_t,Data)
- 中断状态获取:ITStatus USART_GetITStatus(USART_TypeDef* USARTx,unit16_t USART_IT)
五.实战练习:
1.电脑将数据发送给单片机,单片机再将数据发送给电脑。
单片机完成数据接收和数据发送功能。选取一个串口为USART1,查表USART1的TX和RX是PA9和PA10两个GPIO口。
第一步,打开GPIO和USART外设的时钟。(注意,USART1挂载在APB2,其余挂载在APB1)
第二步,将这两个GPIO口分别设置为输出和输入。TX复用推挽输出,RX浮空输入。推挽输出,电平由内部电平决定;浮空输入,电平由外部电平决定。GPIO初始化。
第三步,配置USART的数据传输格式。使用USART初始化结构体,配置波特率,字长,停止位,校验,串口模式,硬件流控制。USART初始化。
以上是作为接收和发送的GPIO和USART传输数据的格式的初始化设置。
第四步,配置中断优先级NVIC。
第五步,使能接收中断。为什么要使能接收中断?电脑将数据发送给单片机后,触发接收中断,单片机将接收到的数据发送给电脑。
第六步,使能USART。USART_CMD
以上三步是对NVIC配置和使能,接收/发送中断使能,USART使能。
第七步,发送函数(中断触发后的任务,是中断服务函数,书写在it.c里),USART的发送函数在USART.h文件里可查看。
补充:1组USART接口一共有5个,除了最重要的TX,RX外,还有SCLK,RTS,CTS。nRTS是request to send请求发送,表示本设备可以接受电平信号;nCTS是clear to send允许发送,用于判断是否可以向外发送信息。n表示低电平有效。在USART结构体中有一个硬件流控制,可选择的参数中就有RTS和CTS,也就是说,RTS和CTS这两个引脚在需要使用到硬件流控制时,需要连接好。
六.USART串口调试
调试场景:单片机通过USB转串口连接电脑,电脑打开串口助手,波特率设置为和程序里一样的115200。
程序除了串口设置和串口中断函数之外,需要将printf修改一下,改为需要测试的串口输出数据。实际上,不修改printf的串口不会影响单片机与其他外设的数据交流,因为只要中断函数中的串口输出是正确的就行了。修改printf那部分的串口输出是为了在串口助手上看到相应的调试结果。
USART数据包:数据包传输格式有hex,和任意字符格式。如果是hex格式,在usart的中断函数里,需要区分出包头,包尾(开始位、停止位、校验位),来获得我们需要的数据。再判断接收到的数据来调用对应的函数,完成对应的任务。如果是任意字符格式,接收到的都是字符。如果需要作为数字来使用,那么后续的数据处理中,我们需要写字符转化为数字的程序。