DMAC也可以和外設(shè)進行數(shù)據(jù)交互。之前我們曾使用PDC進行USART的數(shù)據(jù)回顯,這次就使用DMAC完成相同的工作。而且由于DMAC有內(nèi)部的緩沖區(qū),實現(xiàn)起來更為簡單。
一、USART設(shè)置
因為之前已經(jīng)做過相關(guān)的實驗,這里不再重復(fù)。需要注意的是,要注意JP11的跳線,以選擇正確的協(xié)議(RS232)。另外,如果使用硬件握手協(xié)議的話,注意設(shè)置PC端串口通信軟件的線路控制信號。
另外,由于不再使用手動的緩沖區(qū)和PDC,所以不需要進行相關(guān)的設(shè)置。同時,也不用再使用USART的接收超時功能。
二、DMAC設(shè)置
本次使用的通道依然為通道0:
1#defineDMAC_CH0
啟用DMAC:
1//代碼略...
設(shè)置DSCR為0,以進行單次傳輸:
1DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_DSCR=0;
設(shè)置SADDR以及DADDR。
因為數(shù)據(jù)都在US_RHR和US_THR的低位上,所以將源地址和目標地址分別設(shè)為這兩個寄存器的地址即可。
DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_SADDR=
&(USART1->US_RHR);
DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_DADDR=
&(USART1->US_THR);
設(shè)置CTRLA和CTRLB。
在USART數(shù)據(jù)位為8位時,一次傳輸一個字節(jié)即可。
DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLA=
DMAC_CTRLA_BTSIZE(16)//進行16次傳輸
|DMAC_CTRLA_SRC_WIDTH_BYTE//一次傳輸一個字節(jié)
|DMAC_CTRLA_DST_WIDTH_BYTE//同上
;
DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLB=
DMAC_CTRLB_FC_PER2PER_DMA_FC//外設(shè)至外設(shè)的傳輸
|DMAC_CTRLB_SRC_INCR_FIXED//傳輸時源地址固定
|DMAC_CTRLB_DST_INCR_FIXED//傳輸時目標地址固定
;
設(shè)置CFG寄存器。
因為DMAC和USART1之間有硬件握手接口,所以這里使用硬件握手接口即可(否則需要使用軟件握手接口手動觸發(fā)傳輸)。USART1的發(fā)送接口號為5,接收接口號為6:
由于需要盡快將DMAC內(nèi)部緩沖區(qū)的內(nèi)容傳輸出去,所以一旦其數(shù)據(jù)量可以發(fā)送,就發(fā)送出去。
DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CFG=
DMAC_CFG_SRC_H2SEL_HW//使用硬件握手
|DMAC_CFG_DST_H2SEL_HW
|DMAC_CFG_SRC_PER(6)//接口號
|DMAC_CFG_DST_PER(5)
|DMAC_CFG_SOD_DISABLE
|DMAC_CFG_FIFOCFG_ASAP_CFG//盡快發(fā)送數(shù)據(jù)
;
啟用中斷。
在傳輸任務(wù)完成后,需要重新啟用通道,以重新開始任務(wù)。
1
2DMAC->DMAC_CHER=DMAC_CHER_ENA0<
//NVIC中斷設(shè)置的代碼略...
中斷處理。
在中斷中重新設(shè)置CTRLA寄存器的BTSIZE字段,再啟用通道即可。
voidDMAC_Handler(void)
{
uint32_tstatus=DMAC->DMAC_EBCISR;
//判斷是否為指定中斷
if(status&(DMAC_EBCISR_CBTC0<
{
//設(shè)置CTRLA
DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLA&=
~(uint32_t)DMAC_CTRLA_BTSIZE_Msk;
DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLA|=
DMAC_CTRLA_BTSIZE(16);
//再次啟用通道
DMAC->DMAC_CHER=DMAC_CHER_ENA0<
}
}
-
PC
+關(guān)注
關(guān)注
9文章
2065瀏覽量
154021 -
串口通信
+關(guān)注
關(guān)注
34文章
1620瀏覽量
55425 -
USART
+關(guān)注
關(guān)注
1文章
195瀏覽量
30791
發(fā)布評論請先 登錄
相關(guān)推薦
評論