概述
OV-Watch 是一款功能齐全、节能的智能手表,具有丰富的功能。该项目为具有广泛功能的可穿戴设备提供完整的固件和硬件设计。
主要功能包括:
- 环境监测(温度、湿度、海拔高度)
- 健康跟踪(心率、步数)
- 导航工具(指南针)
- 实用应用程序(计算器、秒表、日历)
- 娱乐(2048 和 Memory Game 等游戏)
- 用于无线固件更新的蓝牙连接
- 具有多种电源模式的节能运行
系统架构
OV-Watch 遵循分层架构模式,可分离关注点并提高可维护性。
| 特征 | 描述 |
|---|---|
| 显示 | 1.69 英寸触控屏幕 |
| 单 片 机 | STM32F411CEU6 微控制器 |
| 运行状况监控 | 心率、计步 |
| 环境传感器 | 温度、湿度、海拔 |
| 连接 | 通过 KT6368A 模块进行蓝牙 |
| 电源管理 | 三种电源模式(运行、睡眠、关机) |
| 充电 | 磁性充电连接器 |
| 存储 | 用于设置和数据的外部 EEPROM |
| 用户界面 | 基于 LVGL v8.2 的图形系统 |
| 操作系统 | 用于任务管理的 FreeRTOS |
系统架构概述

硬件层
硬件层包括:
- STM32F411CEU6 微控制器:中央处理器
- 显示器和触摸屏:用户界面组件
- 传感器:
- MPU6050:运动跟踪和计步
- EM7028:心率监测
- AHT21:温度和湿度传感
- 气压计:海拔测量
- 电子罗盘
- KT6368A 蓝牙模块:无线连接
- 电源管理电路:电池和电源控制
- 外部 EEPROM:持久数据存储
固件层
固件层包括:
- Bootloader:处理系统初始化和固件更新
- 应用程序固件:包含主要的 watch 功能
- 硬件抽象层 (HAL):提供硬件独立性
系统层
系统层提供作环境:
- FreeRTOS:用于任务调度的实时作系统
- LVGL:用于 UI 渲染的图形库(版本 8.2)
应用层
应用层实现面向用户的功能:
- FreeRTOS 任务:用于特定作的单独任务
- UI 屏幕:用户界面组件和屏幕
- 实用工具函数:整个应用程序中使用的常见作
启动过程和固件更新
OV-Watch 实现了一个引导加载程序系统,该系统支持通过蓝牙进行无线 (OTA) 更新。
引导流程
启动过程包括:
- 检查复位期间是否按下 KEY1 进入 bootloader 模式
- 在 bootloader 模式下,启用 Bluetooth 以接收固件
- 验证和刷写新固件
- 跳转到应用程序代码(如果有效)
- 初始化 HAL、FreeRTOS 和应用程序任务
从 2.4.0 版本开始,固件已拆分为单独的 Bootloader 和 Application 组件,以支持 OTA 更新。
硬件抽象层
硬件抽象层 (HAL) 为硬件组件提供一致的接口,从而简化测试和可移植性。
HAL 结构

HAL 使用接口类型来抽象化硬件访问:
HW_InterfaceTypeDef:包含所有硬件接口的主接口结构- 每个组件的硬件特定接口(RTC、IMU、AHT21 等)
HWDataAccess.c基于条件编译实现这些接口
条件编译标志允许相同的代码在硬件和模拟环境中运行。HW_USE_HARDWARE
FreeRTOS 任务结构
OV-Watch 使用 FreeRTOS 进行任务管理和调度,多个任务处理系统功能的不同方面。
任务组织

主要任务包括:
HardwareInitTask:初始化硬件组件KeyTask:处理按键/按钮输入ScrRenewTask:根据输入和传感器数据更新 UISensUpdateTask:读取和处理传感器数据RunModeTasks:处理特定的作模式DataSaveTask:管理到 EEPROM 的数据持久性ChargCheckTask:监控电池和充电状态MessageSendTask:处理消息发送作
电源管理系统
OV-Watch 实现了一个复杂的电源管理系统,具有三种主要状态,以最大限度地延长电池寿命。
电源管理状态

