WCH官方提供的例程PWMX是8位的PWM,占空比可调,PWM 周期固定可选8 种周期,
int main() { SetSysClock(CLK_SOURCE_PLL_60MHz); //Fsys /* 配置GPIO */ GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeOut_PP_5mA); // PA12 - PWM4 GPIOA_ModeCfg(GPIO_Pin_13, GPIO_ModeOut_PP_5mA); // PA13 - PWM5 GPIOB_ModeCfg(GPIO_Pin_0, GPIO_ModeOut_PP_5mA); // PB0 - PWM6 GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA); // PB4 - PWM7 GPIOB_ModeCfg(GPIO_Pin_6, GPIO_ModeOut_PP_5mA); // PB6 - PWM8 GPIOB_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA); // PB7 - PWM9 GPIOB_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA); // PB14 - PWM10 // GPIOB_ModeCfg(GPIO_Pin_23, GPIO_ModeOut_PP_5mA); // PB23 - PWM11 此脚复用为外部复位脚,需要关闭此功能才能开启PWM功能 PWMX_CLKCfg(4); // cycle = 4/Fsys PWMX_CycleCfg(PWMX_Cycle_64); // 周期 = 64*cycle PWMX_ACTOUT(CH_PWM4, 64 / 4, Low_Level, ENABLE); // 25% 占空比 PWMX_ACTOUT(CH_PWM5, 64 / 4, Low_Level, ENABLE); // 25% 占空比 PWMX_ACTOUT(CH_PWM6, 64 / 4, Low_Level, ENABLE); // 25% 占空比 PWMX_ACTOUT(CH_PWM7, 64 / 4, Low_Level, ENABLE); // 25% 占空比 PWMX_ACTOUT(CH_PWM8, 64 / 4, Low_Level, ENABLE); // 25% 占空比 PWMX_ACTOUT(CH_PWM9, 64 / 4, Low_Level, ENABLE); // 25% 占空比 PWMX_ACTOUT(CH_PWM10, 64 / 4, Low_Level, ENABLE); // 25% 占空比 while(1); }
代码是比较简单的,
1.设置对应的PWM引脚为输出方向,设置I/O驱动能力,
2.设置寄存器R8_PWM_CLOCK_DIV(范围1-255),配置PWM 的基准时钟频率;
3.设置PWM配置控制寄存器R8_PWM_CONFIG,设置PWM的模式、数据位宽、周期;
4.设置PWM输出极性配置寄存器R8_PWM_POLAR,配置对应PWMx的输出极性;
5.根据需要的占空比计算出数据,写入对应的数据保持寄存器R8_PWMx_DATA;
6.设置PWM输出使能寄存器R8_PWM_OUT_EN,开启对应的PWMx输出使能;
调整R8_PWMx_DATA寄存器可修改输出PWM的占空比,占空比计算公式:
Ncyc = RB_PWM_CYCLE_SEL ? (2^n-1) : (2^n)
(其中n=数据位宽),Ncyc 结果在31~256 之间。
PWMx输出有效电平的占空比 = R8_PWMx_DATA / Ncyc * 100%
PWMx输出频率Fpwmout = Fpwm / Ncyc = Fsys/R8_PWM_CLOCK_DIV / Ncyc
如果跑蓝牙功能,Fsys设置为60M最好不要改动,R8_PWM_CLOCK_DIV 范围是1-255,Ncyc为八档可调(31/32,63/64,127/128,255/256),所以频率不可以随意配置。
主频60M:最低频率为60M/255/256=919.12 约1k
最高频率为60M/1/31=1935483.87 约2M
标签:CH579,64,例程,CH573,R8,PWMX,占空比,GPIO,PWM From: https://www.cnblogs.com/risc5-ble/p/17386326.html