之前沒有寫調試記錄的習慣,導致前段時間剛弄過的一個東西,現在拿起來要么翻之前的代碼,要么就再慢慢調,雖然知道自己肯定是可以戰勝困難,但總是浪費很多時間,所以以后準備多寫一些記錄,方便自己用的時候查。嘻嘻
STM32CubeMX這個工具用習慣了還是很爽的,就是有些傻逼的地方是,他并不能給你弄到位,有的東西還是得自己調一下。
打開串口并使能中斷后,如果要開啟DMA收發的功能,只需要使能對應的通道就可以了。

生成代碼的過程就不廢話了。
在串口初始化里面調用這個函數來定義串口中斷接受長度。
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, 1);
不要忘記在中斷函數里面再次調用。
一個完整的發送周期如下,清除完成標志也可以放在下次發送的開始。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { static uint8_t sta = 0; if(huart->Instance==USART1)//è?1?ê?′??ú1 { // USART_RX1_BUF[Usart1_len]=aRx1Buffer[0]; // Usart1_len++; // if(Usart1_len == 0x04) // { HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN); while(1) { if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//μè′yDMA2_Steam7′?ê?íê3é { __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//??3yDMA2_Steam7′?ê?íê3é±ê?? HAL_UART_DMAStop(&huart1); //′?ê?íê3éò?oó1?±?′??úDMA break; } // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx); } switch(sta) { case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break; case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break; case 2:mode = 0;sta = 0;break; } HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE); // } } if(huart->Instance==USART2)//è?1?ê?′??ú2 { HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN); while(1) { if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//μè′yDMA2_Steam7′?ê?íê3é { __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//??3yDMA2_Steam7′?ê?íê3é±ê?? HAL_UART_DMAStop(&huart2); //′?ê?íê3éò?oó1?±?′??úDMA break; } // __HAL_DMA_GET_COUNTER(&hdma_usart2_tx); } //·¢?í?óê?μ?μ?êy?Y while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET); //μè′y·¢?í?áê? HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE); } if(huart->Instance==USART3)//è?1?ê?′??ú3 { HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN); while(1) { if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//μè′yDMA2_Steam7′?ê?íê3é { __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//??3yDMA2_Steam7′?ê?íê3é±ê?? HAL_UART_DMAStop(&huart3); //′?ê?íê3éò?oó1?±?′??úDMA break; } // __HAL_DMA_GET_COUNTER(&hdma_usart1_tx); } //·¢?í?óê?μ?μ?êy?Y while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET); //μè′y·¢?í?áê? HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE); } if(huart->Instance==UART4)//è?1?ê?′??ú4 { HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN); while(1) { if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//μè′yDMA2_Steam7′?ê?íê3é { __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//??3yDMA2_Steam7′?ê?íê3é±ê?? HAL_UART_DMAStop(&huart4); //′?ê?íê3éò?oó1?±?′??úDMA break; } // __HAL_DMA_GET_COUNTER(&hdma_uart4_tx); } //·¢?í?óê?μ?μ?êy?Y while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET); //μè′y·¢?í?áê? HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE); } }
這個我是放在中斷里實現串口自收自發的。
1 void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) 2 { 3 uint32_t isrflags = READ_REG(huart->Instance->ISR);//?????,???????SR 4 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET) 5 { 6 READ_REG(huart->Instance->RDR);//PE???,????DR 7 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//??? 8 } 9 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET) 10 { 11 READ_REG(huart->Instance->RDR);//FE???,????DR 12 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF); 13 } 14 15 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET) 16 { 17 READ_REG(huart->Instance->RDR);//NE???,????DR 18 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF); 19 } 20 21 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET) 22 { 23 READ_REG(huart->Instance->RDR);//ORE???,????CR 24 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF); 25 } 26 }
浙公網安備 33010602011771號