Files
AC707N/SDK/interface/driver/cpu/periph/gptimer.h
T
2025-12-03 11:12:34 +08:00

135 lines
5.4 KiB
C

#ifndef __GPTIMER_H__
#define __GPTIMER_H__
#include "asm/gptimer_hw.h"
extern const u32 lib_gptimer_src_lsb_clk; //时钟源选择lsb_clk, 单位:Hz
extern const u32 lib_gptimer_src_std_clk; //时钟源选择std_x_clk, 单位:Hz
extern const u8 lib_gptimer_timer_mode_en; //gptimer timer功能使能
extern const u8 lib_gptimer_pwm_mode_en; //gptimer pwm功能使能
extern const u8 lib_gptimer_capture_mode_en; //gptimer capture功能使能
extern const u8 lib_gptimer_auto_tid_en; //gptimer_tid 内部自动分配使能
enum gptimer_mode : u8 {
GPTIMER_MODE_TIMER = 0, //定时模式
GPTIMER_MODE_PWM, //pwm模式
GPTIMER_MODE_CAPTURE_EDGE_RISE, //上升沿捕获
GPTIMER_MODE_CAPTURE_EDGE_FALL, //下降沿捕获
GPTIMER_MODE_CAPTURE_EDGE_ANYEDGE, //双边沿捕获
};
enum gptimer_para : u8 { //从寄存器当前状态获取timer参数
GPTIMER_PARA_PERIOD = 0,
GPTIMER_PARA_FREQ,
GPTIMER_PARA_DUTY,
GPTIMER_PARA_CAPTURE,
};
enum gptimer_err : u8 { //返回值类型
GPTIMER_ERR_INIT_FAIL = 0xFF,
};
typedef void (*timer_irq_callback)(u32 tid, void *private_data); //回调函数
struct gptimer_timer { //计时(计数)器配置
u32 period_us;
};
struct gptimer_pwm { //pwm配置
u32 freq;
enum gpio_port port;
u16 pin;
u16 duty; //x10000
};
struct gptimer_capture { //捕获配置
u32 filter; //需要滤除的频率,单位 Hz
u32 max_period; //最大捕获周期, 单位:us, 需要用到才配置,默认配置0
enum gpio_port port;
u16 pin;
};
struct gptimer_config {
union {
struct gptimer_timer timer;
struct gptimer_pwm pwm;
struct gptimer_capture capture;
};
timer_irq_callback irq_cb;
void *private_data; //用户参数
u8 irq_priority;
enum gptimer_mode mode; //工作模式
};
//以下为对外 api 接口---------------------------------------------------------
u32 gptimer_init(const timer_dev timerx, const struct gptimer_config *gt_cfg);
u32 gptimer_deinit(u32 tid);
u32 gptimer_start(u32 tid);
u32 gptimer_pause(u32 tid);
u32 gptimer_resume(u32 tid);
u32 gptimer_set_timer_period(u32 tid, u32 period_us);
u32 gptimer_get_timer_period(u32 tid);
u32 gptimer_set_pwm_freq(u32 tid, u32 freq);
u32 gptimer_get_pwm_freq(u32 tid);
u32 gptimer_set_pwm_duty(u32 tid, u32 duty);
u32 gptimer_get_pwm_duty(u32 tid);
u32 gptimer_pwm_flip(u32 tid);
u32 gptimer_pwm_enable(u32 tid);
u32 gptimer_pwm_disable(u32 tid);
u32 gptimer_set_capture_edge_type(u32 tid, enum gptimer_mode edge_type);
enum gptimer_mode gptimer_get_capture_edge_type(u32 tid);
u32 gptimer_set_irq_callback(u32 tid, void (*irq_cb)(u32 tid, void *private_data));
enum gptimer_mode gptimer_get_work_mode(u32 tid);
u32 gptimer_set_work_mode(u32 tid, enum gptimer_mode type);
u32 gptimer_set_capture_filter(u32 tid, u32 filter);
u32 gptimer_get_capture_filter(u32 tid);
u32 gptimer_set_capture_count(u32 tid, u32 cnt);
u32 gptimer_get_capture_count(u32 tid);
u32 gptimer_get_capture_cnt2us(u32 tid); //捕获发生时调用有效
u32 gptimer_set_count(u32 tid, u32 cnt);
u32 gptimer_get_count(u32 tid);
u32 gptimer_set_prd(u32 tid, u32 prd);
u32 gptimer_get_prd(u32 tid);
void *gptimer_get_private_data(u32 tid);
void gptimer_set_private_data(u32 tid, void *private_data);
u32 gptimer_measure_time_init(const timer_dev timerx, u32 max_time_us); //比实际时间少约40us
u32 gptimer_measure_time_start(u32 tid);
u32 gptimer_measure_time_end(u32 tid);
void gptimer_set_extern_clk(u32 tid, u32 clk_freq, enum gpio_port port, u16 pin, u8 enable);
void gptimer_dump();
//以下为底层驱动接口,直接操作寄存器---------------------------------------------------------
u32 timer_hw_timer_init(GPTIMER *GPTIMERx, u32 period_us, u32 priority, void (*irq_cb)(u32 tid, void *private_data));
u32 timer_hw_pwm_init(GPTIMER *GPTIMERx, enum gpio_port port, u32 pin, u32 freq, u32 duty);
u32 timer_hw_capture_init(GPTIMER *GPTIMERx, enum gpio_port port, u32 pin, u32 edge_type, u32 filter, u32 max_period, u32 priority, void (*irq_cb)(u32 tid, void *private_data));
// void timer_hw_deinit(GPTIMER *GPTIMERx);
void timer_hw_timer_deinit(GPTIMER *GPTIMERx);
void timer_hw_pwm_deinit(GPTIMER *GPTIMERx, enum gpio_port port, u32 pin);
void timer_hw_capture_deinit(GPTIMER *GPTIMERx, enum gpio_port port, u32 pin, u32 filter);
void timer_hw_start(GPTIMER *GPTIMERx, enum gptimer_mode mode);
u32 timer_hw_pause(GPTIMER *GPTIMERx);
u32 timer_hw_set_cur_para(GPTIMER *GPTIMERx, enum gptimer_para para_type, u32 para0, u32 para1);
u32 timer_hw_get_cur_para(GPTIMER *GPTIMERx, enum gptimer_para para_type);
void timer_hw_pwm_flip(GPTIMER *GPTIMERx);
void timer_hw_pwm_enable(GPTIMER *GPTIMERx);
void timer_hw_pwm_disable(GPTIMER *GPTIMERx);
void timer_hw_set_irq_cb(GPTIMER *GPTIMERx, void (*irq_cb)(u32 tid, void *private_data), u8 priority);
void timer_hw_set_work_mode(GPTIMER *GPTIMERx, enum gptimer_mode type);
u32 timer_hw_get_work_mode(GPTIMER *GPTIMERx);
u32 timer_hw_get_capture_filter(GPTIMER *GPTIMERx);
void timer_hw_set_cnt(GPTIMER *GPTIMERx, int cnt);
u32 timer_hw_get_cnt(GPTIMER *GPTIMERx);
void timer_hw_set_prd(GPTIMER *GPTIMERx, u32 prd);
u32 timer_hw_get_prd(GPTIMER *GPTIMERx);
u32 hw_irflt_set_clk(u32 *clk_src_set, u32 *clk_div_set, u32 filter);
GPTIMER *timer_hw_tid2timer(u32 tid);
void timer_hw_clr_pnd(GPTIMER *GPTIMERx);
u32 timer_hw_idle_check(GPTIMER *GPTIMERx);
u32 timer_hw_tick2us(GPTIMER *GPTIMERx, u32 tick);
void timer_hw_set_extern_clk(GPTIMER *GPTIMERx, u32 clk_freq, enum gpio_port port, u16 pin, u8 enable);
#endif