121 lines
3.0 KiB
C
121 lines
3.0 KiB
C
#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;
|
||
}
|
||
|