NUC1263 LLSIClock開發筆記:LLSI與PDMA搭配使用
DMA是什麼? DMA的全稱叫做Direct Memory Access,「直接記憶體存取」。它可以直接根據使用者設定的來源位址、目標位址、長度等,直接搬移記憶體中的資料,而不用CPU的介入,幫CPU分攤一些反覆搬移的事情。尤其在搬移大量資料時,或者一些CPU負載重的應用情境之下,藉由DMA的幫忙可以顯著提高系統整體的效能。 在計算機系統中,CPU之外的硬體周邊裝置也經常會映射在一些記憶體位址中,讓使用者能像讀寫記憶體般,輕易地操作它們,稱作Memory-mapped IO。因此DMA也可以搬移硬體周邊裝置的資料。 PDMA是什麼? 不過在微控制器的應用中,資料的搬移往往需要根據周邊裝置的狀態同步。DMA前面加了一個P就是Peripheral Direct Memory Access,意即可以經由硬體周邊裝置產生的事件當成是DMA的傳輸請求,直接觸發DMA傳輸。 以這次的NUC1263為例,LLSI硬體提供了深度4-word (16-byte)的FIFO buffer,是在FIFO有足夠空間時,由LLSI硬體產生信號直接向PDMA發送傳輸請求,依序將整個Frame buffer傳輸完畢,期間就不需要CPU介入該過程。 使用PDMA的好處 透過硬體產生的事件,直接將資料搬移的任務交給PDMA,而非反覆讓CPU進中斷服務程式搬移資料,把CPU的資源留給那些真正需要運算的程式。 讓我們開始看看LLSI+PDMA的程式吧! 基於上一篇文章「運用指標提高LLSI Frame Buffer的可讀性、易用性」的程式下去修改成PDMA傳輸的版本,主要留意下面這些內容。 要記得在SYS_Init()中開啟LLSI和PDMA的clock LLSI_Open()要將工作模式設為LLSI_MODE_PDMA 首先在SYS_Init()中除了LLSI之外還要記得開啟PDMA的clock。 /* Enable LLSI0 module clock */ CLK_EnableModuleClock(LLSI0_MODULE); /* Enable PDMA peripheral clock */ CLK_EnableModuleClock(PDMA_MODULE); PDMA_Init()的部分,我使用PDMA Channel...