串口字节发送流程:
编程USARTx_CR1的M位来定义字长。
编程USARTx_CR2的STOP位来定义停止位位数。
编程USARTx_BRR寄存器确定波特率。
使能USARTx_CR1的UE位来使能USARTx。
如果进行多缓冲通信,配置USARTx_CR3的DMA使能(DMAT)。
使能USARTx_CR1的TE位使能发送器。
向发送数据寄存器TDR写入要发送的数据。
向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();
上一篇:STM32小白入门(第六天)-------串口通信
下一篇:STM32 串口通讯 发送 接收
推荐阅读最新更新时间:2024-03-16 16:12