1.8. GPTIMER
gptimer支持计数、延时、定时、PWM、捕获。捕获模式支持滤波,双边沿触发
1.8.1. gptimer_init
timer模块初始化。
原型:
u32 gptimer_init(const timer_dev timerx, const struct gptimer_config *gt_cfg);
参数:
gptimer
timer配置
返回值
tiemr句柄(id号)
1.8.2. gptimer_deinit
timer模块释放。
原型:
u32 gptimer_deinit(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
0
1.8.3. gptimer_start
timer/pwm/capture功能启动。
原型:
u32 gptimer_start(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
0
1.8.4. gptimer_pause
timer/pwm/capture功能暂停。
原型:
u32 gptimer_pause(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
0
1.8.5. gptimer_resume
timer/pwm/capture功能恢复。
原型:
u32 gptimer_resume(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
保留
1.8.6. gptimer_set_timer_period
设置timer功能定时时间,单位us。
原型:
u32 gptimer_set_timer_period(u32 tid, u32 period_us);
参数:
tid
init时返回的句柄(id号)
us
定时时间,单位:us
返回值
0
1.8.7. gptimer_get_timer_period
获取timer功能定时时间,单位us。
原型:
u32 gptimer_get_timer_period(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
定时时间,单位:us
1.8.8. gptimer_set_pwm_freq
设置pwm功能输出频率,单位Hz。
原型:
u32 gptimer_set_pwm_freq(u32 tid, u32 freq);
参数:
tid
init时返回的句柄(id号)
freq
输出频率,单位:Hz
返回值
0
1.8.9. gptimer_get_pwm_freq
获取pwm功能输出频率,单位Hz。
原型:
u32 gptimer_get_pwm_freq(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
输出频率,单位:Hz
1.8.10. gptimer_set_pwm_duty
设置pwm功能输出占空比。
原型:
u32 gptimer_set_pwm_duty(u32 tid, u32 duty);
参数:
tid
init时返回的句柄(id号)
duty
占空比,例:5123,占空比51.23%
返回值
0
1.8.11. gptimer_get_pwm_duty
获取pwm功能输出占空比。
原型:
u32 gptimer_get_pwm_duty(u32 tid);
参数:
tid
init时返回的句柄(id号)
duty
占空比,例:5123,占空比51.23%
1.8.12. gptimer_pwm_flip
翻转pwm输出。
原型:
u32 gptimer_pwm_flip(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
0
1.8.13. gptimer_pwm_enable
pwm输出使能。
原型:
u32 gptimer_pwm_enable(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
0
1.8.14. gptimer_pwm_disable
pwm输出关闭。
原型:
u32 gptimer_pwm_disable(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
0
1.8.15. gptimer_set_capture_edge_type
设置capture功能捕获边沿,边沿类型:上升沿、下降沿、双边沿。
原型:
u32 gptimer_set_capture_edge_type(u32 tid, enum gptimer_mode edge_type);
参数:
tid
init时返回的句柄(id号)
edge_type
边沿类型
返回值
0
1.8.16. gptimer_get_capture_edge_type
获取capture功能捕获边沿。
原型:
enum gptimer_mode gptimer_get_capture_edge_type(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
边沿类型:上升沿、下降沿、双边沿
1.8.17. gptimer_set_irq_callback
设置回调函数。
原型:
u32 gptimer_set_irq_callback(u32 tid, void (*irq_cb)(u32 tid, void *private_data));
参数:
tid
init时返回的句柄(id号)
irq_cb
回调函数
返回值
0
1.8.18. gptimer_get_work_mode
获取当前工作模式。
原型:
enum gptimer_mode gptimer_get_work_mode(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
工作模式
1.8.19. gptimer_set_work_mode
设置工作模式。
原型:
u32 gptimer_set_work_mode(u32 tid, enum gptimer_mode type);
参数:
tid
init时返回的句柄(id号)
type
工作模式
返回值
0
1.8.20. gptimer_set_capture_filter
设置capture功能滤波参数。小于滤波参数的波被过滤。
原型:
u32 gptimer_set_capture_filter(u32 tid, u32 filter);
参数:
tid
init时返回的句柄(id号)
filter_us
滤波参数,单位:us。
1.8.21. gptimer_get_capture_filter
获取capture功能滤波时间。
原型:
u32 gptimer_get_capture_filter(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
滤波参数,单位:us。
1.8.22. gptimer_set_capture_count
设置capture功能count计数器的原始值。
原型:
u32 gptimer_set_capture_count(u32 tid, u32 cnt);
参数:
tid
init时返回的句柄(id号)
返回值
0
1.8.23. gptimer_get_capture_count
获取capture功能count计数器的原始值。
原型:
u32 gptimer_get_capture_count(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
count计数器原始值
1.8.24. gptimer_get_capture_cnt2us
获取capture功能count计数器值,并转换为时间 us。
原型:
u32 gptimer_get_capture_cnt2us(u32 tid); //捕获发生时调用有效
参数:
tid
init时返回的句柄(id号)
返回值
时间 单位:us
1.8.25. gptimer_set_count
设置count计数器的值。
原型:
u32 gptimer_set_count(u32 tid, u32 cnt);
参数:
tid
init时返回的句柄(id号)
cnt
conut值
返回值
0
1.8.26. gptimer_get_count
获取count计数器的原始值。
原型:
u32 gptimer_get_count(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
count计数器原始值
1.8.27. gptimer_set_prd
设置prd寄存器的值。
原型:
u32 gptimer_set_prd(u32 tid, u32 prd);
参数:
tid
init时返回的句柄(id号)
prd
prd值
返回值
0
1.8.28. gptimer_get_prd
获取prd寄存器的原始值。
原型:
u32 gptimer_get_prd(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
prd寄存器原始值
1.8.29. gptimer_tick2us
把tick 转换为时间,单位:us
原型:
u32 gptimer_tick2us(u32 tid, u32 tick);
参数:
tid
init时返回的句柄(id号)
tick
tick
返回值
时间 单位:us
1.8.30. gptimer_get_private_data
获取私有参数的指针。
原型:
void *gptimer_get_private_data(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
私有参数指针
1.8.31. gptimer_set_private_data
设置私有参数。
原型:
void gptimer_set_private_data(u32 tid, void *private_data);
参数:
tid
init时返回的句柄(id号)
private_data
私有参数指针
返回值
无
1.8.32. gptimer_measure_time_init
计时功能初始化
原型:
u32 gptimer_measure_time_init(const timer_dev timerx, u32 max_time_us);
参数:
timerx
选择一个timer 硬件模块
max_time_us
最大计时时间
返回值
tiemr句柄(id号)
1.8.33. gptimer_measure_time_start
计时功能启动
原型:
u32 gptimer_measure_time_start(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
0
1.8.34. gptimer_measure_time_end
计时功能停止
原型:
u32 gptimer_measure_time_end(u32 tid);
参数:
tid
init时返回的句柄(id号)
返回值
从计时开始到停止的时间,单位:us
1.8.35. gptimer_dump
打印timer 相关的所有寄存器
原型:
void gptimer_dump();
参数:
返回值
无
1.8.36. gptimer_demo, 可参考 gptimer_demo.c 文件
static void timer_callback_func_0(u32 tid, void *private_data)
{
putchar('t');
//可以翻转IO口测量时间
gpio_set_mode(PORTA, BIT(0), PORT_OUTPUT_HIGH);
gpio_set_mode(PORTA, BIT(0), PORT_OUTPUT_LOW);
}
static void timer_callback_func_1(u32 tid, void *private_data)
{
putchar('T');
//可以翻转IO口测量时间
gpio_set_mode(PORTA, BIT(1), PORT_OUTPUT_HIGH);
gpio_set_mode(PORTA, BIT(1), PORT_OUTPUT_LOW);
}
static void timer_callback_func_2(u32 tid, void *private_data)
{
gpio_set_mode(PORTA, BIT(2), PORT_OUTPUT_HIGH);
gpio_set_mode(PORTA, BIT(2), PORT_OUTPUT_LOW);
}
static void timer_demo()
{
printf("timer_demo()\n");
const struct gptimer_config timer_config = {
.timer.period_us = 1 * 1000 * 1000, //定时周期, 1000000us
.irq_cb = timer_callback_func_0, //设置中断回调函数
.irq_priority = 1, //中断优先级
.mode = GPTIMER_MODE_TIMER, //设置工作模式
.private_data = NULL,
};
u32 id = gptimer_init(TIMERx, &timer_config); //初始化timer配置,成功会返回分配的timer_id, 失败返回-1
printf("timer_demo id:%d\n", id);
gptimer_start(id); //启动timer
gptimer_set_timer_period(id, 500 * 1000); //设置定时周期为500ms
/* gptimer_set_timer_period(id, 250 * 1000); //设置定时周期为250ms */
u32 timer_us = gptimer_get_timer_period(id); //获取定时周期
printf("timer period_us = %dus\n", timer_us);
gptimer_set_irq_callback(id, timer_callback_func_1); //设置回调函数
}
static void pwm_demo()
{
printf("pwm_demo()\n");
const struct gptimer_config pwm_config = {
.pwm.freq = 1 * 1000 * 1000, //设置输出频率
/* .pwm.freq = 1 * 1000, //设置输出频率 */
.pwm.duty = 5000, //设置占空比为34.56%
.pwm.port = PORTA, //设置pwm输出IO_ PORTA_02
.pwm.pin = BIT(3), //设置pwm输出IO_PORTA_02
.mode = GPTIMER_MODE_PWM, //设置工作模式
};
u32 id = gptimer_init(TIMERx, &pwm_config);
printf("pwm_demo id:%d\n", id);
gpio_set_mode(PORTA, BIT(3), PORT_OUTPUT_LOW); //IO口设为输出
gptimer_start(id); //启动timer
}
static void capture_demo()
{
printf("capture_demo()\n");
const struct gptimer_config capture_config = {
.capture.filter = 1000, //设置滤波频率, 1000Hz
.capture.max_period = 0,//110000, //最大计时周期, 单位us, 默认给0
.capture.port = PORTA, //设置捕获口IO_PORTA_04
.capture.pin = BIT(5), //设置捕获口IO_PORTA_04
.irq_cb = timer_callback_func_2, //设置回调函数
.irq_priority = 1, //设置捕获中断优先级
.mode = GPTIMER_MODE_CAPTURE_EDGE_ANYEDGE, //设置工作模式
};
u32 id = gptimer_init(TIMERx, &capture_config);
printf("capture_demo id:%d\n", id);
gpio_set_mode(PORTA, BIT(5), PORT_INPUT_FLOATING); //IO口设为浮空输入
gptimer_start(id); //启动timer
gptimer_set_capture_filter(id, 100000); //设置滤波参数为10000Hz
gptimer_set_capture_count(id, 0); //设置cnt寄存器
u32 cnt = gptimer_get_capture_count(id);
printf("capture cnt = %d\n", cnt);
u32 us = gptimer_get_capture_cnt2us(id); //获取捕获时间间隔, 单位:us
printf("capture_us = %dus \n", us);
}
static void measure_demo()
{
printf("measure_demo()\n");
u32 id = gptimer_measure_time_init(TIMER2, 0);
u32 time_us;
while (1) {
gptimer_measure_time_start(id);
gpio_set_mode(PORTA, BIT(3), PORT_OUTPUT_HIGH);
udelay(10000); //需配合示波器或逻辑分析仪测量IO间隔时间
gpio_set_mode(PORTA, BIT(3), PORT_OUTPUT_LOW);
time_us = gptimer_measure_time_end(id);
printf("time_us = %d\n", time_us);
udelay(500 * 1000);
wdt_clear();
}
}