144 stm32 USART串口的应用.docx
《144 stm32 USART串口的应用.docx》由会员分享,可在线阅读,更多相关《144 stm32 USART串口的应用.docx(14页珍藏版)》请在冰豆网上搜索。
![144 stm32 USART串口的应用.docx](https://file1.bdocx.com/fileroot1/2023-1/26/18f47052-a190-4706-af3d-196af1e8a8ba/18f47052-a190-4706-af3d-196af1e8a8ba1.gif)
144stm32USART串口的应用
一、串行通信的基本概念
(一)通信的基本概念
通信,最少要有两个对象,一个收,一个发。
通信方式分为同步通信和异步通信。
1.同步通信和异步通信
(1)同步通信
一般情况下同步通信指的是通信双方根据同步信号进行通信的方式(使用同一个时钟)。
比如通信双方有一个共同的时钟信号,大家根据时钟信号的变化进行通信,如:
SPI,I2C
(2)异步通信:
指数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定好通信的速度。
异步通信不需要同步信号,但是并不是说通信的过程不同布,如:
串口。
缺点:
因为使用的是不同的时钟,在传输数据时容易产生误差,当数据量大了之后误差就可能会很大。
优点:
不受时钟的限制
2.串行通信和并行通信的区别
串行通信:
指的是同一时刻只能收或发一个bit位信息。
因此只用1根信号线即可。
并行通信:
指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行
3.单工、半双工、全双工
单工:
要么收,要么发,只能做接收设备或者发送设备。
比如收音机
半双工:
可以收,可以发,但是不能同时收发,比如对讲机
全双工:
可以在同一时刻既接收,又发送。
手机
4.常见通信总结
SPI和IIC一般用于同一个设备上的两个芯片之间的通信,SPI和IIC的线实在板子上的那些个走线。
一般都是用于近距离通信。
UART用于两个设备之间的通信。
(二)USART介绍
通用同步异步收发器(USART)灵活地与外部设备进行全双工数据通信,满足外部设备对工业标准NRZ异步串行数据格式的要求。
USART通过小数波特率发生器提供了多种波特率。
它支持同步单向通信和半双工单线通信;还支持LIN(局域互联网络),智能卡协议与IrDA(红外数据协会)SIRENDEC规范,以及调制解调操作(CTS/RTS)。
而且,它还支持多处理器通信。
但依然是常用来当做串口,进行调试打印。
*UART是异步通信,USART是可以进行同步通信的
USART支持同步模式,因此USART需要同步始终信号USART_CK(如STM32单片机),通常情况同步信号很少使用,因此USART和一般单片机UART使用方式是一样的,都使用异步模式。
(三)串口的电路连接
两头都要接地。
开发板和PC相连需要转换器是因为电平不同。
(四)STM32f051串口
串口2是连接wifi芯片的
STM32F051内置多达两个通用同步/异步收发器(USART1和USART2),通信速度可达6Mbit/s
(五)串口的通信协议
0101000000
TXD串口输出0x05波形图、低位先发送:
一般串口通信能够传输5-8位,但是我们的32板子能够传输8-9位。
数据位的位数要事先设置好。
奇偶校验位:
数据位+奇偶校验位中的1的个数。
1:
数据位+奇偶校验位中1的个数为奇数。
0:
数据位+奇偶校验位中1的个数为偶数。
(六)波特率
在串行通信中,用“波特率”来描述数据的传输速率。
所谓波特率,既每秒传送的二进制位数,其单位为bps(bitspersecond)。
它是衡量串行数据速度快慢的重要指标。
国际上规定一个标准的波特率系列:
110、300、600、1200、1800、2400、4800、9600、115200、14.4Kbps、19.2Kbps、……
例如:
115200bps、指每秒传送115200位。
通信双方必须设置同样的同学速率才能正常通信
注意:
实际的数据没这么多,还包括起始位,结束位,校验位
二、串口寄存器介绍
我们一般来说的配置方式为8N1,
8:
数据位有8位
N:
没有奇偶校验位
1:
1位停止位
(一)控制寄存器——USART_CR1
(二)控制寄存器——USART_CR2
(三)波特率寄存器——USART_BRR
需要用到响应的公式来配置,但是我们用cubemax来配置的话,就不需要知道这个公式,都是用图形化做出的。
(四)中断和状态寄存器——USART_ISR
(五)串口数据的接收与发送
当不用FIFO方式的时候,先把数据放到TDR寄存器中,然后一位一位的发送
1.数据接收寄存器——USART_RDR
2.数据发送寄存器——USART_TDR
三、Stm32实现串口数据的收发
(一)串口硬件原理图
注意:
如果无法识别串口,清装好ch340串口驱动
(二)CubeMX中串口的配置
波特率,数据位,校验位...
(三)串口发送一个字符
voidUart_Putchar(uint8_tch)
{
while(!
(USART1->ISR&(1<<7)));//等待发送寄存器空
USART1->TDR=ch;//发送字符
}
voidUart_Putstring(uint8_t*str)
{
while(*str!
='\0')
{
Uart_Putchar(*str);
str++;
}
}
(四)串口接收一个字符
uint8_tUart_Getchar(void)
{
while(!
(USART1->ISR&(1<<5)));//等待收到一个字符的数据
returnUSART1->RDR;//返回收到的字符
}
四、HTL串口库函数的使用及printf的实现
(一)HAL库中串口的收发函数
Stm32f0xx_hal_uart.c文件中
功能:
串口的发送函数
原型:
HAL_UART_Transmit(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout)
参数:
huart:
串口号
Pdata:
发送的数据
Size:
发送的数据长度
Timeout:
超时,单位:
毫秒。
功能:
串口的接收函数
原型:
HAL_UART_Receive(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout)
参数:
huart:
串口号
Pdata:
接受的数据,收数据的buf
Size:
接受的数据长度,buf长度
Timeout:
超时,单位:
毫秒。
*注意buf的清空,不然会一直在接受。
(二)Printf()实现—串口重定向
printf函数调用的是c库中的fputc函数。
因此我们如果重新写了fputc函数,就可以改变printf函数的功能,可以向串口打印输出。
int fputc(int ch,FILE *f)
{
while((USART1->ISR&(1<<7)) == 0);
USART1->TDR=(uint8_t)ch;
return ch;
}
五、作业
●请描述串口通信协议
串口通信的协议顺序有起始位、数据位、奇偶校验位、停止位。
起始位:
因TX/RX是拉高状态平时为高电平,因此需要给一个低电平作为起始位。
数据位:
传送数据内容位数,数据位的位数要事先设置好。
我们用cubemx设置。
Stm32中,一般有奇偶校验就是9,没有奇偶校验就是8.
奇偶校验位:
数据位+奇偶校验位中的1的个数。
1:
数据位+奇偶校验位中1的个数为奇数。
0:
数据位+奇偶校验位中1的个数为偶数。
停止位:
高电平1~2位表示数据传输完毕。
1