版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第第頁基于STM32H563USART演示DMA鏈表功能這里選用(STM32)H563Nucleo開發(fā)板,使用USART3外設(shè)演示(DMA)鏈表模式的實(shí)現(xiàn)過程。大致過程是這樣的:
STM32H563(芯片)上的USART3與板載STLINK的VCP相連,通過PC端串口助手軟件先后發(fā)送3串字符給(MCU),MCU的USART3通過DMA以鏈表模式依次接收并存到相應(yīng)內(nèi)存,同時在相應(yīng)的調(diào)試界面的觀察窗口加以顯示。接收過程對應(yīng)3個DMA接收節(jié)點(diǎn),他們構(gòu)成1個DMA接收隊(duì)列。當(dāng)MCU接收到3串字符后,也以DMA鏈表模式依次發(fā)送3串字符到PC端的串口助手并顯示出來。同樣,USART3的DMA發(fā)送也用到3個節(jié)點(diǎn)以組成1個DMA發(fā)送隊(duì)列。
GPDMA1的2個通道CH0,CH1,配置在鏈表模式。其中CH0用于USART3RXDMA隊(duì)列,CH1用于USART3TXDMA隊(duì)列。這個通道安排可以在用戶代碼里調(diào)整。
下面使用STM32CbueMx圖形化工具進(jìn)行基本配置后創(chuàng)建測試工程?!咀ⅲ海ㄊ謾C(jī))模式下文中圖片可放大查看】
3個USART3DMARX節(jié)點(diǎn)的配置如下【3個配置類似,只是源地址、目標(biāo)地址有差異】:
3個USART3DMATX節(jié)點(diǎn)的配置如下【3個配置類似,只是源地址、目標(biāo)地址有差異】:
相關(guān)的用戶參考代碼如下:
#defineRXBUFFE(RS)IZE(8)#defineTXBUFFERSIZE(22)vola(ti)le
uint8_t
RxComplete=0;//DMA接收完成標(biāo)志ALIGN_32BY(TE)S(uint8_taTxBuffer0[])="STM32H5_DMA_LIST_0";ALIGN_32BYTES(uint8_taTxBuffer1[])="STM32H5_DMA_LIST_1";ALIGN_32BYTES(uint8_taTxBuffer2[])="STM32H5_DMA_LIST_2";ALIGN_32BYTES(uint8_taRxBuffer0[RXBUFFERSIZE]);ALIGN_32BYTES(uint8_taRxBuffer1[RXBUFFERSIZE]);ALIGN_32BYTES(uint8_taRxBuffer2[RXBUFFERSIZE]);DMA_HandleTypeDefhandle_GPDMA1_Channel1;DMA_HandleTypeDefhandle_GPDMA1_Channel0;(UART)_HandleTypeDefhuart3;intmain(void){/*Resetofallperipherals,InitializestheFlashinterfaceandtheSyst(ic)k.*/
HAL_Init();/*Configurethesystemclock*/
SystemClock_Config();/*Initializeallconfiguredperipherals*/MX_GPIO_Init();MX_GPDMA1_Init();//MX_(ADC)1_Init();MX_IC(AC)HE_Init();MX_USART3_UART_Init();/*USERCODEBEGIN2*/MX_Uart_tx_queue_Config();MX_Uart_rx_queue_Config();/*LinkUARTqueuetoDMAchannel*/HAL_DMAEx_List_LinkQ(/*AssociatetheinitializedGPDMAhandletotheUARThandle*/__HAL_LINKDMA(/*LinkUARTqueuetoDMAchannel*/HAL_DMAEx_List_LinkQ(/*AssociatetheinitializedGPDMAhandletotheUARThandle*/__HAL_LINKDMA(HAL_UART_Receive_DMA(/*USERCODEEND2*//*Infiniteloop*//*USERCODEBEGINWHILE*/while(1){
if(RxComplete)
//check
uart
Rx
DMA
transfer
complete(or)not{RxComplete=0;huart3.gState=HAL_UART_STATE_RE(AD)Y;HAL_UART_Transmit_DMA(}}}/*
UART3
DMA
接收完成中斷回調(diào)函數(shù)
*/voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart){
RxComplete++;
//DMA
transfer
completed}
下面開始運(yùn)行程序以驗(yàn)證結(jié)果。
PC串口終端先發(fā)送三串字符被MCUUSART3通過DMA接收,然后MCU以DMA鏈表的形式發(fā)送三串字符到串口終端。下圖中右邊觀察串口的字符為USART3通過DMA以鏈表形式接收的來自串口助手的數(shù)據(jù)。下圖中綠色方框內(nèi)三串字符為STM32H563USART3以DMA鏈表形式3次發(fā)送出來的。
在上面測試中,關(guān)于DMA傳輸完成事件的配置,我選擇的針對整個DMA傳輸鏈完成傳輸后才產(chǎn)生完成事件。以上面的USART3RXDMA接收為例,當(dāng)3個節(jié)點(diǎn)都完成DMA接收時才觸發(fā)DMA傳輸完成事件。當(dāng)然,我們也可以基于每個DMA傳輸節(jié)點(diǎn)來產(chǎn)生DMA傳輸完成事件,比如按下面的配置修改。
如果這樣修改之后,其它地方不動,這時USART3通過DMA每收到一串?dāng)?shù)據(jù)都會觸發(fā)傳輸完成事件,并在相應(yīng)中斷里設(shè)置完成事件標(biāo)志【RxComplete】,進(jìn)而啟動USART3發(fā)送的DMA鏈?zhǔn)絺鬏?。見下圖結(jié)果【褐紫色字符是USART3通過DMA接收到的數(shù)據(jù)】:
其實(shí),在前面驗(yàn)證過程中,發(fā)生了點(diǎn)小波折也順便分享出來。
當(dāng)我做完基本的配置,創(chuàng)建工程、添加用戶代碼。編譯、除錯后,開始運(yùn)行程序時并不順利。
我先使用串口助手發(fā)送字符串給MCU,可是在USART3的DMA接收隊(duì)列里,只有第一個節(jié)點(diǎn)有反應(yīng)。通過開發(fā)環(huán)境的觀察窗口看到的接收數(shù)據(jù)跟我發(fā)出去的字符大相徑庭,其它2個DMA接收節(jié)點(diǎn)不論我發(fā)送多少數(shù)據(jù)就根本沒反應(yīng)。因?yàn)槲以O(shè)計(jì)的就是只有當(dāng)接收隊(duì)列即3個接收節(jié)點(diǎn)都正常接收后才會啟動USART3的DMA發(fā)送隊(duì)列。所以此時USART3也就沒有任何數(shù)據(jù)發(fā)送出來。檢查配置和用戶代碼,但沒有很快發(fā)現(xiàn)問題原因。
后來在檢查USART3的基本(通信)配置時,無意中發(fā)現(xiàn)了一點(diǎn)異樣。就是有關(guān)接收數(shù)據(jù)是否需要翻轉(zhuǎn)的配置項(xiàng)不知何時變成Enable了。
顯然,這個地方不能翻轉(zhuǎn),不然發(fā)送的數(shù)據(jù)跟接收的數(shù)據(jù)肯定不一樣了。我清楚地記得這個地方我是沒動的,不知是不是某個時候不小心碰著而改動了。立即將其Disable掉后進(jìn)行測試驗(yàn)證。
測試結(jié)果發(fā)現(xiàn)第一個DMA接收節(jié)點(diǎn)的數(shù)據(jù)正常了。但奇怪的是第2個、第3個接收節(jié)點(diǎn)仍然接收不到數(shù)據(jù)。又是一番配置和代碼核對,無果。
后來,先干脆不管接收隊(duì)列,而試著直接啟動USART3的DMA發(fā)送隊(duì)列。慶幸的是,發(fā)送很正常??磥恚琔SART3TXDMA發(fā)送隊(duì)列的配置是靠譜的。其實(shí)USART3RXDMA接收隊(duì)列的配置跟發(fā)送隊(duì)列配置很相似,只是請求源、傳輸端地址的配置差異。再次逐個核對DMA接收節(jié)點(diǎn)2和3的配置。功夫不負(fù)有心人,果真發(fā)現(xiàn)烏龍了。在DMA接收節(jié)點(diǎn)2的DMA請求配置那里,我竟然不小心選成USART1的了,一字之差,謬以千里。節(jié)點(diǎn)3的配置沒有問題??磥韱栴}就出在接收節(jié)點(diǎn)2的那個誤選項(xiàng)。立馬驗(yàn)證,結(jié)果一切正常了。
為什么只是節(jié)點(diǎn)2配置有問題,節(jié)點(diǎn)3也不能接收數(shù)據(jù)呢?因?yàn)檫@3個節(jié)點(diǎn)構(gòu)成了一條關(guān)于DMA傳輸?shù)?/p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 景德鎮(zhèn)藝術(shù)職業(yè)大學(xué)《配合物化學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 遼寧大學(xué)《嵌入式技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 江蘇海事職業(yè)技術(shù)學(xué)院《口腔科學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 黑龍江工程學(xué)院昆侖旅游學(xué)院《建筑施工組織》2023-2024學(xué)年第一學(xué)期期末試卷
- 重慶三峽職業(yè)學(xué)院《食品儀器分析原子吸收測定水中鈣(標(biāo)準(zhǔn)曲線法)》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江越秀外國語學(xué)院《漆畫表現(xiàn)灰料新語言》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江海洋大學(xué)《GIS氣象應(yīng)用與開發(fā)》2023-2024學(xué)年第一學(xué)期期末試卷
- 中國計(jì)量大學(xué)《生物信息學(xué)入門(雙語)》2023-2024學(xué)年第一學(xué)期期末試卷
- 中央財(cái)經(jīng)大學(xué)《工程建筑制圖》2023-2024學(xué)年第一學(xué)期期末試卷
- 小學(xué)德育工作的管理制度
- 新人教版九年級化學(xué)第三單元復(fù)習(xí)課件
- 北師大版四年級數(shù)學(xué)上冊口算天天練題卡2
- 滑模施工計(jì)算書及相關(guān)圖紙
- DB11T 2279-2024 社會單位消防安全評估規(guī)范
- 《電力電纜試驗(yàn)》課件
- JJF 2122-2024 機(jī)動車測速儀現(xiàn)場測速標(biāo)準(zhǔn)裝置校準(zhǔn)規(guī)范
- 充電樁四方協(xié)議書范本
- 2024年南京鐵道職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及答案解析
- 2023年信息處理技術(shù)員教程
- 稽核管理培訓(xùn)
- 電梯曳引機(jī)生銹處理方案
評論
0/150
提交評論