• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

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

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

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

    本文引用地址:http://www.czjhyjcfj.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

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 武穴市| 从江县| 延庆县| 宜春市| 伊通| 中山市| 木兰县| 南丰县| 文昌市| 烟台市| 闽清县| 亳州市| 神农架林区| 柯坪县| 西盟| 尚义县| 罗山县| 三亚市| 南阳市| 庆云县| 临潭县| 伊通| 梅州市| 乌兰县| 安徽省| 随州市| 新兴县| 米脂县| 江津市| 石门县| 霍山县| 基隆市| 临泉县| 晋中市| 开封市| 湾仔区| 中牟县| 奎屯市| 丰台区| 潼南县| 涞源县|