新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > SAM4E單片機之旅——21、DMAC之USART回顯

        SAM4E單片機之旅——21、DMAC之USART回顯

        作者: 時間:2017-04-26 來源:網絡 收藏

          DMAC也可以和外設進行數據交互。之前我們曾使用PDC進行的數據回顯,這次就使用DMAC完成相同的工作。而且由于DMAC有內部的緩沖區,實現起來更為簡單。

        本文引用地址:http://www.104case.com/article/201704/358452.htm

          一、 設置

          因為之前已經做過相關的實驗,這里不再重復。需要注意的是,要注意JP11的跳線,以選擇正確的協議(RS232)。另外,如果使用硬件握手協議的話,注意設置PC端串口通信軟件的線路控制信號。

          另外,由于不再使用手動的緩沖區和PDC,所以不需要進行相關的設置。同時,也不用再使用的接收超時功能。

          二、 DMAC設置

          本次使用的通道依然為通道0:

          1#define DMAC_CH 0

          啟用DMAC:

          1// 代碼略...

          設置DSCR為0,以進行單次傳輸:

          1DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_DSCR = 0;

          設置SADDR以及DADDR。

          因為數據都在US_RHR和US_THR的低位上,所以將源地址和目標地址分別設為這兩個寄存器的地址即可。

          DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_SADDR =

          &(USART1->US_RHR);

          DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_DADDR =

          &(USART1->US_THR);

          設置CTRLA和CTRLB。

          在USART數據位為8位時,一次傳輸一個字節即可。

          DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLA =

          DMAC_CTRLA_BTSIZE(16) // 進行16次傳輸

          | DMAC_CTRLA_SRC_WIDTH_BYTE // 一次傳輸一個字節

          | DMAC_CTRLA_DST_WIDTH_BYTE // 同上

          ;

          DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLB =

          DMAC_CTRLB_FC_PER2PER_DMA_FC //外設至外設的傳輸

          | DMAC_CTRLB_SRC_INCR_FIXED // 傳輸時源地址固定

          | DMAC_CTRLB_DST_INCR_FIXED // 傳輸時目標地址固定

          ;

          設置CFG寄存器。

          因為DMAC和USART1之間有硬件握手接口,所以這里使用硬件握手接口即可(否則需要使用軟件握手接口手動觸發傳輸)。USART1的發送接口號為5,接收接口號為6:

        clip_image002

          由于需要盡快將DMAC內部緩沖區的內容傳輸出去,所以一旦其數據量可以發送,就發送出去。

          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 // 盡快發送數據

          ;

          啟用中斷。

          在傳輸任務完成后,需要重新啟用通道,以重新開始任務。

          1

          2DMAC->DMAC_CHER = DMAC_CHER_ENA0 << DMAC_CH;

          // NVIC中斷設置的代碼略...

          中斷處理。

          在中斷中重新設置CTRLA寄存器的BTSIZE字段,再啟用通道即可。

          void DMAC_Handler(void)

          {

          uint32_t status = DMAC->DMAC_EBCISR;

          // 判斷是否為指定中斷

          if (status & (DMAC_EBCISR_CBTC0 << DMAC_CH))

          {

          // 設置 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 << DMAC_CH;

          }

          }



        關鍵詞: SAM4E USART

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 天全县| 伊宁县| 巩义市| 弥渡县| 遂昌县| 万全县| 壶关县| 凭祥市| 榆社县| 宝坻区| 永修县| 土默特右旗| 石台县| 营口市| 咸阳市| 葵青区| 陆丰市| 嘉峪关市| 卢氏县| 光泽县| 新平| 百色市| 江阴市| 凤山市| 永嘉县| 乌兰县| 建阳市| 老河口市| 栾城县| 无锡市| 安顺市| 彭水| 杭锦后旗| 南郑县| 区。| 阿勒泰市| 盐城市| 阿鲁科尔沁旗| 聂荣县| 舟曲县| 天柱县|