FreeRTOS手表学习

概述

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) 更新。

引导流程


启动过程包括:

  1. 检查复位期间是否按下 KEY1 进入 bootloader 模式
  2. 在 bootloader 模式下,启用 Bluetooth 以接收固件
  3. 验证和刷写新固件
  4. 跳转到应用程序代码(如果有效)
  5. 初始化 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:根据输入和传感器数据更新 UI
  • SensUpdateTask:读取和处理传感器数据
  • RunModeTasks:处理特定的作模式
  • DataSaveTask:管理到 EEPROM 的数据持久性
  • ChargCheckTask:监控电池和充电状态
  • MessageSendTask:处理消息发送作

电源管理系统

OV-Watch 实现了一个复杂的电源管理系统,具有三种主要状态,以最大限度地延长电池寿命。

电源管理状态

电源管理系统包括:

  1. 运行模式

    • 所有组件均处于活动状态的正常作
    • 电流消耗:70-80mA
  2. 睡眠模式

    • MCU 处于 STOP 模式
    • MPU6050 保持活动状态以进行步数计数
    • 显示器已关闭
    • 消耗电流:约 800μA
    • 在 RTC 中断或检测到手腕抬起时转换为 Running 模式
  3. 关机模式

    • 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 应用程序开发和迁移:

  1. 在 LVGL 模拟器中开发和测试 UI 组件
  2. 将 and 文件夹复制到 Keil 工程的文件夹中FuncGUI_AppUser
  3. 设置标志以控制是使用实际硬件还是模拟接口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 开发工作流程的关键方面:

  1. 在 LVGL 模拟器 ( 目录) 中开发和测试 UI 更改lv_sim_vscode_win
  2. 将修改后的文件从 和 文件夹复制到 Keil 项目FuncGUI_App
  3. 为目标环境设置适当的值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 心率和
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值