從今天開始定時更新一下有關STM32 HAL庫學習的程序,主要是對HAL庫函式的所有講解,本章是關于uart串口的函式,
1、HAL_USART_Init(USART_HandleTypeDef * husart)
初始化串口的的函式:
用法為
UART_HandleTypeDef huart1;
huart1.xxx = ssss;
...
HAL_USART_Init(&huart1); //需要注意點的是函式的輸入引數是指標型別
UART_HandleTypeDef huart4;
huart4.Instance = UART4;
huart4.Init.BaudRate = 115200;
huart4.Init.WordLength = UART_WORDLENGTH_8B;
huart4.Init.StopBits = UART_STOPBITS_1;
huart4.Init.Parity = UART_PARITY_NONE;
huart4.Init.Mode = UART_MODE_TX_RX;
huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart4.Init.OverSampling = UART_OVERSAMPLING_16;
huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart4.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart4) != HAL_OK)
2、void HAL_USART_MspInit (USART_HandleTypeDef * husart)
串口回呼函式,主要進行硬體部分的初始化
例如開啟串口的時鐘和管腳的配置,本函式被上一個函式自動呼叫,
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};
if(uartHandle->Instance==UART4)
{
/* USER CODE BEGIN UART4_MspInit 0 */
/* USER CODE END UART4_MspInit 0 */
/* UART4 clock enable */
__HAL_RCC_UART4_CLK_ENABLE();
__HAL_RCC_GPIOI_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**UART4 GPIO Configuration
PI9 ------> UART4_RX
PA0 ------> UART4_TX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* UART4 interrupt Init */
HAL_NVIC_SetPriority(UART4_IRQn, 1, 2);
HAL_NVIC_EnableIRQ(UART4_IRQn);
/* USER CODE BEGIN UART4_MspInit 1 */
/* USER CODE END UART4_MspInit 1 */
}
3.HAL_StatusTypeDef HAL_USART_Transmit (USART_HandleTypeDef * husart, uint8_t * pTxData, uint16_t Size, uint32_t Timeout);
串口發送資料的函式,最重要的函式之一,單工以阻塞模式發送大量資料,
huart :要發送資料的串口指標,ptxData:要發送的資料,注意此處的指標形式,Size:發送資料的長度(位元組數) Timeout:發送資料超時時間
發送資料的大小要注意是u8型別的(0-255)
HAL_UART_Transmit(&huart4,"222",3,2);
//發送一個字串
u8 num = 10;
HAL_UART_Transmit(&huart4,&num,1,2);
//發送一個數字
u16 num = 0xffde;
u8 temp;
temp = num>>8;
HAL_UART_Transmit(&huart4,&temp,1,1);
temp = num;
HAL_UART_Transmit(&huart4,&temp,1,1);
//發送一個十六位的資料
注意:使用本函式發送十六位或者二十四位資料的時候下面的方法是錯誤的:
u16 num = 0x1234;
HAL_UART_Transmit(&huart4,&num,2,2);
此方法列印出的資料為 34 12 ,不是想要輸出的1234需要注意,
4、HAL_StatusTypeDef HAL_UART_Receive (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size,uint32_t Timeout)
串口接收資料的庫函式,阻塞的方式接收資料,
huart :要發送資料的串口指標,pData:接收資料快取地址,注意此處的指標形式,Size:接收資料的長度(位元組數) Timeout:資料接收等待時間,CPU等待這個時間用來接收資料,
注意本函式不會因為設定接收接收字符數和實際接收到的資料量不一致而發生沖突,接收到的資料小于設定接收量時少的那部分補零,多于設定量時直截取需要的資料量,
uint16_t numd[3];
HAL_UART_Receive(&huart4,numd,3,1000);
HAL_UART_Transmit(&huart4,numd,3,1);
//等一秒時間接收三位資料
5、HAL_StatusTypeDef HAL_UART_Transmit_IT (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
使用中斷的方式發送資料,對應上面的阻塞方式發送資料,
本函式的使用需要慎重考慮前后程式,要注意本函式發送方式為中斷方式,如果本函式后面直接跟著用HAL_UART_Transmit函式,那么后面資料不會發送,可通過增加短延時解決
uint16_t numd[3];
HAL_UART_Receive(&huart4,numd,3,1000);
while(HAL_UART_Transmit_IT(&huart4,numd,3)==HAL_OK);
HAL_Delay(10); //不加延時以下資料無法使用阻塞方式發送
num1= num23>>8;
HAL_UART_Transmit(&huart4,&num1,1,1);
num1 = num23;
HAL_UART_Transmit(&huart4,&num1,1,1);
6、HAL_StatusTypeDef HAL_UART_Receive_IT (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
一種中斷模式接收資料的函式,
huart :接收資料串口指標,pdata 接收區的指標 size 接受資料量位元組長度,一般設定接收長度為1,每次接受一個位元組的資料就進入中斷處理,
注意如果設定接收資料不為1,而是某個固定的值,當串口接受的資料量不滿足這個值的時候,串口中斷不會被觸發,一直等待接收資料滿足設定值才會觸發中斷,
本函式必須在接受回呼函式中再次呼叫才能經行下一次的接收,
#define num 1
uint16_t numd[num];
void UART_Init()
{
.....
HAL_UART_Receive_IT(&huart4,numd,num);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);//接收完成回呼函式
{
HAL_UART_Receive_IT(&huart,numd,num);
}
7、HAL_StatusTypeDef HAL_UART_Transmit_DMA (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
huart :接收資料串口指標,pdata 發送資料陣列的首地址 size 發送資料量位元組長度,使用這個函式之前需要做uart函式關于DMA設定的初始化,
#define SEND_BUF_SIZE 6
u8 SendBuff[SEND_BUF_SIZE]="123456"; //發送資料緩沖區
UART_HandleTypeDef UART1_Handler;
HAL_UART_Transmit_DMA(&UART1_Handler,SendBuff,SEND_BUF_SIZE);//開啟DMA傳輸
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277410.html
標籤:其他
