目錄
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 子產品