GPTIMER ####################### gptimer支持计数、延时、定时、PWM、捕获。捕获模式支持滤波,双边沿触发 gptimer_init ------------------------------ timer模块初始化。 原型: .. code-block:: c u32 gptimer_init(const timer_dev timerx, const struct gptimer_config *gt_cfg); 参数: ========== ==================== gptimer timer配置 返回值 tiemr句柄(id号) ========== ==================== gptimer_deinit ------------------------------ timer模块释放。 原型: .. code-block:: c u32 gptimer_deinit(u32 tid); 参数: ========== ========================== tid init时返回的句柄(id号) 返回值 0 ========== ========================== gptimer_start ------------------------------ timer/pwm/capture功能启动。 原型: .. code-block:: c u32 gptimer_start(u32 tid); 参数: ========== ========================== tid init时返回的句柄(id号) 返回值 0 ========== ========================== gptimer_pause ------------------------------ timer/pwm/capture功能暂停。 原型: .. code-block:: c u32 gptimer_pause(u32 tid); 参数: ========== ========================== tid init时返回的句柄(id号) 返回值 0 ========== ========================== gptimer_resume ------------------------------ timer/pwm/capture功能恢复。 原型: .. code-block:: c u32 gptimer_resume(u32 tid); 参数: ========== ========================== tid init时返回的句柄(id号) 返回值 保留 ========== ========================== gptimer_set_timer_period ------------------------------ 设置timer功能定时时间,单位us。 原型: .. code-block:: c u32 gptimer_set_timer_period(u32 tid, u32 period_us); 参数: ========== ========================== tid init时返回的句柄(id号) us 定时时间,单位:us 返回值 0 ========== ========================== gptimer_get_timer_period ------------------------------ 获取timer功能定时时间,单位us。 原型: .. code-block:: c u32 gptimer_get_timer_period(u32 tid); 参数: ========== ========================== tid init时返回的句柄(id号) 返回值 定时时间,单位:us ========== ========================== gptimer_set_pwm_freq ------------------------------ 设置pwm功能输出频率,单位Hz。 原型: .. code-block:: c u32 gptimer_set_pwm_freq(u32 tid, u32 freq); 参数: ========== ========================== tid init时返回的句柄(id号) freq 输出频率,单位:Hz 返回值 0 ========== ========================== gptimer_get_pwm_freq ------------------------------ 获取pwm功能输出频率,单位Hz。 原型: .. code-block:: c u32 gptimer_get_pwm_freq(u32 tid); 参数: ========== ========================== tid init时返回的句柄(id号) 返回值 输出频率,单位:Hz ========== ========================== gptimer_set_pwm_duty ------------------------------ 设置pwm功能输出占空比。 原型: .. code-block:: c u32 gptimer_set_pwm_duty(u32 tid, u32 duty); 参数: ========== ================================= tid init时返回的句柄(id号) duty 占空比,例:5123,占空比51.23% 返回值 0 ========== ================================= gptimer_get_pwm_duty ------------------------------ 获取pwm功能输出占空比。 原型: .. code-block:: c u32 gptimer_get_pwm_duty(u32 tid); 参数: ========== ================================= tid init时返回的句柄(id号) duty 占空比,例:5123,占空比51.23% ========== ================================= gptimer_pwm_flip ------------------------------ 翻转pwm输出。 原型: .. code-block:: c u32 gptimer_pwm_flip(u32 tid); 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 0 ========== =================================== gptimer_pwm_enable ------------------------------ pwm输出使能。 原型: .. code-block:: c u32 gptimer_pwm_enable(u32 tid); 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 0 ========== =================================== gptimer_pwm_disable ------------------------------ pwm输出关闭。 原型: .. code-block:: c u32 gptimer_pwm_disable(u32 tid); 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 0 ========== =================================== gptimer_set_capture_edge_type ------------------------------ 设置capture功能捕获边沿,边沿类型:上升沿、下降沿、双边沿。 原型: .. code-block:: c u32 gptimer_set_capture_edge_type(u32 tid, enum gptimer_mode edge_type); 参数: ========== =================================== tid init时返回的句柄(id号) edge_type 边沿类型 返回值 0 ========== =================================== gptimer_get_capture_edge_type ------------------------------ 获取capture功能捕获边沿。 原型: .. code-block:: c enum gptimer_mode gptimer_get_capture_edge_type(u32 tid); 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 边沿类型:上升沿、下降沿、双边沿 ========== =================================== gptimer_set_irq_callback ------------------------------ 设置回调函数。 原型: .. code-block:: c u32 gptimer_set_irq_callback(u32 tid, void (*irq_cb)(u32 tid, void *private_data)); 参数: ========== =================================== tid init时返回的句柄(id号) irq_cb 回调函数 返回值 0 ========== =================================== gptimer_get_work_mode ------------------------------ 获取当前工作模式。 原型: .. code-block:: c enum gptimer_mode gptimer_get_work_mode(u32 tid); 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 工作模式 ========== =================================== gptimer_set_work_mode ------------------------------ 设置工作模式。 原型: .. code-block:: c u32 gptimer_set_work_mode(u32 tid, enum gptimer_mode type); 参数: ========== =================================== tid init时返回的句柄(id号) type 工作模式 返回值 0 ========== =================================== gptimer_set_capture_filter ------------------------------ 设置capture功能滤波参数。小于滤波参数的波被过滤。 原型: .. code-block:: c u32 gptimer_set_capture_filter(u32 tid, u32 filter); 参数: ========== =================================== tid init时返回的句柄(id号) filter_us 滤波参数,单位:us。 ========== =================================== gptimer_get_capture_filter ------------------------------ 获取capture功能滤波时间。 原型: .. code-block:: c u32 gptimer_get_capture_filter(u32 tid); 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 滤波参数,单位:us。 ========== =================================== gptimer_set_capture_count ------------------------------ 设置capture功能count计数器的原始值。 原型: .. code-block:: c u32 gptimer_set_capture_count(u32 tid, u32 cnt); 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 0 ========== =================================== gptimer_get_capture_count ------------------------------ 获取capture功能count计数器的原始值。 原型: .. code-block:: c u32 gptimer_get_capture_count(u32 tid); 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 count计数器原始值 ========== =================================== gptimer_get_capture_cnt2us ------------------------------ 获取capture功能count计数器值,并转换为时间 us。 原型: .. code-block:: c u32 gptimer_get_capture_cnt2us(u32 tid); //捕获发生时调用有效 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 时间 单位:us ========== =================================== gptimer_set_count ------------------------------ 设置count计数器的值。 原型: .. code-block:: c u32 gptimer_set_count(u32 tid, u32 cnt); 参数: ========== =================================== tid init时返回的句柄(id号) cnt conut值 返回值 0 ========== =================================== gptimer_get_count ------------------------------ 获取count计数器的原始值。 原型: .. code-block:: c u32 gptimer_get_count(u32 tid); 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 count计数器原始值 ========== =================================== gptimer_set_prd ------------------------------ 设置prd寄存器的值。 原型: .. code-block:: c u32 gptimer_set_prd(u32 tid, u32 prd); 参数: ========== =================================== tid init时返回的句柄(id号) prd prd值 返回值 0 ========== =================================== gptimer_get_prd ------------------------------ 获取prd寄存器的原始值。 原型: .. code-block:: c u32 gptimer_get_prd(u32 tid); 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 prd寄存器原始值 ========== =================================== gptimer_tick2us ------------------------------ 把tick 转换为时间,单位:us 原型: .. code-block:: c u32 gptimer_tick2us(u32 tid, u32 tick); 参数: ========== =================================== tid init时返回的句柄(id号) tick tick 返回值 时间 单位:us ========== =================================== gptimer_get_private_data ------------------------------ 获取私有参数的指针。 原型: .. code-block:: c void *gptimer_get_private_data(u32 tid); 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 私有参数指针 ========== =================================== gptimer_set_private_data ------------------------------ 设置私有参数。 原型: .. code-block:: c void gptimer_set_private_data(u32 tid, void *private_data); 参数: ============ =================================== tid init时返回的句柄(id号) private_data 私有参数指针 返回值 无 ============ =================================== gptimer_measure_time_init ------------------------------ 计时功能初始化 原型: .. code-block:: c u32 gptimer_measure_time_init(const timer_dev timerx, u32 max_time_us); 参数: =========== =================================== timerx 选择一个timer 硬件模块 max_time_us 最大计时时间 返回值 tiemr句柄(id号) =========== =================================== gptimer_measure_time_start ------------------------------ 计时功能启动 原型: .. code-block:: c u32 gptimer_measure_time_start(u32 tid); 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 0 ========== =================================== gptimer_measure_time_end ------------------------------ 计时功能停止 原型: .. code-block:: c u32 gptimer_measure_time_end(u32 tid); 参数: ========== =================================== tid init时返回的句柄(id号) 返回值 从计时开始到停止的时间,单位:us ========== =================================== gptimer_dump ------------------------------ 打印timer 相关的所有寄存器 原型: .. code-block:: c void gptimer_dump(); 参数: ========== ==================== 返回值 无 ========== ==================== gptimer_demo, 可参考 gptimer_demo.c 文件 ---------------------------------------- .. code-block:: 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(); } }