DA14585墨水屏学习
一、do_min_word
void do_min_work(void)
{timer_used_min = app_easy_timer(APP_PERIPHERAL_CTRL_TIMER_DELAY_MINUTES, do_min_work);current_unix_time += time_offset;time_offset = 60;// if (isconnected == 1)// {// GPIO_SetActive(GPIO_LED_PORT, GPIO_LED_PIN);// GPIO_SetInactive(GPIO_LED_PORT, GPIO_LED_G_PIN);// DEV_Delay_ms(5);// }arch_printf("current_unix_time:%d\n", current_unix_time);do_time_show();if (step == 0){// do_img_save();step = 1;display();}// time_refresh_count++;// if ((time_refresh_count >= Time_To_Refresh) && (g_tm.tm_min == 0 && g_tm.tm_hour == 0))// {// if (step == 0)// {// // do_img_save();// step = 1;// display();// }// }// GPIO_SetActive(GPIO_LED_PORT, GPIO_LED_G_PIN);// GPIO_SetInactive(GPIO_LED_PORT, GPIO_LED_PIN);
}
这段代码是一个定时器回调函数,用于每分钟执行一次系统时间更新和显示刷新操作。以下是对代码的详细解释:
void do_min_work(void)
{// 1. 重新设置定时器,确保每分钟执行一次timer_used_min = app_easy_timer(APP_PERIPHERAL_CTRL_TIMER_DELAY_MINUTES, do_min_work);// 2. 时间更新逻辑current_unix_time += time_offset; // 累加当前时间(秒)time_offset = 60; // 重置偏移量为60秒(1分钟)// 3. 调试输出当前时间arch_printf("current_unix_time:%d\n", current_unix_time);// 4. 显示时间do_time_show();// 5. 状态机控制(仅在step=0时执行一次)if (step == 0){step = 1; // 切换状态display(); // 更新显示内容}
}
其中:APP_PERIPHERAL_CTRL_TIMER_DELAY_MINUTES是一个宏,其定义如下 :
#define APP_PERIPHERAL_CTRL_TIMER_DELAY_MINUTES 6000,这时是否少了一个0,不得而知。
代码关键点解释
-
定时器机制:
- 通过
app_easy_timer
函数设置一个每分钟触发的定时器 - 每次回调执行时会重新设置定时器,形成循环调用
APP_PERIPHERAL_CTRL_TIMER_DELAY_MINUTES
应定义为 60000ms(1 分钟)
- 通过
-
时间维护:
current_unix_time
存储当前的 Unix 时间戳(秒)time_offset
初始为 60,每次累加后重置,确保每分钟递增 60 秒- 这种设计允许系统在无法获取 RTC 时通过软件维护时间
-
显示控制:
do_time_show()
:更新时间显示display()
:刷新整个显示内容- 使用
step
变量实现状态机控制,确保某些操作只执行一次
-
注释代码分析:
- 被注释的 LED 控制代码表明系统可能通过 LED 指示连接状态
do_img_save()
可能用于保存屏幕截图或图像数据- 时间刷新条件检查(午夜 0 点)被注释,可能用于每日特定操作
二、app_easy_timer
函数
timer_hnd app_easy_timer(const uint32_t delay, timer_callback fn)
{// Sanity checksASSERT_ERROR(delay > 0); // Delay should not be zeroASSERT_ERROR(delay <= KE_TIMER_DELAY_MAX); // Delay should not be more than maximum allowedtimer_hnd timer_id = set_callback(fn);if (timer_id == EASY_TIMER_INVALID_TIMER){return EASY_TIMER_INVALID_TIMER; //No timers available}// Create timercreate_timer(timer_id, delay);return timer_id;
}
其中timer_hnd定义如下 :typedef uint8_t timer_hnd;
app_easy_timer 函数用于创建一个定时器,在指定的延时后执行回调函数。它提供了参数检查、资源分配和定时器初始化的功能。
timer_hnd app_easy_timer(const uint32_t delay, timer_callback fn)
{// 1. 参数有效性检查ASSERT_ERROR(delay > 0); // 延时必须大于0ASSERT_ERROR(delay <= KE_TIMER_DELAY_MAX); // 延时不能超过系统最大限制// 2. 分配定时器资源并注册回调函数timer_hnd timer_id = set_callback(fn);if (timer_id == EASY_TIMER_INVALID_TIMER){return EASY_TIMER_INVALID_TIMER; // 没有可用的定时器资源}// 3. 创建并启动定时器create_timer(timer_id, delay);// 4. 返回定时器句柄供后续操作使用return timer_id;
}
核心功能分析 1. 参数检查: ◦ delay > 0:确保延时时间有效 ◦ delay <= KE_TIMER_DELAY_MAX:防止过大的延时值导致系统异常 ◦ ASSERT_ERROR 通常是断言宏,参数不合法时会触发错误处理 2. 资源分配: ◦ set_callback(fn) 函数: ◦ 分配一个定时器 ID ◦ 将传入的回调函数 fn 与该 ID 关联 ◦ 返回 EASY_TIMER_INVALID_TIMER 表示资源不足 3. 定时器初始化: ◦ create_timer(timer_id, delay) 函数: ◦ 使用分配的 ID 配置硬件 / 软件定时器 ◦ 设置延时值 delay(单位通常为毫秒) ◦ 启动定时器开始倒计时 4. 错误处理: ◦ 当无可用定时器资源时,函数会立即返回错误码 ◦ 上层应用需要检查返回值以处理错误情况