mcu_ab568x/userboot240328/app/platform/bsp/bsp_pwm.c
2025-05-30 18:03:10 +08:00

121 lines
3.0 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 "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;
}