STM32 串口发送配置流程

来源:互联网 发布:供应商数据分析 编辑:程序博客网 时间:2024/05/29 12:26

串口字节发送流程:

  1. 编程USARTx_CR1的M位来定义字长。
  2. 编程USARTx_CR2的STOP位来定义停止位位数。
  3. 编程USARTx_BRR寄存器确定波特率。
  4. 使能USARTx_CR1的UE位来使能USARTx。
  5. 如果进行多缓冲通信,配置USARTx_CR3的DMA使能(DMAT)。
  6. 使能USARTx_CR1的TE位使能发送器。
  7. 向发送数据寄存器TDR写入要发送的数据。
  8. 向TDR寄存器写入最后一个数据后,等待状态寄存器USARTx_ISR的TC位置1,传输完成。

配置步骤1-6 : 配置字长,停止位,奇偶校验位,波特率等:

HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef * huart);
该函数内部会引用标识符 HAL_USART_ENABLE使能相应串口。

例程如下:

void uart_init(u32 bound){       //UART初始化设置    UART1_Handler.Instance=USART1;                      //USART1    UART1_Handler.Init.BaudRate=bound;                  //波特率    UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //字长位8位    UART1_Handler.Init.StopBits=UART_STOPBITS_1;        //一位停止位    UART1_Handler.Init.Parity=UART_PARITY_NONE;         //无奇偶校验位    UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //无硬件流控    UART1_Handler.Init.Mode=UART_MODE_TX_RX;            //收发模式    HAL_UART_Init(&UART1_Handler);                      //HAL_UART_Init()会使能UART1    HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断;}

步骤7-8发送数据和等待发送完成

HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef * huart,uint8_t *pTxdata,uint16_t Size,uint32_t Timeout);

首先要提一下__weak关键字:
函数前面加__weak修饰符,我们称之为弱函数。对于弱函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候会选择用户定义的函数。如果用户没有定义,那么函数的内容就是弱函数定义的内容。
这里写图片描述

__weak 关键字的好处:
1.对于事先定义好的一个流程,我们只希望修改流程中的某部分与用户相关的代码,这个时候我们可以采用弱函数定义一个空函数,然后让用户自行定义该函数。这样的好处是我们不会对既有程序流程做任何修改。
2.HAL库中大量使用__weak关键字修饰外设回调函数。
3.外设回调函数供用户编写MCU相关程序,大大提高程序的通用性,移植性。

串口句柄如下所示:

这里写图片描述

我们可以看到在串口句柄中存在一个串口参数初始化结构体,具体内容如下所示:

这里写图片描述

接下来描述串口发送程序的总体配置过程(HAL库):

1.初始化串口相关参数,使能串口:HAL_USRT_Init();
2.串口相关IO口的配置,复用配置:
在HAL_UART_MspInit中调用HAL_GPIO_Init();
3.发送数据并等待发送数据完成:
HAL_UART_Transmit();