STM32 hal庫解決串列埠 DMA接收資料

2021-10-20 12:47:03 字數 1341 閱讀 4444

#stm32cubeide stm32f4 hal庫 大疆dt7 串列埠+dma ()

1.硬體設計

首先了解大疆接收器傳送串列埠資料的訊號型別

如圖可知,需要做乙個取反電路…如下圖:

取自網上.這些在網上都可以搜到. 記住要有上拉電阻,如果外部沒有,可使用微控制器usart的rx的gpio配置為上拉

遙控接收後會傳送,相當於外部串列埠的tx,與微控制器的rx連線.

補充一張圖,.

下面上**

int main(void)

}} /* user code end usart1_irqn 1 */

}/**

講解一下, __hal_dma_get_counter(&hdma_usart1_rx)這句話的意思是當前dma流傳輸中剩餘資料單元的數量,也就是說開啟接收後,需要等接收完成才可以去處理資料,即__hal_dma_get_counter(&hdma_usart1_rx)這個等於零,代表18個位元組都接收完成.

可以看一下hal庫中這個巨集定義 #define __hal_dma_get_counter(handle) ((handle)->instance->ndtr)

再看一下st文件ndtr暫存器含義

所以我在hal_uart_receive_dma(&huart1, (uint8_t*) receive_buff, 18); 開啟接收後需要等待20m』接收完成才可以進行這個判斷,否則在除錯時設定斷點會不進入這個if.因為還有剩餘,就不會等於0.

關於&&receive_buff[17]==4,是應為我根接收資料的特點,自己增加的乙個判斷條件,提高資料正確性.

說白了這句話就是乙個接收資料的長度校驗 又加上了乙個我自己找的資料的乙個特點,才能保證資料的正確性,當發生資料亂的狀況會過濾掉

if(__hal_dma_get_counter(&hdma_usart1_rx)==0&&receive_buff[17]==4)

好的,就這麼多了,第一次寫文章,歡迎廣大網友批評指責,看看這個還有什麼可提公升的地方,互相學習,加油!

stm32 hal庫串列埠通訊資料匯集

串列埠的傳送接收函式 hal uart transmit 串列埠輪詢模式傳送,使用超時管理機制。hal uart receive 串列埠輪詢模式傳送,使用超時管理機制。hal uart transmit it 串列埠中斷模式傳送,hal uart receive it 串列埠中斷模式傳送 hal u...

STM32 HAL庫串列埠不定長資料

void hal uart rxcpltcallback uart handletypedef huart ulart3 read bufs ulart3 counts read ulart3 if read ulart3 0x0d if ulart3 counts 30 hal uart rece...

STM32 HAL庫 printf 串列埠重定向

在對printf重定向之前,一定不要有printf,否則程式馬上跑飛。在main函式之前加上如下 對串列埠進行重定向,當然,串列埠一定要初始化之後再用printf,否則程式雖然不會飛,但是printf也不會有結果 ifdef gnuc define putchar prototype int io ...