-
芯片型號:stm32f103rct6;SPI介面ADC;
-
代碼功能描述:有xyz3路資料,每路1個雙通道adc采集,從x路依次資料并用串口發送出去,14位元組,2250000bps;
-
方案1:按照順序執行,依次采集各路資料,然后uart發送,這樣也行,但是我不喜歡,這樣會影響資料更新的速率,就拿x路來說,要等yz路,串口發送都完成了,x路才開始下一次資料采集,我的目的是盡量提高各路資料更新的速率,方案1不滿足,
-
方案2:考慮用DMA發送,釋放CPU,
-
DMA有normal和circular兩種模式,
circular用法:(STM32CubeMX配置串口DMA省略) -
在main函式中該初始化的都初始化完畢之后,緊接著一句:
HAL_UART_Transmit_DMA(&huart1, (uint8_t*)Tx_frame, LENGTH_FRAME); -
就呼叫這個函式一次就可以了,DMA一直開啟,一幀資料發送完畢之后里面發送下一幀,中間沒有停頓,這樣確實是快了,也釋放了CPU,各路的資料采集因為缺少了等待串口發送的時間,所以就間接提高的了資料更新速率,但有個致命缺陷:資料采集和資料發送各玩各的,就是他倆時序對不上,資料采集到一半,一個完整幀資料只更新了一部分,就被DMA挪走了,這樣就把新舊資料一塊發送出去了,circular模式的DMA才不管資料有沒有完整更新,只管發,
normal用法: -
為了解決circular帶來的問題,采用normal模式,就是每發一次就開啟一次DMA,這樣就可以等一幀資料更新完畢之后,再開啟DMA發送,同樣不會占用CPU,在DMA發送資料的時間里CPU可以開啟下一輪的資料采集,
-
再HAL庫配置好normal模式后,在資料采集的代碼后面,比如采集資料代碼是這樣執行的:
CSX=0;
采集X_ADC_通道1;
采集X_ADC_通道2;
CSX=1;
CSY=0;
采集Y_ADC_通道1;
采集Y_ADC_通道2;
CSY=1;
CSZ=0;
采集Z_ADC_通道1;
采集Z_ADC_通道2;
CSZ=1;
HAL_UART_Transmit_DMA(&huart1, (uint8_t*)Tx_frame, LENGTH_FRAME);
- 這樣資料采集和資料發送幾乎是并行執行的,可以大大提高各路資料更新的速率,
STM32的UART使用DMA操作不要入的坑
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/178003.html
標籤:其他
上一篇:Valgrind移植
