目录
1、相关寄存器
- 控制寄存器
- PWM 时钟选择寄存器
- PWM 翻转点设置计数值寄存器
- PWM 计数值寄存器
- PWM 通道控制寄存器
2、编写流程
- 配置GPIO工作模式(推挽输出)
- 切换PWM引脚
- 设置时钟、周期
- 设置低电平翻转值
- 使能PWM输出
- 启动PWM
#define PWMx_CR_BASE_ADDR 0xff04
#define PWMx_T1_BASE_ADDR 0xff00
#define PWMx_T2_BASE_ADDR 0xff02
uint16 match_temp;
uint16 period_temp;
uint8 freq_div = 0;
pwm_set_gpio(pwmch); //设置为推挽输出
//清除PWM引脚
(*(unsigned char volatile xdata *)(PWMx_CR_BASE_ADDR + (pwmch & 0xF0))) &= ~(0x03 << 3);
//切换PWM引脚
(*(unsigned char volatile xdata *)(PWMx_CR_BASE_ADDR + (pwmch & 0xF0))) |= (pwmch & 0x03) << 3;
freq_div = (sys_clk / freq) >> 15;
period_temp = sys_clk / freq / (freq_div + 1); //周期
match_temp = period_temp * ((float) duty / PWM_DUTY_MAX); //占空比
//设置pwmn频率为 系统时钟/freq_div
PWMCKS = freq_div;
//设置PWMn周期为period_temp个 PWM 时钟
PWMC = (uint16)period_temp;
// 在计数值为 match_temp 地方 pwmch 通道输出低电平
(*(unsigned int volatile xdata *)(PWMx_T1_BASE_ADDR + (pwmch & 0xF0))) = (uint16)match_temp;
// // 在计数值为 match_temp 地方 pwmch 通道输出高电平
// (*(unsigned int volatile xdata *)(PWMx_T2_BASE_ADDR + (pwmch & 0xF0))) = (uint16)0;
//使能 PWMx 输出
(*(unsigned char volatile xdata *)(PWMx_CR_BASE_ADDR + (pwmch & 0xF0))) |= 1 << 7;
PWMCR = 0x80; // 启动 PWM 模块