APP DUAL_TIM驱动
结构体
app_dual_tim_params_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_dual_tim_id_t id |
使用的Dual Timer模块ID |
该参数的取值可以是下列值中的任意一个:
|
| dual_timer_init_t init |
Dual Timer的初始化配置 |
参考dual_timer_init_t结构体 |
| dual_tim_env_t dual_tim_env |
仅用于记录初始化设备的句柄、相关参数和信号量等,不需要配置 |
- GR551x/GR5526/GR5x25:SDK_Folder\drivers\inc\hal\gr55xx_hal_dual_tim.h
- GR533x:SDK_Folder\drivers\inc\hal\gr533x_hal_dual_tim.h
- GR5405:SDK_Folder\hal_drv\include\hal_dual_tim.h
dual_timer_init_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_t prescaler |
预分频系数 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t counter_mode |
计数模式 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t auto_reload |
自动装载值 |
自动装载值仅表示定时器的倒计时数。如果要配置特定的持续时间(例如,µs、ms或s),则需要使用以下公式:
其中PRE代表预分频系数,SystemCoreClock为系统时钟频率,RELOAD指自动装载值,Expect_time代表换算的时间,单位:s,取值范围:0 ~ 0xFFFFFFFF。 当自动装载值配置为0时,不会产生计数完成事件中断。 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_dual_tim.h。
枚举
app_dual_tim_id_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_DUAL_TIM_ID_0 = 0 |
DUAL TIMER模块0 |
| APP_DUAL_TIM_ID_1 = 1 |
DUAL TIMER模块1 |
| APP_DUAL_TIM_ID_MAX = 2 |
DUAL TIMER模块总数,用作参数检测 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_dual_tim.h。
app_dual_tim_evt_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_DUAL_TIM_EVT_ERROR = 0 |
DUAL TIMER错误事件 |
| APP_DUAL_TIM_EVT_DONE = 1 |
DUAL TIMER计数完成事件 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_dual_tim.h。
app_dual_tim_state_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_DUAL_TIM_INVALID = 0 |
DUAL TIMER不可用 |
| APP_DUAL_TIM_ACTIVITY |
DUAL TIMER激活 |
| APP_DUAL_TIM_SLEEP |
DUAL TIMER睡眠 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_dual_tim.h。
接口函数
| API | 芯片 | ||||
|---|---|---|---|---|---|
| GR551x | GR5526 | GR5x25 | GR533x | GR5405 | |
| app_dual_tim_init |
Y |
Y |
Y | Y | Y |
| app_dual_tim_deinit |
Y |
Y |
Y | Y | Y |
| app_dual_tim_start |
Y |
Y |
Y | Y | Y |
| app_dual_tim_stop |
Y |
Y |
Y | Y | Y |
| app_dual_tim_set_params |
Y |
Y |
Y | Y | Y |
| app_dual_tim_set_background_reload |
Y |
Y |
Y | Y | Y |
| app_dual_tim_get_handle |
Y |
Y |
Y | Y | Y |
| app_dual_tim_set_onetime_reload | N | N | N | Y | Y |
| app_dual_tim_io_crtl_config | N | N | N | Y | Y |
| app_dual_tim_set_period_count | N | N | N | Y | Y |
app_dual_tim_init
| 函数原型 | uint16_t app_dual_tim_init(app_dual_tim_params_t *p_params, app_dual_tim_evt_handler_t evt_handler) |
|---|---|
| 功能说明 | 初始化DUAL TIMER |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 回调函数形式参照typedef void (*app_dual_tim_evt_handler_t)(app_dual_tim_evt_t *p_evt); HAL层已经实现中断标志位的清理,用户不用关心中断标志的清理,回调函数根据返回事件类型进行相应的处理即可。 |
app_dual_tim_deinit
| 函数原型 | uint16_t app_dual_tim_deinit(app_dual_tim_id_t id) |
|---|---|
| 功能说明 | 反初始化DUAL TIMER |
| 输入参数 | id:DUAL TIMER模块ID |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_dual_tim_start
| 函数原型 | uint16_t app_dual_tim_start(app_dual_tim_id_t id) |
|---|---|
| 功能说明 | 开启DUAL TIMER,使能中断并开始向下计数 |
| 输入参数 | id:DUAL TIMER模块ID |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_dual_tim_stop
| 函数原型 | uint16_t app_dual_tim_stop(app_dual_tim_id_t id) |
|---|---|
| 功能说明 | 关闭DUAL TIMER,停止计数 |
| 输入参数 | id:DUAL TIMER模块ID |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_dual_tim_set_params
| 函数原型 | uint16_t app_dual_tim_set_params(app_dual_tim_params_t *p_params, app_dual_tim_id_t id) |
|---|---|
| 功能说明 | 运行过程中修改DUAL TIMER参数 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_dual_tim_set_background_reload
| 函数原型 | uint16_t app_dual_tim_set_background_reload(app_dual_tim_id_t id, uint32_t reload_value) |
|---|---|
| 功能说明 | 设置自动装载值(下一周期生效) |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_dual_tim_get_handle
| 函数原型 | dual_timer_handle_t *app_dual_tim_get_handle(app_dual_tim_id_t id) |
|---|---|
| 功能说明 | 获取DUAL TIMER句柄 |
| 输入参数 | id:DUAL TIMER模块ID |
| 返回值 |
Timer句柄,详见:
|
| 备注 |
app_dual_tim_set_onetime_reload
| 函数原型 | uint16_t app_dual_tim_set_onetime_reload(app_dual_tim_id_t id, uint32_t reload_value) |
|---|---|
| 功能说明 | 设置一次性装载值 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
|
app_dual_tim_io_crtl_config
| 函数原型 | uint16_t app_dual_tim_io_crtl_config(app_dual_tim_params_t *p_params, app_dual_tim_id_t id, app_dual_tim_io_crtl_params_t *io_crtl_params) |
|---|---|
| 功能说明 | 配置Dual Timer I/O控制功能 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
|
app_dual_tim_set_period_count
| 函数原型 | uint16_t app_dual_tim_set_period_count(app_dual_tim_id_t id, uint32_t count_value) |
|---|---|
| 功能说明 | 设置周期数功能 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
|
示例工程
Dual Timer
示例工程运用Dual Timer以中断方式实现定时打印程序中相关信息。Dual Timer0处于循环模式,第一个周期为1s,随后每5s产生一次中断,串口打印每次中断;Dual Timer1处于一次性模式,中断周期每次延长1s,中断程序将在15s停止,Dual Timer0和Dual Timer1停止计时。工程目录:SDK_Folder\projects\peripheral\dual_tim\app_dual_tim。
流程图
初始化参数
以Dual Timer0为例,Dual Timer1类似。
#define DEFAULT_AUTO_RELOAD 63999999
#define TIMER_MS(X) (SystemCoreClock / 1000 *(X) - 1)
app_dual_tim_params_t p_params_tim0 = {
.id = APP_DUAL_TIM_ID_0,
.init = {
.prescaler = DUAL_TIMER_PRESCALER_DIV0,
.counter_mode = DUAL_TIMER_COUNTERMODE_LOOP,
.auto_reload = DEFAULT_AUTO_RELOAD,
},
};
- id:Dual Timer0模块ID选择APP_DUAL_TIM_ID_0
- init.prescaler:预分频系数DUAL_TIMER_PRESCALER_DIV0,时钟除以1
- init.counter_mode:采用循环模式DUAL_TIMER_COUNTERMODE_LOOP
- init.auto_reload:自动装载值DEFAULT_AUTO_RELOAD,默认63999999
重要函数
-
初始化Dual Timer函数
app_dual_tim_init(&p_params_tim0, app_dual_tim0_event_handler) -
开启计数
app_dual_tim_start(APP_DUAL_TIM_ID_0) -
设置自动装载值
app_dual_tim_set_background_reload(APP_DUAL_TIM_ID_0, TIMER_MS(5000)) -
重新设置计数参数
app_dual_tim_set_params(&p_params_tim1, APP_DUAL_TIM_ID_1) -
停止计数
app_dual_tim_stop(APP_DUAL_TIM_ID_0)
测试验证
连接开发板到PC端,打开串口助手,连接串口,查看串口日志。DUAL TIMER0 在1s时打印日志,然后每5s打印一次日志,DUAL TIMER1 在1s、3s、6s、10s和15s时打印日志,DUAL TIMER0 和DUAL TIMER1在15s停止计数。
DUAL TIMER0 and DUAL TIMER1 start
This is 0th call DUAL TIMER0.
This is 0th call DUAL TIMER1.
This is 1th call DUAL TIMER1.
This is 1th call DUAL TIMER0.
This is 2th call DUAL TIMER1.
This is 3th call DUAL TIMER1.
This is 2th call DUAL TIMER0.
This is 4th call DUAL TIMER1.
This example demo end.