USART串口

本文介绍了单片机程序调试中使用printf通过串口通信的方法,详细讲解了串行通信、数据传输方向、同步异步通信、波特率设置以及STM32F1的USART功能。此外,还展示了如何使用HAL库进行串口初始化、接收和中断处理。
摘要由CSDN通过智能技术生成

基础了解

  1. 单片机程序的调试,我们通过把printf的打印通过串口输出到电脑上,然后就可以很方便的进行软件程序的调试。
  2. 数据通信方式:串行通信、并行通信。
  3. 数据传输方向:单工(固定一个方向)、半双工(同时仅一个方向)、全双工(同时可以两个方向)。
  4. 数据同步方式:同步通信(双方按照同步时钟进行通信)、异步通信(没有同步时钟,数据中约定开始结束位;有些双方约定好传输速率)。
  5. 通信速率:比特率(bit/s)、波特率(码元/秒);码元-一定bit的数据信息量;
  6. 串口通信协议数据帧格式:
    在这里插入图片描述
    说明,校验位:奇校验(有效数据中1的个数为奇数,例如2个,则校验位置1);偶校验(有效数据中1的个数为偶数,例如2个,则校验位置0);0校验(校验位置0);1校验(校验位置1);无校验(不包含校验位)

STM32F1串口

stm32f1有2个UART和3个USART。USART1的时钟来源于APB2时钟,最大频率72MHZ;其它4个串口时钟来源于APB1时钟,最大频率36MHZ。
在这里插入图片描述
①USART信号引脚
TX:发送数据输出引脚
RX:接收数据输入引脚
SCLK:发送器时钟输出,适用于同步传输
SW_RX:数据接收引脚,属于内部引脚,用于智能卡模式
IrDA_RDI:IrDA 模式下的数据输入
IrDA_TDO:IrDA 模式下的数据输出
nRTS:发送请求,若是低电平,表示 USART 准备好接收数据
nCTS:清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送
②数据寄存器
USART_DR由TDR和RDR组成,具有读写权限;
当发送数据时,数据会写入到TDR;当接收数据时,数据会存储在RDR;
USART_DR低9位数据有效,其它位保留。第9位是否有效由USART_CR1寄存器的M位决定,当M位为0则表示8位数据字长;当M位为1则表示9为数据字长。(一般使用8位数据字长)
当使能校验位(USART_CR1中PCE位置1)进行发送数据,MSB的值是校验位的值。
③控制器
USART有专门的发送控制器,接收控制器,唤醒单元、中断控制等等。
④时钟和波特率
USART配置时钟和波特率。

baud = fck/(16 * USARTDIV)
fck是给串口的时钟(USART2\3\4\5的时钟源是PCLK1,USART1的时钟源是PCLK2)
USARTDIV存放在USART_BRR寄存器的低16位,DIV_Mantissa[11:0]存放整数部分,DIV_Fractionp[3:0]存放小数部分。

例如:115200 = 72000000 / (16 ∗ USARTDIV)
USARTDIV = 39.0625, 整数39即0x27;小数0.625即0.625*16 = 1 ;所以USART_BRR = 0x271

  1. 发送配置步骤:
    ①通过在USART_CR1寄存器上置位UE位来激活USART
    ② 编程USART_CR1的M位来定义字长。
    ③ 在USART_CR2中编程停止位的位数。
    ④ 如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中
    的描述配置DMA寄存器。
    ⑤ 利用USART_BRR寄存器选择要求的波特率。
    ⑥ 设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。
    ⑦ 把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。在只有一个缓冲器的情况
    下,对每个待发送的数据重复步骤7。
    ⑧ 在USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输。
  2. 接收配置步骤
    ① 将USART_CR1寄存器的UE置1来激活USART。
    ② 编程USART_CR1的M位定义字长
    ③ 在USART_CR2中编写停止位的个数
    ④ 如果需多缓冲器通信,选择USART_CR3中的DMA使能位(DMAR)。按多缓冲器通信所
    要求的配置DMA寄存器。
    ⑤ 利用波特率寄存器USART_BRR选择希望的波特率。
    ⑥ 设置USART_CR1的RE位。激活接收器,使它开始寻找起始位。

串口寄存器了解

1)串口时钟使能
串口1时钟使能,APB2ENR寄存器的USART1EN位。其它串口时钟使能,由APB1ENR寄存器对应位控制。
APB2ENR
APB2ENRAPB1ENR
APB1ENR
2)串口复位
开始配置外设的时候,都会先执行复位该外设操作。
APB2RSTR
APB2RSTR
APB1RSTR
APB1RSTR
3)串口波特率设置
每个串口都有自己的波特率寄存器USART_BRR。
USART_BRR
4)串口控制
每个串口都有3个控制寄存器USART_CR1~3。串口的很多配置都是通过这3个寄存器设置的。
USART_CR1,具体请查看手册
USART_CR1
USART_CR2
在这里插入图片描述
USART_CR3
在这里插入图片描述
5)数据发送与接收
在这里插入图片描述
6)串口状态
串口状态可以通过串口状态寄存器USART_SR读取。
在这里插入图片描述
RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。
TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:
1)读 USART_SR,写 USART_DR。
2)直接向该位写 0。

HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);//用于初始化异步模式的收发器。
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);//用于开启以中断的方式接收指定字节。数据接收在中断处理函数里面实现。
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);//该函数是 HAL 库中断处理公共函数,在串口中断服务函数中被调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值