串口發送程序配置過程(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 。