問題背景
客戶需要 MCU 輸出一組變頻的 PWM 波形來控制外圍器件,并且不同頻率脈沖的個數也不同。STM32U5 芯片擁有 TIM1/TIM8 高級定時器,還有通用定時器TIM2/TIM3/TIM4/TIM5 以及 TIM15/TIM16/TIM17。TIM 模塊中,可通過修改 ARR 寄存器的值來修改 PWM 的頻率。如果使用 TIM1/TIM8 或者 TIM15/TIM16/TIM17,則可以通過修改 RCR 與 CCR 寄存器,來控制脈沖個數及占空比。由于要同時修改多個 TIM 寄存器,需要使用 TIM 的 DMA burst 功能來實現此需求。
TIM DMA burst
STM32 片內部分 TIMER 在產生單個定時器事件情況下可以基于特定硬件機制觸發(fā)多個 DMA 請求,這樣產生多個連續(xù)的 DMA 傳輸來實現對多個 TIMER 寄存器的批量訪問。這就是所謂的 TIM DMA burst 功能,這里有兩個專用寄存器:
TIMx_DCR :
DBSS : 觸發(fā) DMA burst 的事件源
DBL : DMA burst 傳輸個數
DBA : DMA burst 傳輸的 TIM 寄存器基地址索引
TIMx_DMAR :
TIM DMA Burst 時,DMA 訪問此寄存器
產生 PWM
本文使用 TIM1 來產生 PWM,在 U575 NECLEO 板上測試,MCU 主頻為 100MHz。
使用兩個頻率分別對應 TIM 寄存器組的值如下:ARR/ RCR/ CCR1
uint32_t pulse1[3] = {1000, 2, 500} ;
uint32_t pulse2[3] = {5000, 1, 2500} ;
即輸出 3 個 pulse1 的脈沖后,再輸出 2 個 pulse2 脈沖,這樣交替輸出。
小結
使用 TIM DMA burst 功能,結合 STM32U5 的 GPDMA Linked list 模式及 2D 尋址特性,能靈活的輸出 PWM 波形滿足客戶需求。