Files
2025-12-03 11:12:34 +08:00

131 lines
3.8 KiB
C

#ifndef _MCPWM_H_
#define _MCPWM_H_
#include "typedef.h"
#define MCPWM_NUM_MAX 8
#define MCPWM_CH_MAX 2
#define MCPWM_TMR_BASE_ADDR (&JL_MCPWM->TMR0_CON)
#define MCPWM_TMR_OFFSET (&JL_MCPWM->TMR1_CON - &JL_MCPWM->TMR0_CON)
#define MCPWM_CH_BASE_ADDR (&JL_MCPWM->CH0_CON0)
#define MCPWM_CH_OFFSET (&JL_MCPWM->CH1_CON0 - &JL_MCPWM->CH0_CON0)
//TMRx_CON reg
#define MCPWM_TMR_INCF 15
// #define MCPWM_TMR_RESERVE 14
#define MCPWM_TMR_UFPND 13
#define MCPWM_TMR_OFPN 12
#define MCPWM_TMR_UFCLR 11
#define MCPWM_TMR_OFCLR 10
#define MCPWM_TMR_UFIE 9
#define MCPWM_TMR_OFTE 8
#define MCPWM_TMR_CKSRC 7
#define MCPWM_TMR_CKPS 3 //4bit
// #define MCPWM_TMR_RESERVE 2
#define MCPWM_TMR_MODE 0 //2bit
//CHx_CON0 reg
#define MCPWM_CH_DTCKPS 12 //4bit
#define MCPWM_CH_DTPR 7 //5bit
#define MCPWM_CH_DTEN 6
#define MCPWM_CH_L_INV 5
#define MCPWM_CH_H_INV 4
#define MCPWM_CH_L_EN 3
#define MCPWM_CH_H_EN 2
#define MCPWM_CH_CMP_LD 0 //2bit
//CHx_CON1 reg
#define MCPWM_CH_FPND 15
#define MCPWM_CH_FCLR 14
// #define MCPWM_CH_RESERVE 12 //2bit
#define MCPWM_CH_INTEN 11
#define MCPWM_CH_TMRSEL 8 //3bit
// #define MCPWM_CH_reserve 5 //3bit
#define MCPWM_CH_FPINEN 4
#define MCPWM_CH_FPINAUTO 3
#define MCPWM_CH_FPINSEL 0 //3bit
//FPIN_CON reg
#define MCPWM_FPIN_EDGE 16 //8bit
#define MCPWM_FPIN_FLT_EN 8 //8bit
// #define MCPWM_CH_reserve 6 //2bit
#define MCPWM_FPIN_FLT_PR 8 //5bit
//MCPWM_CON reg
#define MCPWM_CON_CLK_EN 16
#define MCPWM_CON_TMR_EN 8 //8bit
#define MCPWM_CON_PWM_EN 0 //8bit2
/* pwm通道选择 */
typedef enum {
MCPWM_CH0 = 0,
MCPWM_CH1,
} mcpwm_ch_type;
/* 对齐方式选择 */
typedef enum {
MCPWM_EDGE_ALIGNED, ///< 边沿对齐模式
MCPWM_CENTER_ALIGNED, ///< 中心对齐模式
} mcpwm_aligned_mode_type;
/* 故障保护触发边沿 */
typedef enum {
MCPWM_EDGE_FAILL = 0, //下降沿触发
MCPWM_EDGE_RISE, //上升沿触发
MCPWM_EDGE_DEFAULT = 0xff, //默认会忽略
} mcpwm_edge;
/* MCPWM通道寄存器 */
typedef struct _mcpwm_ch_reg {
volatile u32 ch_con0;
volatile u32 ch_con1;
volatile u32 ch_cmph;
volatile u32 ch_cmpl;
} MCPWM_CHx_REG;
/* MCPWM TIMER寄存器 */
typedef struct _mcpwm_timer_reg {
volatile u32 tmr_con;
volatile u32 tmr_cnt;
volatile u32 tmr_pr;
} MCPWM_TIMERx_REG;
/* 初始化要用的参数结构体 */
typedef void (*mcpwm_detect_irq_callback)(u32 ch); //回调函数
struct mcpwm_config {
mcpwm_ch_type ch; ///< 选择pwm通道号
mcpwm_aligned_mode_type aligned_mode; ///< PWM对齐方式选择
u32 frequency; ///< 初始共同频率,CH0, CH, CH2,,,,,,
u16 duty; ///< 初始占空比,0~10000 对应 0%~100% 。每个通道可以有不同的占空比。互补模式的占空比体现在高引脚的波形上。
u16 h_pin; ///< 一个通道的H引脚。
u16 l_pin; ///< 一个通道的L引脚,不需要则填-1
u8 complementary_en; ///< 该通道的两个引脚输出的波形。0: 同步, 1: 互补,互补波形的占空比体现在H引脚上
u16 detect_port;
mcpwm_edge edge;
mcpwm_detect_irq_callback irq_cb;
u16 irq_priority; //默认值优先级1
};
struct mcpwm_info_t {
MCPWM_CHx_REG *ch_reg;
MCPWM_TIMERx_REG *timer_reg;
struct mcpwm_config cfg;
};
int mcpwm_init(struct mcpwm_config *mcpwm_cfg);
void mcpwm_deinit(int mcpwm_cfg_id);
void mcpwm_start(int mcpwm_cfg_id);
void mcpwm_pause(int mcpwm_cfg_id);
void mcpwm_resume(int mcpwm_cfg_id);
void mcpwm_set_frequency(int mcpwm_cfg_id, mcpwm_aligned_mode_type align, u32 frequency);
void mcpwm_set_duty(int mcpwm_cfg_id, u16 duty);
void mcpwm_fpnd_clr(u32 ch);
#endif