您当前的位置: 首页 >  ar

风间琉璃•

暂无认证

  • 1浏览

    0关注

    337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

STM32G4之UART

风间琉璃• 发布时间:2022-01-18 22:48:42 ,浏览量:1

文章目录
  • 前言
  • 一、UART原理
  • 二、UART配置
    • 1.IO引脚的配置
    • 2.串口相关配置
    • 3.串口中断配置
  • 三、UART常用函数
    • 1.串口句柄
    • 2.HAL_UART_Transmit
    • 3.HAL_UART_Receive_IT
    • 4.HAL_UART_RxCpltCallback
  • 总结

一、UART原理

UART和USART: UART(universal asynchronous receiver and transmitter):通用异步收发器

USART(universal synchronous asynchronous receiver and transmitter):通用同步异步收发器

STM32G4有三个串口,这里以串口1为例 在这里插入图片描述 在这里插入图片描述 串口1的发送引脚是PA9,接收引脚是PA10

在这里插入图片描述 数据接收过程:数据从RX先进入到接收移位寄存器,数据缓存到接收缓存寄存器,然后后进入到接收数据寄存器,最终供CPU或者DMA来进行读取该寄存器,完成数据接收

数据发送过程:数据从CPU或者DMA传递过来,先进入发送数据寄存器,数据缓存到发送缓冲寄存器,后进入发送移位寄存器,最终通过TX发送出去

在这里插入图片描述

发送步骤: 1.向CR1的UE位写1使能串口。 2.向CR1的M位定义字长。 3.CR2的停止位数量进行编程。 4.对DMA进行配置。 5.配置BRR寄存器的波特率。 6.发送器对TE位置1,发送一个空闲帧作为第一次数据发送。 7.把要发送的数据写进USART_DR寄存器,硬件自动发送。TXE(DR数据是否为空标志)清零。 8.在写入最后一个数据字后,等待TC=1,表示最后一个数据帧的传输结束。 9.如果USART_CR1寄存器中的TCIE位被置位,则会产生中断。

在这里插入图片描述

接收过程: 1.使能CR1寄存器中的UE位。 2.修改CR1中的M位定义字长。 3.对CR2中的停止位数量进行编程。 4.配置DMA(如果需要)。 5.配置BRR选择波特率。 6.将CR1中的RE位置1.检测如下序列。检测序列表示开始接收1110X0X0X0000。因为发送前,先发送空闲帧,起始位又为高电平,所以,检测到从1→0的跳变后,就表示开始接收了。 7.接收到字符,RXNE(接收寄存器不为空)置1,表示移位寄存器内容传送到了RDR寄存器。 8.如果RXNEIE置1,产生接收中断。 9软件读取DR寄存器,RXNE自动清零,或者手动写入0清零。

串口在一定条件下也会产生中断的 在这里插入图片描述 用得最多的是串口的接收中断

二、UART配置 1.IO引脚的配置

在这里插入图片描述 先配置串口的引脚映射到复用功能(PA9–>USART_TX; PA10–>USART_RX),这里我们选择的是异步通信,这里一定要手动修改USART1的TX,RX。因为它默认的不是PA9和PA10引脚。

设置IO的工作模式 在这里插入图片描述 这里设置的是复用开漏输出(官方案例),个人认为设置为复用推挽输出也是可以的。

2.串口相关配置

主要是配置以下数据: 1.配置波特率 2.配置数据位,奇偶校验,停止位。 3.数据传输方向。 4.过采样(8倍,16倍。)一般16倍 5.串口的时钟使能。

在这里插入图片描述

3.串口中断配置

串口通信一般最简单的有两个中断:串口接收中断、串口发送中断。实际上应用中常用串口接收中断,这样可以在监测到有外部设备对本机通过串口发送数据时就可以马上进入中断服务函数,在服务函数中接收数据 在这里插入图片描述 使能串口中断,设置中断分组,然后设置中断优先级

小结: ‘在这里插入图片描述

三、UART常用函数 1.串口句柄

STM32CubeMX 定义一个结构体类型全局变量huart,为 UART_HandleTypeDef 结构体指针类型,俗称其为串口句柄,它的使用会贯穿整个串口程序

UART_HandleTypeDef huart1;

结构体 UART_HandleTypeDef:

typedef struct
{
	USART_TypeDef *Instance;
	UART_InitTypeDef Init;
	uint8_t *pTxBuffPtr;
	uint16_t TxXferSize;
	uint16_t TxXferCount;
	uint8_t *pRxBuffPtr;
	uint16_t RxXferSize;
	uint16_t RxXferCount;
	DMA_HandleTypeDef *hdmatx;
	DMA_HandleTypeDef *hdmarx;
	HAL_LockTypeDef Lock;
	__IO HAL_UART_StateTypeDef State;
	__IO uint32_t ErrorCode;
}UART_HandleTypeDef;

串口的初始化函数里面就是对该结构体成员变量进行初始化。 在这里插入图片描述

Instance 是 USART_TypeDef 结构体指针类型变量,它是执行寄存器基地址,实际上这个基地址 HAL 库已经定义好了,如果是串口 1,取值为 USART1 即可。

Init 是 UART_InitTypeDef 结构体类型变量,它是用来设置串口的各个参数,包括波特率,停止位等

typedef struct
{
	uint32_t BaudRate; //波特率
	uint32_t WordLength; //字长
	uint32_t StopBits; //停止位
	uint32_t Parity; //奇偶校验
	uint32_t Mode; //收/发模式设置
	uint32_t HwFlowCtl; //硬件流设置
	uint32_t OverSampling; //过采样设置
}UART_InitTypeDef

pTxBuffPtr, TxXferSize 和 TxXferCount 三个变量分别用来设置串口发送的数据缓存指针,发送的数据量和还剩余的要发送的数据量。接下来的三个变量 pRxBuffPtr, RxXferSize 和RxXferCount 则是用来设置接收的数据缓存指针,接收的最大数据量以及还剩余的要接收的数据量

hdmatx 和 hdmarx 是串口 DMA 相关的变量,指向 DMA 句柄

其他的三个变量就是一些 HAL 库处理过程状态标志位和串口通信的错误码

小结: 在这里插入图片描述

2.HAL_UART_Transmit

通过该函数向串口寄存器 USART_DR 写入一个数据,当向该寄存器写数据的时候,串口就会自动发送 函数原型:

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

huart:串口句柄 pData : 发送数据的地址 Size :发送数据的大小 Timeout :超时时间

在这里插入图片描述 eg:

void Usart_Proc(void)
{
	if((uwTick - uwTick_Usart_Set_Point)             
关注
打赏
1665385461
查看更多评论
0.0373s