一.前言
目標要求:系統(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 個脈沖。 運行程序:
|