电源管理系统包括:
-
运行模式:
- 所有组件均处于活动状态的正常作
- 电流消耗:70-80mA
-
睡眠模式:
- MCU 处于 STOP 模式
- MPU6050 保持活动状态以进行步数计数
- 显示器已关闭
- 消耗电流:约 800μA
- 在 RTC 中断或检测到手腕抬起时转换为 Running 模式
-
关机模式:
- TPS63020 已禁用电源调节器
- 3.3V 电源已关闭
- 只有 RTC 仍由电池供电
- 最小电流消耗
- 长按 KEY1 激活,通过电源键退出
从 2.4.1 版本开始,睡眠模式通过取消初始化 UART I/O 端口来降低功耗。
UI 导航系统
OV-Watch 使用基于堆栈的方法进行 UI 导航和屏幕管理,从而实现直观的用户交互。
UI 导航流程
UI 导航系统使用堆栈数据结构来跟踪导航历史记录:
- 进入新屏幕时,其指针使用
user_Stack_Push() - 返回按钮可弹出堆栈并返回到上一个屏幕
user_Stack_Pop() - 这可以通过适当的后退按钮功能实现直观的导航
README.md 中的导航代码片段示例:
//key1 pressed
if(keystr == 1)
{
user_Stack_Pop(&ScrRenewStack);
if(user_Stack_isEmpty(&ScrRenewStack))
{
ui_MenuPage_screen_init();
lv_scr_load_anim(ui_MenuPage,LV_SCR_LOAD_ANIM_MOVE_RIGHT,0,0,true);
user_Stack_Push(&ScrRenewStack,(long long int)&ui_HomePage);
user_Stack_Push(&ScrRenewStack,(long long int)&ui_MenuPage);
}
else if(ScrRenewStack.Data[ScrRenewStack.Top_Point-1] == (long long int)&ui_HomePage)
{
ui_HomePage_screen_init();
lv_scr_load_anim(ui_HomePage,LV_SCR_LOAD_ANIM_MOVE_RIGHT,0,0,true);
}
}
开发环境
OV-Watch 代码库支持在 Keil MDK 中开发实际固件,并支持在 Windows 上开发基于 VSCode 的 LVGL 模拟器进行 UI 开发。
LVGL 模拟器
LVGL 模拟器允许在没有物理硬件的情况下进行 UI 开发和测试。它在文件夹中进行配置,可以更快地进行 UI 原型设计和测试。lv_sim_vscode_win
对于 UI 应用程序开发和迁移:
- 在 LVGL 模拟器中开发和测试 UI 组件
- 将 and 文件夹复制到 Keil 工程的文件夹中
FuncGUI_AppUser - 设置标志以控制是使用实际硬件还是模拟接口
HW_USE_HARDWARE
数据存储
OV-Watch 使用外部 EEPROM 进行持久数据存储。该文件管理对设置和配置参数的此存储的读取和写入数据。Datasave.c
存储系统用于:
- 用户设置和首选项
- 校准数据
- 配置参数
- 史料
系统架构
系统架构
相关源文件目的和范围
本文档介绍了 OV-Watch 的整体系统架构,OV-Watch 是一个基于 STM32F411CEU6 微控制器的智能手表项目。它提供了硬件和软件组件及其交互的高级概述。有关特定组件的详细信息,请参阅 硬件组件 和 软件架构 页面。
架构概述
OV-Watch 采用分层架构,将硬件、系统软件和应用程序组件之间的关注点分开。这促进了整个系统的模块化、可维护性和代码可重用性。
代码组织
代码库遵循反映系统架构的结构化组织:
| 目录 | 描述 |
|---|---|
Core/ |
STM32CubeMX 生成的核心系统文件 |
BSP/ |
用于硬件组件的板级支持包 |
Middlewares/ |
第三方库,包括 FreeRTOS 和 LVGL |
User/ |
特定于应用程序的代码 |
User/Tasks/ |
FreeRTOS 任务实现 |
User/Func/ |
实用程序和帮助程序函数 |
User/GUI_App/ |
基于 LVGL 的 UI 组件和资源 |
lv_sim_vscode_win/ |
用于在 PC 上进行 UI 开发的 LVGL 模拟器 |
内存映射
STM32F411CEU6 具有 OV-Watch 固件的特定内存布局,引导加载程序和应用程序代码有单独的部分:
应用程序的 vector table 是 offset 以匹配此内存组织:
SCB->VTOR = 0x0000C000U; // Set in main.c
FreeRTOS 任务结构
该应用程序围绕多任务架构构建,使用 FreeRTOS 来管理不同的功能:

