由於工作中測試發現串列埠傳輸資料延時有點大,傳輸35個位元組,115200,理論值應該在3ms左右,然而實際測試卻有40ms,所以首先想到會不會是hal庫執行效率低得原因,所以採用ll庫,但是ll庫的資料少之又少啊!自己做個記錄。
使用cubemx可以直接生產ll庫的**(我的工程裡是hal庫和ll庫混用的),ll庫串列埠硬體初始化部分會自動生成,但是傳輸位址及dma傳輸長度並沒有設定,需要手動設定。設定步驟可參考標準庫設定
初始化**使用dma+idle接收資料,
void bsp_usart_init()
中斷接收函式
void bsp_usart_irq()
else if (ll_usart_isactiveflag_tc(usart2))
}
dma傳送函式
uint8_t bsp_usart_send(uint8_t *data, uint32_t len)
ll_dma_clearflag_tc6(dma1);
memcpy(bsp_usart.atxbuffer, data, len);
ll_dma_disablestream(dma1, ll_dma_stream_6);
ll_dma_setdatalength(dma1, ll_dma_stream_6, len);
ll_dma_enablestream(dma1, ll_dma_stream_6);
return 0;
}
在使用ll庫時,串列埠接收還比較容易實現,和hal庫除了初始化設定dma位址外,其他大同小異。但是dma傳送卻沒有那麼順利,第一次呼叫傳送函式時,是可以正常接收到的,但是後面就沒有了。最後發現是沒有清除dma傳送完成中斷,使用ll庫特別要注意中斷及標誌位的清除 LL庫實現ADC多通道DMA讀取
首先依舊使用stcubemx配置一下工程 我這裡使用的是adc1的多個通道,具體看下面配置圖,比較簡單,因為我使用了dma,配置好adc之後還需要配置一下dma。1,adc配置 2,dma配置,需要配置通道以及方向,是外設到記憶體還是記憶體到記憶體,以及快取區資料寬度。3,配置好以上後,我們還需要手...
串列埠通訊DMA中斷
這是以前學32的時候寫的,那時候學了32之後感覺32真是太強大了,比51強的沒影。關於dma網上有許多的資料,親們搜搜,這裡只貼 了,其實我也想詳詳細細地敘述一番,但是自己本身打字就慢,還有好多事情要做!是我親自都在板子上測試過的,當然貼上 複製過去可能也不會盡如人意,知識這東西總是有許多道不清說不...
串列埠 DMA接受不定長資料
工作中經常會遇到串列埠通訊,並對互動的資料進行處理。經常用到的是通過不停的產生串列埠接收中斷,然後對資料做處理。這樣做的弊端就是,不停的會產生串列埠接受中斷。中斷請求不但使cpu停下來,而且要cpu執行中斷服務程式為中斷請求服務,這個請求包括了對斷點和現場的處理以及cpu與外設的傳送,所以cpu付出...