#include "include.h" /* G1 G2 G3 G4 G5 PWM0: PA0 PA6 PB4 PE0 PF0 PWM1: PA1 PA7 PB5 PE1 PF1 PWM2: PA2 PB0 PB6 PE2 PF2 PWM3: PA3 PB1 PB7 PE3 PF3 PWM4: PA4 PB2 PE6 PE4 PF4 PWM5: PA5 PB3 PE7 PE5 PF5 */ static const int pwm_gpio_reg[GPIO_PWM0_MAX] = { IO_PA0, IO_PA6, IO_PB4, IO_PE0, IO_PF0, IO_PA1, IO_PA7, IO_PB5, IO_PE1, IO_PF1, IO_PA2, IO_PB0, IO_PB6, IO_PE2, IO_PF2, IO_PA3, IO_PB1, IO_PB7, IO_PE3, IO_PF3, IO_PA4, IO_PB2, IO_PE6, IO_PE4, IO_PF4, IO_PA5, IO_PB3, IO_PE7, IO_PE5, IO_PF5, }; static bool pwm_freq_is_init = 0; /** * @brief 设置PWM的频率 硬件PWM共用一个timer5,频率是一样的,只是占空比分开可调; * @param[in] freq 设置频率 Hz * * @return 返回是否成功 **/ bool bsp_pwm_freq_set(u32 freq) { // TMR5CON = 0; TMR5PR = 26000000/freq; TMR5CPND = BIT(9); TMR5CNT = 0; TMR5CON |= (2<<1) | BIT(0); // xosc26 pwm_freq_is_init = 1; return true; } /** * @brief 设置PWM0的占空比 * @param[in] gpio PWM0对应的GPIO选项 * @param[in] duty 占空比,0-100% * @param[in] invert 输出是否反向 * * @return 返回是否成功 **/ bool bsp_pwm_duty_set(pwm_gpio gpio, u32 duty, bool invert) { printf("bsp_pwm_duty_set gpio: %d %d\n", gpio, sys_cb.gui_sleep_sta); printf("bsp_pwm_duty_set duty: %d\n", duty); gpio_t gpio_reg; int group_num, group_id; volatile uint32_t *duty_reg; if(gpio >= GPIO_PWM0_MAX){ return false; } if(duty > 100){ duty = 100; } if(pwm_freq_is_init == 0){ bsp_pwm_freq_set(500); // 如果没初始化频率,默认设置为500Hz } //IO Init bsp_gpio_cfg_init(&gpio_reg, pwm_gpio_reg[gpio]); gpio_reg.sfr[GPIOxDE] |= BIT(gpio_reg.num); gpio_reg.sfr[GPIOxPU] &= ~BIT(gpio_reg.num); gpio_reg.sfr[GPIOxDIR] &= ~ BIT(gpio_reg.num); group_num = gpio/5; group_id = gpio - group_num*5; TMR5CON |= BIT(16 + group_num*2); TMR5CON |= invert << (17 + group_num*2); duty_reg = (void *)&TMR5DUTY0 + group_num*4; *duty_reg = TMR5PR*duty/100; FUNCMCON1 = (FUNCMCON1 & (~(0xf << (8 + group_num*4)))) | ((group_id+1) << (8 + group_num*4)); return true; } /** * @brief 关闭pwmx * @param[in] gpio PWMx对应的GPIO选项 * * @return 返回是否成功 **/ bool bsp_pwm_disable(pwm_gpio gpio) { printf("bsp_pwm_disable: %d\n", gpio); gpio_t gpio_reg; int pwm_num; if(gpio >= GPIO_PWM0_MAX) { return false; } //IO deinit bsp_gpio_cfg_init(&gpio_reg, pwm_gpio_reg[gpio]); gpio_reg.sfr[GPIOxDE] &= ~BIT(gpio_reg.num); gpio_reg.sfr[GPIOxDIR] |= BIT(gpio_reg.num); //TMR5CON deinit pwm_num = gpio / 5; TMR5CON &= ~BIT(16 + pwm_num * 2); FUNCMCON1 = (FUNCMCON1 & (~(0xf << (8 + pwm_num * 4)))); pwm_freq_is_init = false; return true; }