關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > 基于DMA控制器的UART串行通信設計

        基于DMA控制器的UART串行通信設計

        作者: 時間:2012-04-27 來源:網絡 收藏

        2.2 鏈表項緩存區的
        建立N個x的鏈表內容結構體的緩存區x_LINK_LIST_INFOR_INDEX(i)(i=1,2,3,...N-1),稱作x_LINK_LIST_INFOR_CACHE(i)(i=1,2,...N-1)。其中DMAx_LINK_LIST_INFOR_CACHE(i)的地址為4字節對齊,必須為最低2位是0的位置。
        2.3 空鏈表項地址隊列的
        建立DMAx的可用空緩存FIFO隊列,稱作DMAx_LINK_LIST_FREE_TABLE,用于存儲N個鏈表中的空緩存區地址。當執行出隊操作時,返回一個非NULL空緩存區地址,若取回值為NULL則說明沒有可用緩存區;而執行入隊操作時,會將一個非NULL空緩存區的地址加入FIFO隊列中,執行讀取隊列長度操作時,返回隊列中可用空緩存地址的數量。
        2.4 已占用鏈表項地址隊列的
        建立DMAx的鏈表地址FIFO隊列,記作DMAx_LINK_LIST_FILL_TABLE,用來放置占用并填充了鏈表內容的結構體緩存區地址。當執行出隊操作時,返回一個非NULL已占用緩存區地址,若取回值為NULL則說明沒有可用的已占用緩存區地址;而執行入隊操作時,會將一個非NULL已占用緩存區的地址加入FIFO隊列中,執行讀取隊列長度操作時,返回隊列中可用的已占用緩存地址數量。
        2.5 發送用緩存地址保存隊列的設計
        建立n TX的地址保存FIFO隊列_LINK_LIST_STORE_TABLE,用于保存一次DMA發送的時所用到的DMAxLINK_LIST_INFOR_CACHE地址。隊列容量可與DMAx_LINK_LIST_FILL_TABLE的容量相同,或根據需求設置成更小。

        3 程實現
        3.1 關鍵寄存器設置
        1)使能外設時鐘,將PCONP寄存器中的PCGPDAM位置1。此位在復位時為0,即默認DMA被禁止,所以在應用DMA前須先將其使能。
        2)使能UnFCR中的第3位。該位為的DMA功能使能位,置1時使能DMA,清0后禁用DMA功能;只有在該位使能后,UART的發送和接收過程才能由DMA控制完成。
        3)將寄存器DMAReqSel的相應位清零。比如第0位,因為DMA的UART0 TX與定時器0匹配0復用,所以需先選擇到UART0 TX上。第0位為0時DMA選擇UARTX,為1時DMA選擇MAT0.0;其它串口也需做類似選擇。
        3.2 數據發送過程實現
        UARTn的DMA數據發送過程如下:
        1)輪詢檢測是否有數據需要UARTn的發送,如果有則從UARTn_BUF_FREE_TABLE隊列中取出一個UARTn_BUF緩存,填充欲發送的數據,然后從DMAx_LINK_LIST_FREE_TABLE隊列中取出一個DMAx_LINK_LIST_INFOR_CACHE,將UARTn_BUF的地址賦給DMAx_LINK_LIST_INFOR_CACHE的Link List_SrcAddress,并設置其LinkList_DstAddress為UnTHR的地址LinkList_NextListAddress暫為0、LinkList_Control Value為UARTn_BUF中數據大小、源和目的BURST SIZE為0、源和目的傳輸寬度的1字節、源地址自增、目標地址不自增和Terminal Count中斷使能。最后將該DMAx_ LINK_LISTINFOR_CACHE值入隊到DMAx_LINK_LIST_FILL_TABLE隊列中。流程如圖1所示。

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

        b.JPG



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 镇安县| 临洮县| 垣曲县| 富平县| 自贡市| 北宁市| 大连市| 九龙县| 洪江市| 阜阳市| 泰州市| 普兰县| 卫辉市| 紫阳县| 肥西县| 西充县| 资讯 | 攀枝花市| 临桂县| 庐江县| 祥云县| 太湖县| 泸定县| 宁武县| 贵溪市| 眉山市| 南涧| 扎赉特旗| 嵊泗县| 栖霞市| 湘潭市| 舞阳县| 万安县| 罗田县| 鹤壁市| 顺昌县| 奈曼旗| 陇南市| 青州市| 萨迦县| 长乐市|