2017-10-06 175 views
2

我有一個STM32F4,我想PWM一個已經或運算帶着面具GPIO端口..PWM DMA到整個GPIO

所以,也許我們要在200kHz至PWM 0b00100010一段時間,但是接着,在10khz之後,我們現在想要PWM 0b00010001 ...然後,在10kHz之後,我們希望在相同的GPIO上PWM一些其他掩模。

我的問題是,你如何做到這一點與DMA?我試圖觸發一個DMA傳輸,將所有位設置在上升沿,然後再進行另一次DMA傳輸,以在下降沿清除所有位。

我還沒有發現,因爲它看起來像我只得到一個機會,做一個上升沿東西的好辦法做到這一點,(至少CubeMX和我使用C & STM32的經驗有限)。

我的一個主要關注點是CPU時間,因爲雖然我提到數百kHz的在上面的例子中,我想使這個框架非常堅固那麼遠,因爲它是不會浪費的CPU資源...這就是爲什麼我喜歡DMA的想法,因爲它是專用硬件,可以在這裏無意識地提取單詞,並且CPU可以做其他事情,比如PID的緊縮數字或其他東西。

編輯 爲清楚:我有一組6個值的,我可以寫一個GPIO。這些存儲在一個數組中。 我想要做的是建立一個PWM定時器,在PWM的正寬度期間設置GPIO,然後我希望GPIO在低週期寬度期間設置爲0b00000000(如果pwm)。因此,我需要看到什麼時候上升沿,快速寫入gpio,然後看下降沿是什麼時候,寫0到gpio。

+0

什麼是10kHz以後? Hz不是時間單位。 DMA不能做任何邏輯操作。它只是將數據從位置A傳送到B. –

+0

好的... 100us後,我想將相同的200khz pwm應用於GPIO上的不同引腳。因此,我們將包含掩碼的變量傳送到GPIOx-> BSRR或在PWM的上升沿用DMA,然後在下降沿將GPIO設置回零... 100us層,不同的定時器溢出或比較什麼的,然後唯一改變的就是現在我們在上升沿加載一個不同的值的DMA。 – testname123

+0

我已經給你答案了。我的例子是1位。它也可以是16。否則使用定時器生成的PWM –

回答

1

限定溶液沒有DMA

STM32F4控制器有12個定時器,每個定時器最多4個PWM通道,總共32個。它們中的一些可以被同步以一起開始,例如,你可以同時有TIM1開始TIM2,TIM3,TIM4TIM8。這是20個同步PWM輸出。如果這還不夠,你可以在奴隸計時器成爲另一個主人的時候形成鏈子,但保持所有人完全同步是相當棘手的。如果幾個時鐘週期的偏移量是可接受的,則不那麼棘手。

在STM32CubeF4庫示例項目部分中有幾個示例,您可以從中拼出您的設置,查看Projects/*_EVAL/Examples/TIM/*Synchro*

通用的解決方案

當計數器達到重載值(更新事件)當通用或高級定時器(這是所有的人除了TIM6TIM7)都能觸發DMA傳輸計數器等於任何比較值(捕獲/比較事件)。

這個想法是讓DMA在比較事件時將所需的位模式寫入BSRR的低位(設置)一半,並在更新事件中將相同的位寫入BSRR的高位(復位)部分。

儘管如此,DMA1根本無法訪問AHB總線(參見參考手冊中的圖1或2),GPIO寄存器連接到該總線。因此我們必須使用DMA2,這使我們留下了先進的計時器TIM1TIM8。事情變得更加複雜,因爲來自這些定時器的更新和比較事件導致DMA請求以不同的DMA流結束(參見RM中的表43)。爲了使它變得更簡單,我們可以使用DMA 2,流6或流2,通道0,它們結合來自3個定時器通道的事件。代替使用更新事件的,我們可以設置比較在一個計時器通道寄存器爲0

設置所選擇的定時器的DMA流中,以

  • 通道0
  • 單個傳輸(不爆裂)
  • 存儲器數據大小16位
  • 外圍數據大小16位
  • 沒有存儲器增量
  • 外設地址增量
  • 圓形模式
  • 存儲器到外圍
  • 周流量控制器:數據項2
  • 外圍地址GPIOx->BSRR
  • 存儲器地址指向的我不知道,實驗
  • 數到輸出位模式
  • 直接模式
  • 最後,啓用通道。

現在,設置定時器

  • 設置的分頻器,如果需要
  • 設置自動重載值,以達到所需頻率
  • 一套比較通道的值產生一個更新事件1到0
  • 將通道2的比較值設置爲所需的佔空比
  • 啓用兩個通道的DMA請求
  • 使兩個通道上比較輸出
  • 如果在主從模式下使用它們兩者使能計數器

這種方式可以控制16個引腳,每個計時器,32。

要一次控制更多的引腳(最多64個)時,配置附加的DMA流爲信道4比較和定時器更新事件,設置數據項的數目爲1,並使用((uint32_t)&GPIOx->BSRR)+2作爲外圍地址更新流。

通道2和通道4可用作常規PWM輸出,爲您提供4個以上的引腳。也許是第3頻道。

可以仍然使用TIM2TIM3TIM4TIM5如在我的支柱的所述第一部分中所描述(每一個都可以從屬於TIM1TIM8)爲16個以上的PWM輸出。也許還有TIM9TIM12,如果你能找到合適的主從設置,還有4個。

這是90針同時切換。注意總電流限制。

+0

就是這樣!謝謝! – testname123

0

PWM 0b00100010是什麼意思? PWM是具有一定佔空比的方波。使用DMA進行歸檔將非常困難,但您需要使用已計算值的表格。例如,要有10%比例的2kHz PWM,您需要有10個採樣位,其中一個採樣位置1,另外9個採樣位置零。您將定時器配置爲20k/sec觸發mem-to-mem(GPIO必須以此方式完成)以循環模式傳輸DMA。在引腳上你將有2kHz 10%的波形。 PWM分辨率將爲10%。如果你想使它達到0.5%,你將需要200個採樣表和DMA觸發每秒400k次。

IMO最好是使用計時器和DMA加載新值到它(讀取有關突發DMA模式定時器文檔中的參考手冊)

+0

不好意思,但我似乎歪曲了這個問題。請允許我澄清: – testname123