目录
杰理的定时器有硬件定时器和软件定时器
软件定时器是基于systime线程提供的时基,可以参考下面这位博主的文章:
今天主要说的是硬件定时器的配置。
杰理定时器demo:
timer模式demo
//定时器
void timer_callback_func(int tid)
{
}
const struct gptimer_config timer_config = {
.resolution_us = 10*1000, //定时10ms
.irq_cb = timer_callback_func, //回调函数
.tid = -1, //填-1,内部自动分配timer
.irq_priority = 1; //中断优先级,默认给1
};
int timer_tid = gptimer_init(&timer_config);
gptimer_start(timer_tid);
pwm模式demo
const struct gptimer_pwm_config pwm_config = {
.port = PORTA, //指定输出IO,PA组
.pin = 0, //指定输出IO,BIT(0)脚 输出口PA0
.freq = 1000,//输出频率1Khz
.pwm_duty_X10000 = 5123, //占空比51.23%
.tid = -1, //填-1,内部自动分配timer
};
int pwm_tid = gptimer_pwm_init(&pwm_config);
gptimer_start(pwm_tid);
capture模式demo
void capture_callback_func(int tid)
{
enum gptimer_type mode = gptimer_get_work_mode(tid);
if (mode == GPTIMER_CAPTRUE){
u32 prd = gptimer_get_capture_count(tid); //单位是us
if (prd > 10000){
gptimer_pause(tid);
gptimer_set_resolution(tid,1000); // 设置定时时间1ms
gptimer_set_work_mode(tid, GPTIMER_Timer); // 切换为定时模式
gptimer_resume(tid);
}
}else if(mode == GPTIMER_Timer){
gptimer_pause(tid);
gptimer_set_edge_type(tid, GPTIMER_EDGE_RISE);
gptimer_set_work_mode(tid, GPTIMER_CAPTRUE); // 切换为上升沿捕获模式
gptimer_resume(tid);
}
}
const struct gptimer_capture_config capture_config = {
.port = PORTA, //指定输出IO,PA组
.pin = 0, //指定输出IO,BIT(0)脚 输出口PA0
.edge_type = GPTIMER_EDGE_RISE, //上升沿捕获
.filter = 1000, //需要滤掉的频率,大于该频率的波形被过滤;写0则关闭滤波功能
.irq_cb = capture_callback_func, //回调函数
.tid = -1, //填-1,内部自动分配timer
.irq_priority = 1; //中断优先级,默认给1
};
int capture_tid = gptimer_capture_init(&capture_config);
gptimer_start(capture_tid);
个人测试验证:
gptimer.c有预留接口,也有函数gptimer_test_demo();可以参考和调用
为了不影响其他定时器的正常工作,建议id参数设为-1,这样系统会自动分配空闲的定时器,如果创建失败会返回错误数。
标签:capture,定时器,gptimer,timer,杰理,tid,config From: https://blog.csdn.net/m0_67447112/article/details/143975572