通过TIM+DMA Burst 实现STM32输出变频且不同脉冲数量的PWM波形

Burst介绍:

DMA控制器可以生成单次传输或增量突发传输,传输的节拍数为4、8或16。

为了确保数据一致性,构成突发传输的每组传输都是不可分割的:AHB传输被锁定,AHB总线矩阵的仲裁器在突发传输序列期间不会撤销DMA主设备的授权。

作用:

可以通过Burst进行多个寄存器的同时修改,在M2P时同时配置多个定时器。

burst会占用总线直到数据发完为止,此期间CPU打断不了,但是不连续的节拍之间CPU依然可以打断

问题剖析:

需要STM32输出 变频 且不同 脉冲 数量的 PWM 波形,具体要求如下:

交替输出两组参数:

参数组1:频率较高(ARR=1000),输出3个脉冲(RCR=2)。

参数组2:频率较低(ARR=5000),输出2个脉冲(RCR=1)。

实现方式:通过DMA Burst功能,在一次定时器事件中批量修改多个寄存器(ARR、RCR、CCR),无需CPU干预。

STM32的TIM模块支持DMA Burst功能,允许通过单次定时器事件触发多次DMA传输,从而批量更新多个寄存器。其核心硬件模块如下:

(1) 关键寄存器

TIMx_DCR(DMA控制寄存器):

DBSS (DMA Burst Source Selection):选择触发DMA Burst的事件源(如定时器更新事件)。

DBL (DMA Burst Length):设置一次DMA Burst传输的数据个数(例如3次传输,对应修改ARR、RCR、CCR)。

DBA (DMA Burst Address):设置DMA传输的起始寄存器地址偏移(例如ARR寄存器的地址偏移为0x2C)。

TIMx_DMAR(DMA地址寄存器):

DMA通过访问此寄存器,将数据写入目标寄存器(如ARR、RCR、CCR)。

(2) 工作原理

触发事件:定时器产生指定事件(如更新事件TIM_UPDATE)。

DMA请求:事件触发DMA Burst传输,DMA控制器根据TIMx_DCR配置的传输次数(DBL)和起始地址(DBA),将内存中的数据连续写入多个寄存器。

自动更新参数:寄存器值被修改后,定时器立即使用新参数生成PWM波形。

理解关键参数:

Burst Size与传输次数的关系

在STM32的DMA Burst模式中,Burst Size 表示 单次突发传输(Burst)中连续传输的数据单元个数,而 传输总次数 由以下两个参数共同决定:

Burst Size(突发传输单元数):例如设置为4,表示一次突发传输4个数据单元。

Data Width(数据宽度):每个数据单元的大小(字节、半字或字)。

NDTR(Number of Data):DMA传输的总数据单元数(需在代码中动态设置)。

公式:

总传输次数 = NDTR / Burst Size

例如:若NDTR=12,Burst Size=4,则总传输次数为3次(每次突发传输4个单元)。

这里我们让DMA Burst输出一次,一次传四个数据单元的值(实际上只用三个,但是mx中只可以配4increment,第四个数据传0即可),输出的脉冲个数通过传入的四个单元值中RCR 的值决定;

PWM 参数定义

ARR (Auto-Reload Register):决定PWM频率。

频率公式:PWM频率 = 定时器时钟 / (ARR + 1)

示例:

pulse10 = 1000 → 频率 = 100MHz / 1001 ≈ 99.9 kHz

pulse20 = 5000 → 频率 = 100MHz / 5001 ≈ 20 kHz

RCR (Repetition Counter Register):控制脉冲个数。

脉冲个数公式:脉冲数 = RCR + 1

示例:

pulse11 = 2 → 输出3个脉冲

pulse21 = 1 → 输出2个脉冲

CCR (Capture/Compare Register):决定占空比。

占空比公式:占空比 = CCR / (ARR + 1)

示例:

pulse12 = 500 → 占空比 ≈ 50%

pulse22 = 2500 → 占空比 ≈ 50%

参数结构:

cs 复制代码
uint32_t pulse1[3] = {1000, 2, 500};  // ARR=1000, RCR=2, CCR=500
uint32_t pulse2[3] = {5000, 1, 2500}; // ARR=5000, RCR=1, CCR=2500