任务描述:
| 任务 | 文件 | 目的 |
|---|---|---|
| HardwareInitTask | user_HardwareInitTask.c | 初始化硬件组件 |
| KeyTask | user_KeyTask.c | 处理按键/按钮输入 |
| ScrRenewTask | user_ScrRenewTask.c | 更新屏幕显示 |
| SensUpdate任务 | user_SensUpdateTask.c | 收集和处理传感器数据 |
| RunModeTasks | user_RunModeTasks.c | 管理作模式 |
| DataSaveTask (数据保存任务) | user_DataSaveTask.c | 处理对 EEPROM 的数据持久性 |
| ChargCheckTask | user_ChargCheckTask.c | 监控充电和电池状态 |
| MessageSendTask | user_MessageSendTask.c | 管理消息通信 |
硬件抽象层
硬件抽象层 (HAL) 提供了一个统一的接口来访问硬件组件,从而实现了代码可移植性和更简单的测试:

HAL 在 HAL 中实现并包含条件编译,以支持硬件和模拟环境:HWDataAccess.c
#if HW_USE_HARDWARE
// Hardware implementation
#else
// Simulation implementation
#endif
此设计允许在实际设备和 LVGL 仿真器上运行相同的应用程序代码。
启动过程和固件更新
引导过程从检查特定条件开始,以确定是进入引导加载程序模式还是跳转到应用程序:

引导加载程序系统通过蓝牙启用无线 (OTA) 固件更新,无需物理连接即可更新手表。
电源管理系统
OV-Watch 实施三种电源模式以优化电池寿命:
主要电源管理功能:
- 运行模式:全系统运行,消耗 70-80mA
- 休眠模式:MCU 处于 STOP 模式,MPU6050活动以进行步数计数,消耗 ~800μA
- 关机模式:禁用TPS63020电源调节器,仅 RTC 由电池供电
MPU6050 实现需要自定义修改以降低 sleep 模式下的功耗。
UI 导航系统
用户界面使用基于堆栈的导航方法来管理屏幕转换:

导航系统在 堆栈中实现并使用堆栈来跟踪导航历史记录。导航逻辑的一个关键示例:PageManager.c
if(keystr == 1) { user_Stack_Pop(&ScrRenewStack); if(user_Stack_isEmpty(&ScrRenewStack)) { ui_MenuPage_screen_init(); lv_scr_load_anim(ui_MenuPage,LV_SCR_LOAD_ANIM_MOVE_RIGHT,0,0,true); user_Stack_Push(&ScrRenewStack,(long long int)&ui_HomePage); user_Stack_Push(&ScrRenewStack,(long long int)&ui_MenuPage); } else if(ScrRenewStack.Data[ScrRenewStack.Top_Point-1] == (long long int)&ui_HomePage) { ui_HomePage_screen_init(); lv_scr_load_anim(ui_HomePage,LV_SCR_LOAD_ANIM_MOVE_RIGHT,0,0,true); } }
UI 组件在 中找到的文件中实现,例如 、 等。User/GUI_App/Screens/Src/ui_HomePage.cui_MenuPage.c
用于开发的 LVGL 仿真器
OV-Watch 包括一个 LVGL 模拟器,用于在 PC 上进行 UI 开发:

UI 开发工作流程的关键方面:
- 在 LVGL 模拟器 ( 目录) 中开发和测试 UI 更改
lv_sim_vscode_win - 将修改后的文件从 和 文件夹复制到 Keil 项目
FuncGUI_App - 为目标环境设置适当的值
HW_USE_HARDWARE
这种方法允许快速 UI 开发,而无需为每次更改部署到硬件。
数据存储
OV-Watch 使用外部 EEPROM 进行持久数据存储:
实现细节可以在该文件中找到,该文件提供了向 EEPROM 读取和写入数据的功能。Datasave.c
结论
OV-Watch 系统架构采用结构良好的模块化设计,在硬件、系统软件和应用程序层之间明确分离了关注点。关键架构元素包括:
- 将硬件、系统软件和应用程序问题分开的分层方法
- 用于任务管理和调度的 FreeRTOS
- 用于 UI 开发的 LVGL
- 用于代码可移植性的硬件抽象层
- 基于堆栈的 UI 导航
- 用于电池优化的三级电源管理系统
- OTA 固件更新功能
- 用于 UI 开发的模拟环境
此设计增强了可维护性,实现了功能可扩展性,并通过高效的电源管理优化了电池寿命。
硬件组件
概述
OV-Watch 围绕 STM32F411CEU6 微控制器构建,具有多个传感器,用于环境数据收集、健康监测和运动跟踪。该硬件专为低功耗而设计,具有不同的作模式,以最大限度地延长电池寿命。硬件抽象层为应用程序提供了与物理组件交互的标准接口。

