eFlexPWM 拥有多个独立的子模块(例如 PWM0, PWM1, PWM2 ...)。这些子模块可以独立工作,也可以通过同步信号让一个子模块(主模块)去控制另一个子模块(从模块)的计数器启停和相位。
[C] 纯文本查看 复制代码 // 假设系统时钟和PWM时钟已配置为60MHz
#define PWM_CLK_HZ 60000000UL
#define PERIOD_10K ((PWM_CLK_HZ / 10000) - 1) // 5999
// 1. 配置主模块 PWM0 为 10kHz,50% 占空比
PWM0->SM[0].INIT = 0; // 计数器初始值
PWM0->SM[0].VAL1 = PERIOD_10K; // 周期值
PWM0->SM[0].VAL2 = PERIOD_10K / 2; // 比较值,50% 占空比
PWM0->SM[0].VAL3 = 0; // 其他比较值...
PWM0->SM[0].VAL4 = 0;
PWM0->SM[0].VAL5 = 0;
// 设置 PWM0 为主同步源
PWM0->SM[0].CTRL2 |= PWM_CTRL2_INIT_SEL(0); // 本地同步
PWM0->SM[0].CTRL2 |= PWM_CTRL2_SOC_SEL(0); // 同步选择
PWM0->SM[0].CTRL2 |= PWM_CTRL2_FORCE_SEL(2); // 强制在初始化时加载
PWM0->OUTEN |= ... ; // 使能PWM0输出
// 2. 配置从模块 PWM1 为 5kHz,50% 占空比
// 注意:PWM1的周期寄存器设置为和PWM0相同,因为它的时钟被2分频了
PWM1->SM[0].INIT = 0;
PWM1->SM[0].VAL1 = PERIOD_10K; // 周期值与PWM0相同!
PWM1->SM[0].VAL2 = PERIOD_10K / 2; // 50% 占空比
// 设置 PWM1 接收 PWM0 的同步信号,并2分频
PWM1->SM[0].CTRL2 |= PWM_CTRL2_INIT_SEL(1); // 初始化信号源选择为PWM0 (值1代表PWM0)
PWM1->SM[0].CTRL1 |= PWM_CTRL1_PRSC(1); // 预分频器 = 2 (0b001)
PWM1->SM[0].CTRL2 |= PWM_CTRL2_FORCE_SEL(2);
PWM1->SM[0].CTRL2 |= PWM_CTRL2_REINIT_MASK; // 使能通过同步信号重新初始化
PWM1->OUTEN |= ... ; // 使能PWM1输出
// 3. 关键的启动顺序
// 先启动从模块
PWM1->MCTRL |= PWM_MCTRL_LDOK(1 << 0); // 加载PWM1子模块0的寄存器
PWM1->MCTRL |= PWM_MCTRL_RUN(1 << 0); // 运行PWM1子模块0(它会等待同步信号)
// 再启动主模块
PWM0->MCTRL |= PWM_MCTRL_LDOK(1 << 0); // 加载PWM0子模块0的寄存器
PWM0->MCTRL |= PWM_MCTRL_RUN(1 << 0); // 运行PWM0子模块0,并立即发出同步信号
deepseek给的代码,https://chat.deepseek.com/share/o95ubg6hmf4452ce31 |