Cubemx配置串口DMA數據傳輸
摘要:串口功能十分簡單,配置串口DMA傳輸主要是為了熟悉DMA配置過程,所以編寫了一個簡單的串口回顯功能(自收自發),利用串口空閑中斷,+DMA來進行數據傳輸。
Cubemx配置
- 配置串口
- 配置DMA
- 打開串口中斷
- 記得配置時鍾
根據個人使用MCU配置就好
個人代碼編寫
在生成代碼之后我們打開工程,使能串口空閑中斷,添加串口中斷的處理函數,添加串口DMA發送數據函數。
- 在while循環前添加使能串口空閑中斷和開啟DMA中斷接收
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能串口空閑中斷
HAL_UART_Receive_DMA(&huart1, RX_Buff,RX_LEN);//開啟DMA接收,不加此局自啟后接收一次空字符
- 添加個人的串口中斷處理函數
void MX_RXCallBack(UART_HandleTypeDef *huart)
{
uint8_t tmp_flag,temp;
tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);
if((tmp_flag != RESET))
{
HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_DMAStop(&huart1);
temp=__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
HAL_UART_Receive_DMA(&huart1,RX_Buff,RX_LEN);
RX_Count= RX_LEN - temp;
RX_flag = 1;
}
}
此函數要在生成的Src目錄下的stm32xxxx_it.c中的void USART1_IRQHandler(void)函數中調用
3. main函數中對接收到的數據進行處理(通過串口發送出去)
if (RX_flag)
{
if(HAL_UART_Transmit(&huart1,RX_Buff,RX_Count,1000)!=HAL_OK){
printf("error\r\n");
}
RX_flag=0;
memset(RX_Buff,0,RX_Count);
}r
上面程序添加至主函數中的while循環內
總計
在調試過程中遇到DMA傳輸數據不通的現象,同過調試發現cubemx在生成串口DMA代碼時候,將串口1的DMA初始化的時鍾放在串口DMA初始化的后面,導致DMA串口初始化失敗,在調試串口3的時候代碼又是正確的,所以不可盲目使用cubemx工具。一旦有錯誤,比較難調試。導致我找了一天。