核心硬件
STM32F411CEU6 微控制器
OV-Watch 的核心是 STM32F411CEU6 微控制器,即 ARM Cortex-M4 处理器,具有:
- 32 位架构
- 100MHz 工作频率
- 512KB 闪存
- 128KB SRAM
- 多个通信接口(I2C、SPI、UART)
- 低功耗模式可延长电池寿命
该微控制器处理所有处理、传感器数据收集、用户界面渲染和通信任务。
电源管理系统
电源系统采用TPS63020电源管理芯片,具有三种不同的工作模式:

关键的电源功能在 中实现,包括:HWDataAccess.c
- 电源初始化
- 电源状态检测
- 电池电量计算
- 电源关闭
外部 EEPROM
手表使用外部 EEPROM 进行持久数据存储,包括:
- 用户设置
- 校准数据
- 步数记录
- 系统配置
EEPROM 在硬件初始化序列中初始化,并提供跨电源周期持续存在的非易失性存储器。
输入/输出接口
显示和触控
OV-Watch 配备 1.69 英寸触摸显示屏,配备以下组件:
| 元件 | 描述 |
|---|---|
| LCD 显示屏 | 主可视化界面 |
| CST816 触摸控制器 | 电容式触摸传感器 |
| LCD 背光源 | PWM 控制的亮度 |
显示和触摸界面作为硬件初始化序列的一部分进行初始化,LCD 驱动程序为 LVGL 图形库提供绘图功能。
按钮
手表包括用于用户输入的硬件按钮,与触摸界面相得益彰。密钥初始化在引导序列的早期执行,以确保即使在显示器不可用时也能进行系统控制。
传感器套件
OV-Watch 包括一套用于各种测量的传感器:

MPU6050惯性测量单元
MPU6050 用于:
- 计步
- 移动侦测
- 手腕位置检测,用于显示屏唤醒
在硬件接口中实现的主要功能:
- 跨睡眠周期的步数跟踪持久性
- 手腕状态检测(向上/向下)
- 用于睡眠模式的低功耗配置
AHT21 温湿度传感器
AHT21 传感器提供环境数据:
- 测温
- 湿度测量
该传感器对于手表的环境数据显示功能非常重要。
SPL06-001 气压计
气压计传感器提供高度信息和大气压力数据。
LSM303 电子罗盘
LSM303 电子罗盘为罗盘功能提供方向信息:
- 磁场检测
- 方向计算
电子罗盘具有省电功能,不使用时进入睡眠模式。
EM7028 心率传感器
EM7028 传感器用于健康监测:
- 心率检测
- 血氧电位 (SPO2) 测量(标记为正在进行的工作)
与电子罗盘一样,心率传感器可以在不主动测量时进入睡眠模式以节省电量。
通信
KT6368A 蓝牙模块
KT6368A 蓝牙模块提供无线通信功能:
- 用于数据交换的蓝牙连接
- 支持 SPP (Serial Port Profile)
- OTA(无线)固件更新
蓝牙模块可以在不使用时禁用以节省电量。
硬件抽象层
OV-Watch 实现了一个硬件抽象层,为应用程序提供了一致的接口来访问硬件组件。该层将应用程序代码与特定的硬件实现隔离开来,使软件更易于维护和移植。

硬件接口是通过一个中央结构实现的,该结构提供对所有硬件组件的访问。HWInterface
| Interface 组件 | 目的 |
|---|---|
| RealTimeClock 实时时钟 | 日期和时间管理 |
| BLE 系列 | 蓝牙通信 |
| 权力 | 电源管理和电池监控 |
| 液晶显示器 | 显示控件 |
| IMU | 运动和步数检测 |
| AHT21 | 温度和湿度传感 |
| 晴雨表 | 大气压力和海拔高度 |
| 电子罗盘 | 方向感应 |
| HR_meter | 心率和 |


384

被折叠的 条评论
为什么被折叠?



