串口发送程序配置过程(HAL库)
- 初始化串口相关参数,使能串口
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
该函数的参数是串口的基址,在stm32f429xx.h文件中,定义了8个UART_HandleTypeDef的值,分别是USART1、USART2、USART3、UART4、UART5、USART6、UART7、UART8,可以用HAL_UART_Init对这8个串口进行初始化,我们要用USART1,就填USART1
- 串口相关IO口配置,复用配置
在HAL_UART_MspInit中调用HAL_GPIO_Init函数
- 发送数据,并等待数据发送完毕
HAL_UART_Transmit()
具体代码
我们以STM32F4中的 PA9和PA10的UART1通信为例。
- 首先是初始化串口相关参数,使能串口,使用的函数是HAL_UART_Init(),我们定义一个函数来调用它,具体代码如下:
UART_HandleTypeDef usart_handler;void usart1_init(void)
{usart_handler.Instance = USART1; //指定用哪个串口usart_handler.Init.BaudRate = 115200; //波特率设置usart_handler.Init.HwFlowCtl = UART_HWCONTROL_NONE; //硬件流控制usart_handler.Init.Mode = UART_MODE_TX_RX; //接收or发送or接收发送//usart_handler.Init.OverSampling = usart_handler.Init.Parity = UART_PARITY_NONE; //奇偶校验usart_handler.Init.StopBits = UART_STOPBITS_1; //停止位usart_handler.Init.WordLength = UART_WORDLENGTH_8B; //字长HAL_UART_Init(&usart_handler);}
HAL_UART_Init函数要传入一个UART_HandleTypeDef 的指针,该指针指向一个结构体,我们要对其初始化。具体要初始化两个变量,一个变量是Instance ,指定使用哪个串口通信,另一个是Init,指明波特率、有无硬件控制流、模式、有无奇偶校验、有几个停止位以及每次传入的数据是几位。
- HAL_UART_Init初始完后,会自动调用HAL_UART_MspInit函数,在这个函数中,我们进行GPIO口的初始化以及使能,代码如下
//HAL_UART_Init会自动调用HAL_UART_MspInitvoid HAL_UART_MspInit(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_USART1_CLK_ENABLE();//GPIO口初始化就配置好了复用功能GPIO_Initure.Pin=GPIO_PIN_9; //PA9GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为USART1HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9GPIO_Initure.Pin=GPIO_PIN_10; //PA10HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10}}
因为要复用引脚,所以在配置GPIO口时,我们要配置Alternate变量,指明要复用的引脚功能,即GPIO_AF7_USART1,PA9和PA10作为USART1的引脚。
HAL_UART_MspInit每个HAL_UART_Init都会调用,我们不知道是哪一个串口调用的,所以我们要根据Instance 来判断是哪一个串口调用的。
- 两个函数配置完成后,我们就可以发送数据了,我们在main函数里面调用HAL_UART_Transmit来发送数据,具体代码为
int main(void)
{u8 buff[] = "send to rec";HAL_Init();Stm32_Clock_Init(360,25,2,8);delay_init(180);usart1_init();while(1) {HAL_UART_Transmit(&usart_handler,buff,sizeof(buff),1000);delay_ms(300);}}
HAL_UART_Transmit第一个参数指明用哪个串口来发送数据,第二个参数是指向数据的指针,第三个参数是数据的大小,第四个是 Timeout duration 。