cubemx dma原始碼分析

2021-07-26 12:13:21 字數 1461 閱讀 1200

這次我們利用cubemx生成的dma工程師從記憶體到記憶體的模式。

這個工程的配置很簡單。

這個初始化函式只是開啟了dma外設時鐘,並且配置了時鐘引數後將引數寫到暫存器中。

我們可以看出這個模式是dma1通道1。這個不是憑空的,可以從手冊中dma請求映像得知。而且當外設傳送乙個事件後,通過自己dma通道像dma控制器發出請求訊號,如果多個同時發出,dma控制器根據通道優先順序處理,在軟體優先順序相同時,根據硬體優先順序決定,外設收到dma控制器的應答訊號後,釋放自己的請求訊號,控制器撤銷應答訊號,此時可以處理下乙個請求。

我們接下來看dma通道的引數。這些引數都是一些巨集定義,只要追蹤定義就可以查到,前面幾篇文章都說過方法,這時我們不再列出。

再往後在判斷中呼叫了引數初始化的函式,我們把主要**部分列出。

先是用temp變數接受了dma1通道1的暫存器中的內容。

往下是把除了通道選擇的上下幾個配置通道的引數在暫存器對應位置先清0,然後在按引數寫入剛才被清除的暫存器的位上。最後把配置後的資料寫到暫存器當中,因為剛才是寫在乙個臨時變數中。

這就完成了配置。之後我們需要在需要的地方開啟dma傳輸,呼叫hal_statustypedef hal_dma_start(dma_handletypedef *hdma, uint32_t srcaddress, uint32_t dstaddress, uint32_t datalength)

我們看到此處先是失能了dma通道,我們往下看就知道此處為什麼失能。下面是將此函式的幾個形參配置到暫存器中,通過setconfig函式。

我們把這裡用到的暫存器列一下。

函式先是對dndtr配置,根據手冊得知這個暫存器再寫入時必須是通道不工作時,所以前面首先失能了通道。由於我們前面配置的傳輸模式是正常模式,所以在一次傳送完成後變為0,不論通道是否開啟都不再傳送。

下面就是選擇兩個儲存器分別作為源和目標。函式結束後回到之前stat那個函式,再往下就是使能dma通達了。使能了dma通道後,dma通道就根據通道引數進行傳輸資料。

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

思科VPP原始碼分析(dpo機制原始碼分析)

vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...

redux原始碼分析(三) 原始碼部分

下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...