Files
2026-08-05 19:07:52 +08:00

117 lines
3.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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[0select pwm_en、1select 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[0select pwm_en、1select 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();
}
}