CubeMX设置:

在CubeMX中配置Burst Size

打开DMA Settings标签页,选择对应的DMA通道。

设置 Burst Size 为 4 Increment(根据需求选择1/4/8/16)。

设置 Data Width 为 Word(32位,与TIM寄存器位宽一致)。

勾选 Increment Address(内存地址递增)。

选择 Mode 为 Normal 或 Circular。(若需持续传输,选择Circular模式并且设置足够大的NDTR)

每次DMA Burst需传输3个寄存器值(ARR、RCR、CCR)。

每个寄存器为32位(4字节),共需传输12字节。

Burst Size = 4 Increment(每次传输4个数据单元,但实际仅用3个,最后一个填充0)。

Data Width = Word(32位)。

NDTR = 3(传输3个数据单元)。

HAL_DMA_Start_IT()函数原型:

cpp 复制代码
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)

代码实现:

cpp 复制代码
uint32_t pulse_data[4] = {1000, 2, 500, 0}; // 第4个数据填充0
HAL_DMA_Start_IT(&hdma_tim1, (uint32_t)pulse_data, (uint32_t)&TIM1->DMAR, 3);// NDTR=3

交替输出的实现

(1) 中断切换模式

第一次传输:DMA传输pulse1到TIM寄存器。

传输完成中断:在中断回调函数中重新配置DMA,传输pulse2。

循环触发:重复上述过程,实现交替输出。

(2) 双缓冲模式

配置双缓冲:使能DMA双缓冲,设置两组内存地址(pulse1和pulse2)。

自动切换:DMA传输完当前缓冲区后,自动切换到下一组参数,无需CPU干预。

关键代码片段(基于 HAL 库)

cpp 复制代码
// 1. DMA传输完成中断回调函数
void HAL_TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma) {
  // 切换参数组
  static uint8_t is_pulse1 = 0;
  if (is_pulse1) {
    HAL_DMA_Start_IT(&hdma_tim1, (uint32_t)pulse1, (uint32_t)&TIM1->DMAR, 3);
  } else {
    HAL_DMA_Start_IT(&hdma_tim1, (uint32_t)pulse2, (uint32_t)&TIM1->DMAR, 3);
  }
  is_pulse1 = !is_pulse1;
}

// 2. 主函数初始化
int main(void) {
  // 初始化定时器和DMA
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_DMA_Start_IT(&hdma_tim1, (uint32_t)pulse1, (uint32_t)&TIM1->DMAR, 3);
  while (1) {
    // 其他任务
  }
}
相关推荐
szxinmai主板定制专家11 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
HQB202613 小时前
屹晶微电子 EG1130|2‑24V 输入 / 最高 28V 输出 内置 MOS 异步升压 DC‑DC|SOT23‑6|摄像头 / 车充 / 电池充电电源
嵌入式硬件·硬件工程
泛凡(Linyongui)15 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
十年磨一剑~16 小时前
Linux 内核中断处理机制与软硬件协同流程
linux·嵌入式硬件
糖糖单片机设计16 小时前
基于单片机的热水器节能控制系统
单片机·嵌入式硬件
数字新视界17 小时前
数字孪生技术赋能智能化转型与创新实践
嵌入式硬件·物联网·系统架构·机房管理·动力与环境监控系统
HQB202618 小时前
屹晶微电子 EG1195|10‑120V/10A+ 外置 MOS 异步降压控制器|ESOP‑8|电动车转换器 / 快充 / 工业电源
嵌入式硬件·硬件工程
不悔哥19 小时前
开源LineageOS:旧手机刷上开源系统
嵌入式硬件·智能手机·开源
服务器硬件项目经理19 小时前
《超节点修仙录》· 第一卷·炼气期【第04话】 超节点 vs 普通服务器——不就是多插了几张卡吗?
运维·服务器·人工智能·嵌入式硬件·深度学习·机器学习
一次调频AGCAVC20 小时前
一次调频系统控制柜的组成及一次调频装置主机功能详述
人工智能·嵌入式硬件