找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7177|回復(fù): 3
收起左側(cè)

STM32L053可控PWM脈沖方法之DMA

[復(fù)制鏈接]
ID:437031 發(fā)表于 2018-12-1 11:40 | 顯示全部樓層 |閱讀模式
.前言

目標要求:系統(tǒng)時鐘 8Mhz,6 個 PWM 脈沖。

二.實現(xiàn)方式

實現(xiàn)上述目標的方法有很多種,比如兩個定時器級連,定時器定時中斷翻轉(zhuǎn) IO 口,等等,這里使用
DMA 的方式去實現(xiàn)。

2.1 參考基于 F1 標準外設(shè)庫

軟件環(huán)境:STM32F10x_StdPeriph_Lib_V3.5.0 版本的標準外設(shè)庫函數(shù)中的

Project->STM32F10x_StdPeriph_Examples->TIM->DMABurst 的示例代碼; 硬件環(huán)境:STM32F10V-128K-EVAL,MCU型號為 STM32F103VBT6; 該示例的代碼稍微解釋下,就會明白 DMA 的寄存器的作用。部分代碼如下:


TIM1_DMAR_ADDRESS 地址的定義:


DMA 的初始化:

逐個寄存器簡要說明:

DMA_PeripheralBaseAddr


該語句是對寄存器 DMA_CPARx 賦值,存入要操作的是哪種外設(shè),該外設(shè)的數(shù)據(jù)寄存器的基地址,它作 為數(shù)據(jù)傳輸?shù)脑椿蚰繕耍诖死,是作為?shù)據(jù)傳輸?shù)哪繕说幕刂贰?/font>


通道 5,它的 CPAR 值是 0x40012C4C,表明通道 5 的寄存器偏移地址 DMA_CPAR5 是 0x10+0d20 *
4 = 0x60,所以 DMA_CPAR5 的真實地址是 0x40020000 +0x60 = 0x40020060,該地址里面存儲的是

0x40012C4C,是 TIM1_DMAR 的地址。即可以理解為操作的是 TIM1 的外設(shè)。


DMA_MemoryBaseAddr

該語句是對寄存器 DMA_CMARx 賦值,設(shè)置的是相應(yīng)通道的存儲器的基地址,作為數(shù)據(jù)傳輸?shù)脑椿蚰?/div>

標,在此例中,是作為數(shù)據(jù)傳輸?shù)脑吹幕刂贰?uint32_t)SRC_Buffer; DMA_DIR

數(shù)據(jù)傳輸方向,從外設(shè)讀或者從存儲器讀,該示例中是從存儲器讀;外設(shè)作為目標地址。


DMA_BufferSize

定義數(shù)據(jù)傳輸?shù)臄?shù)量,指示剩余的待傳輸字節(jié)數(shù)目,寄存器內(nèi)容在每次 DMA 傳輸后遞減。

DMA_PeripheralInc,DMA_MemoryInc 該示例中,不執(zhí)行外設(shè)地址增量操作,執(zhí)行存儲器地址增量操作。DMA_PeripheralDataSize,DMA_MemoryDataSize 定義外設(shè)數(shù)據(jù)寬度,存儲器數(shù)據(jù)寬度。


DMA_Mode
分為非循環(huán)模式和循環(huán)模式,

在非循環(huán)模式中,在數(shù)據(jù)傳輸結(jié)束后,DMA_CNDTRx 寄存器的內(nèi)容會變?yōu)?0,此時無論通道是否開啟, 都不會發(fā)生任何數(shù)據(jù)傳輸。

在循環(huán)模式中,在數(shù)據(jù)傳輸結(jié)束后,DMA_CNDTRx 寄存器的內(nèi)容會自動加載變?yōu)橹芭渲玫臄?shù)值, 重新開始數(shù)據(jù)傳輸。


DMA_Priority,DMA_M2M
本例中,通道優(yōu)先級設(shè)為高,啟動非存儲器到存儲器模式。

2.2 基于 Cube 庫函數(shù)的可控 PWM 脈沖 直接打開\STM32Cube_FW_L0_V1.1.0\Projects\STM32L053R8-Nucleo\Examples\TIM\TIM_DMABurst 中的示例項目,修改配置符合自己當(dāng)初的設(shè)想:選取 Timer2 的 channel1(PA5),系統(tǒng)時鐘通過 HSI 的分頻倍頻,通過 PLL 實現(xiàn)系統(tǒng)時鐘為 8MHz。GPIO 口的設(shè)置: Max output speed 的速度為 High。定時器 PWM 模式的設(shè)置:向上計數(shù),計數(shù)時鐘為 8MHz,占空比

50%。

GPIO 口的設(shè)定:

這里要記住一點,如果參數(shù)設(shè)置中,周期和占空比寄存器設(shè)定的計數(shù)值已經(jīng)達到最小,當(dāng)再使用 DMA

產(chǎn)生中斷時,可能會來不及響應(yīng)。允許的話,可以利用分頻 Prescaler 先對定時計數(shù)器的時鐘分頻。 定時器的配置:

DMA 的配置:



其中,對于 DMA 配置中,BUFFER_SIZE 是代表要向目標地址發(fā)送的數(shù)據(jù)的個數(shù)。

上述需要在程序中添加設(shè)置 TIM2_DMAR_Address 的偏移索引地址,在定時器的章節(jié)可以看到。
不需要打開 DMA 傳輸完成的中斷。

下面的是啟動 DMA 傳輸,利用定時器的更新事件(TIM_UP 指定時器的周期,TIM_CH1 指占空比)去觸 發(fā) DMA 傳輸數(shù)據(jù)。

這兒傳輸?shù)姆较蚴菍?aSRC_Buffer 數(shù)組中數(shù)值,逐個向 TIM_DAMBase_CR1 寄存器中寫入,控制定

時器的計數(shù)使能位,達到控制 PWM 個數(shù)的目的。

BUFFER_SIZE 的數(shù)值為 6,目的是產(chǎn)生 6 個脈沖。
運行程序:


波形截取成功
完整的pdf格式文檔51黑下載地址:
STM32L053可控PWM脈沖方法之DMA.pdf (295.4 KB, 下載次數(shù): 64)


回復(fù)

使用道具 舉報

ID:93931 發(fā)表于 2019-7-2 09:41 | 顯示全部樓層
樓主,我最近也在搞PWM的DMA方式,發(fā)送精確個數(shù)的PWM。不過有個問題,脈沖可以產(chǎn)生,而且跟DMA發(fā)送數(shù)目成正比,不過總會遺漏掉第一個脈沖。想求一份樓主的程序參考下,再次多謝
回復(fù)

使用道具 舉報

ID:477269 發(fā)表于 2019-10-23 20:26 | 顯示全部樓層
樓主打擾下,我想咨詢一下,我們用DMA來發(fā)送脈沖,我想加一個控制脈沖的加減速,是用T好,還是S好呢,請問要怎么樣寫呢,能給一個提示嗎
回復(fù)

使用道具 舉報

ID:595170 發(fā)表于 2020-2-2 15:44 | 顯示全部樓層
如何修改DMA_MemoryBaseAddr對應(yīng)的傳輸數(shù)據(jù),是DMA的關(guān)鍵,應(yīng)該在什么時候?qū)@些數(shù)據(jù)進行修改,還有要保證修改時不影響到PWM信號的輸出。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表