117 lines
3.6 KiB
C
117 lines
3.6 KiB
C
|
||
#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();
|
||
}
|
||
} |