#include "Includes.h" #define ENABLE_PWMS() *PWMx_EN(0)|=(0x40) //enable all select pwm #define DISABLE_PWMS() *PWMx_EN(0)&=(~0x40) void init_pwm(uint32_t ch,uint32_t ocpy,uint32_t period) { //config pwm clk *CPR_CTLAPBCLKEN_GRCTL=0x10001000; //enable pwm pclk *CPR_PWM_CLK_CTL=0x80000009; //pwm_clk=mclk_in(24M)/(2*(9+1))=1.2M //config regs /*PWMx_EN(0) 6 pwm_en_all ............*/ /*PWMx_EN(ch) 5 sleep_en 4 sleep_incr 3 pwm_en_sel[0:select pwm_en、1:select pwm_en_all] 2:1 pwm_mode[0:100、1:1000、2:4000、3:occupy_ratio_config+1] 0 pwm_en */ *PWMx_EN(ch)&=(~0x01); //disable pwm #if 1 *PWMx_P(ch)=period; //freq(HZ)=pwm_clk/((period + 1)*100)) *PWMx_OCPY(ch)=ocpy; //set pwm ocpy *PWMx_EN(ch)=(*PWMx_EN(ch)&(~0x06))|(0<<1);//bit2:1 pwm_mode[0:100、1:1000、2:4000、3:occupy_ratio_config+1] #else *PWMx_P(ch)=2; //freq(HZ)=pwm_clk/((period + 1)*100)) *PWMx_OCPY(ch)=(199<<16)|ocpy; //set pwm ocpy *PWMx_EN(ch)=(*PWMx_EN(ch)&(~0x06))|(3<<1);//bit2:1 pwm_mode[0:100、1:1000、2:4000、3:occupy_ratio_config+1] #endif *PWMx_UP(ch)=0x1; //update ocpy period // *PWMx_EN(ch)=(*PWMx_EN(ch)&(~0x30))|(2<<4); *PWMx_EN(ch)=(*PWMx_EN(ch)&(~0x08))|(1<<3); //bit3 pwm_en_sel[0:select pwm_en、1:select pwm_en_all] // *PWMx_EN(ch)|=(0x1);//enable pwm(ch) #if 1 //enable pwm0_inv/pwm1_inv/pwm2_inv/pwm3_inv if(ch<4) { *PWMCOMPEN(ch)=0x01; //enable PWM 0 1 2 3 complementary signal output *PWMCOMPTIME(ch)=0x01; //[bit2:0] } #endif #if 1 /*PWM_BREAK_CTL 19:17 pwm_brk_enable RW 使能pwm的刹车功能, 1使能 16 pwm_brk_sync R 内部硬件刹车信号的值,用于软件判断硬件刹车状态1:硬件刹车信号有效,0:硬件刹车信号无效 14:12 pwm_brk_mask RW PWM_BRK信号屏蔽,每位分别屏蔽一路,0:不屏蔽1:屏蔽 11:9 pwm_brk_inv RW PWM_BRK信号反向,每位分别反向一路,0:不反向1:反向 8 brk_mode RW 硬件恢复模式和软件恢复模式选择: 7 brk_dbc_en RW PWM_BRK信号的滤毛刺使能 6:1 brk_dbc_step RW PWM_BRK信号的滤毛刺步长。步长为1个pwm_clk时钟周期 0 brk_clear RC1 软件恢复模式退出刹车模式:1:退出刹车模式 0:无效*/ *PWM_BREAK_CTL=0; //clear regs *PWM_BREAK_CTL=(2<<1)|(1<<7)|(0<<8)|(0<<9)|(6<<12)|(7<<17); #endif } void test_pwm(void) { gpio_mux_ctl(0,2);//pwm2 gpio_mux_ctl(1,2);//pwm3 gpio_mux_ctl(2,0);gpio_fun_inter(2,0);gpio_fun_sel(2,PWM0);//pwm0 gpio_mux_ctl(8,0);gpio_fun_inter(8,0);gpio_fun_sel(8,PWM1);//PWM1 gpio_mux_ctl(3,0);gpio_fun_inter(3,0);gpio_fun_sel(3,PWM0_INV);//pwm0_INV // gpio_mux_ctl(4,0);gpio_fun_inter(4,0);gpio_fun_sel(4,PWM2_INV);//PWM2_INV gpio_mux_ctl(4,1);// gpio_mux_ctl(9,0);gpio_fun_inter(9,0);gpio_fun_sel(9,PWM1_INV);//PWM1_INV //三路刹车单独使用 gpio_mux_ctl(4,1);//pwm_brk[0] // gpio_mux_ctl(5,1);//pwm_brk[1] // gpio_mux_ctl(6,1);//pwm_brk[2] init_pwm(0,22,119);//100HZ init_pwm(1,33,119);//100HZ init_pwm(2,44,119);//100HZ init_pwm(3,55,119);//100HZ ENABLE_PWMS(); //enable all select pwm while(1); { // ENABLE_PWMS(); //enable all select pwm for(int i=0;i<0xA550;i++); // DISABLE_PWMS(); for(int i=0;i<0xA550;i++); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __WFI(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); printf("sleep...\n"); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); } }