天天看點

STM32F407HAL庫學習之路(四):DMA方式實作序列槽資料收發(一)、DMA方式:(二)、DMA方式所用到的HAL庫函數(三)、示例代碼

我使用的序列槽3進行調試

目錄

(一)、DMA方式:

(二)、DMA方式所用到的HAL庫函數

(三)、示例代碼

(一)、DMA方式:

在主存儲器和外設之間開辟直接的資料通道,可以進行基本的資料通道,可以進行基本上不需要CPU接入的記憶體和外設之間的資訊傳遞,這樣不僅保證了CPU的高效率也保證了高速外設的需要,一般序列槽我們不推薦使用DMA方式進行序列槽資料的收發,因為DMA的優先級是遠高于中斷和不同的序列槽收發的。當開有多個序列槽工作時可能會由于優先級的問題使得其他序列槽的工作任務被搶占而無法是正常工作。

(二)、DMA方式所用到的HAL庫函數

//發送資料
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData,
uint16_t Size, uint32_t Timeout);
//接收資料
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData,
uint16_t Size, uint32_t Timeout);
//發送中斷
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *
pData, uint16_t Size);
//接收中斷
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData
, uint16_t Size);
//使用DMA發送
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *
pData, uint16_t Size);
//使用DMA接收
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *
pData, uint16_t Size);
//DMA暫停
HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart);
//DMA恢複
HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart);
//DMA停止
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart);
//序列槽回調函數
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
           

(三)、示例代碼

#define UART3_DMA
uint8_t IRMA[]={"Welcome to UART3_DMA\r\n"};//示例字元串,用來驗證是否進入序列槽DMA
uint8_t MData;//序列槽3接受到的資料
           
#ifdef UART3_DMA
    HAL_UART_Transmit_DMA(&huart3,&IRMA,sizeof(IRMA));
    HAL_UART_Receive(&huart3, &MData, 1,0xff);//觸發DMA方式序列槽收發,使用0xff降低DMA的發送速度
#endif
           
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

#ifdef UART3_DMA
  HAL_UART_Transmit(&huart3, &MData, 1,0xff);
  HAL_UART_Receive_DMA(&huart3, &MData,1);
#endif
}