基于STM32的智能穿戴手表设计

智能穿戴手表系统,包含硬件设计、软件架构、传感器集成和用户界面。

一、系统总体设计

1.1 系统架构

┌─────────────────────────────────────────────────────────────┐
│                     STM32智能穿戴手表系统架构                 │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  主控制器   │  │  传感器层   │  │  显示层     │         │
│  │  STM32L4    │  │             │  │  TFT/OLED   │         │
│  │  (低功耗)   │  │ 心率/血氧  │  │  触摸屏     │         │
│  │             │  │ 加速度计    │  │  背光控制   │         │
│  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘         │
│         │                │                │                │
│  ┌──────┴────────────────┴────────────────┴──────┐         │
│  │                电源管理系统                     │         │
│  │         • 锂电池管理                           │         │
│  │         • 无线充电                            │         │
│  │         • 低功耗模式                          │         │
│  └───────────────────────────────────────────────┘         │
│                                                            │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  通信模块   │  │  存储模块   │  │  外围接口   │         │
│  │             │  │             │  │             │         │
│  │ 蓝牙5.0     │  │  Flash      │  │  振动马达   │         │
│  │  Wi-Fi      │  │  SD卡       │  │  蜂鸣器     │         │
│  │  GPS        │  │  EEPROM     │  │  LED指示灯  │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
└─────────────────────────────────────────────────────────────┘

1.2 核心功能

功能模块 具体功能 技术指标
时间功能 实时时钟、闹钟、倒计时、秒表 精度±2ppm,月误差<1分钟
健康监测 心率、血氧、体温、睡眠监测 心率精度±2bpm,血氧±2%
运动监测 计步、距离、卡路里、GPS轨迹 计步精度>95%,GPS定位精度<10m
环境监测 温度、湿度、气压、海拔 温度±0.5℃,气压±1hPa
通知功能 来电、短信、App推送、久坐提醒 支持主流App消息推送
其他功能 音乐控制、拍照控制、NFC支付 蓝牙音乐控制,NFC刷卡

二、硬件系统设计

2.1 核心元件选型

模块 推荐型号 关键参数 接口方式
主控MCU STM32L476RGT6 ARM Cortex-M4, 80MHz, 1MB Flash, 128KB RAM, 低功耗 -
显示屏 GC9A01 1.28"圆形TFT 240x240分辨率,16位色彩,IPS全视角 SPI
触摸屏 FT6336U 电容触摸,支持手势识别 I2C
心率血氧 MAX30102 集成PPG,LED驱动,环境光消除 I2C
加速度计 BMA423 12位分辨率,低功耗,计步算法 I2C
陀螺仪 MPU6050 6轴运动处理,DMP引擎 I2C
气压温度 BMP280 温度±0.5℃,气压±1Pa,海拔±1m I2C/SPI
GPS模块 AT6558 支持GPS/GLONASS/北斗,-165dBm灵敏度 UART
蓝牙模块 DA14531 蓝牙5.0,超低功耗,Mesh支持 UART
Wi-Fi模块 ESP32-C3 Wi-Fi 6,BLE 5.0,RISC-V内核 UART/SPI
NFC模块 PN532 支持ISO14443A/MIFARE,读卡距离5cm I2C/UART
电池管理 BQ25120 300mA线性充电,I2C编程 I2C
振动马达 0820微型马达 3V,10000rpm,响应时间<50ms GPIO

2.2 电源管理系统

/* 电源管理电路设计 */
// 电池:3.7V 200mAh 锂聚合物电池
// 充电:Qi无线充电 + MicroUSB有线充电
// 输出:3.3V(主系统),1.8V(传感器)

// 电源路径管理
#define POWER_SOURCE_BATTERY   0
#define POWER_SOURCE_WIRELESS  1
#define POWER_SOURCE_USB       2

// 电源管理结构体
typedef struct {
    uint8_t power_source;      // 当前电源
    float battery_voltage;     // 电池电压
    float battery_current;     // 电池电流
    uint8_t battery_level;     // 电量百分比
    float temperature;         // 电池温度
    bool is_charging;          // 是否在充电
    bool is_full;              // 是否充满
} PowerStatus;

// 低功耗模式
typedef enum {
    POWER_MODE_ACTIVE,         // 全功能模式
    POWER_MODE_SLEEP,          // 睡眠模式(屏幕关闭)
    POWER_MODE_DEEP_SLEEP,     // 深度睡眠(仅RTC运行)
    POWER_MODE_SHUTDOWN        // 关机模式
} PowerMode;

2.3 PCB设计要点

PCB层叠结构(4层板):
Layer1(顶层):MCU、传感器、接口
Layer2(内电层):GND平面
Layer3(内电层):3.3V/1.8V电源
Layer4(底层):显示屏、电池、被动元件

布局原则:
1. 模拟/数字分区:传感器在模拟区,数字电路在数字区
2. 射频隔离:蓝牙/Wi-Fi/GPS天线周围净空
3. 热管理:充电IC、显示屏背光注意散热
4. 阻抗控制:射频线50Ω,USB差分线90Ω

三、软件架构设计

3.1 操作系统选择

/* 基于FreeRTOS的多任务系统 */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"

// 任务优先级定义
#define TASK_PRIORITY_HIGHEST      (configMAX_PRIORITIES - 1)
#define TASK_PRIORITY_DISPLAY      5
#define TASK_PRIORITY_SENSOR       4
#define TASK_PRIORITY_BLUETOOTH    3
#define TASK_PRIORITY_UI           2
#define TASK_PRIORITY_BACKGROUND   1

// 任务堆栈大小
#define STACK_SIZE_DISPLAY         2048
#define STACK_SIZE_SENSOR          1536
#define STACK_SIZE_BLUETOOTH       2048
#define STACK_SIZE_UI              1024

// 系统任务列表
TaskHandle_t xDisplayTask = NULL;
TaskHandle_t xSensorTask = NULL;
TaskHandle_t xBluetoothTask = NULL;
TaskHandle_t xUITask = NULL;
TaskHandle_t xPowerTask = NULL;

3.2 主程序框架

/* 主程序入口 */
int main(void) {
    // HAL库初始化
    HAL_Init();
    
    // 系统时钟配置
    SystemClock_Config();
    
    // 硬件初始化
    hardware_init();
    
    // FreeRTOS初始化
    xTaskCreate(Display_Task, "Display", STACK_SIZE_DISPLAY, NULL, 
                TASK_PRIORITY_DISPLAY, &xDisplayTask);
    xTaskCreate(Sensor_Task, "Sensor", STACK_SIZE_SENSOR, NULL, 
                TASK_PRIORITY_SENSOR, &xSensorTask);
    xTaskCreate(Bluetooth_Task, "Bluetooth", STACK_SIZE_BLUETOOTH, NULL, 
                TASK_PRIORITY_BLUETOOTH, &xBluetoothTask);
    xTaskCreate(UI_Task, "UI", STACK_SIZE_UI, NULL, 
                TASK_PRIORITY_UI, &xUITask);
    xTaskCreate(Power_Task, "Power", 1024, NULL, 
                TASK_PRIORITY_BACKGROUND, &xPowerTask);
    
    // 启动调度器
    vTaskStartScheduler();
    
    // 不应该执行到这里
    while (1) {
        // 系统错误处理
        system_error_handler();
    }
}

/* 硬件初始化 */
void hardware_init(void) {
    // GPIO初始化
    MX_GPIO_Init();
    
    // 外设时钟使能
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOD_CLK_ENABLE();
    
    // 显示屏初始化
    display_init();
    
    // 触摸屏初始化
    touch_init();
    
    // 传感器初始化
    sensor_init_all();
    
    // 蓝牙初始化
    bluetooth_init();
    
    // 电源管理初始化
    power_management_init();
    
    // 文件系统初始化
    filesystem_init();
    
    // 实时时钟初始化
    rtc_init();
    
    // 振动马达初始化
    vibration_init();
    
    // 蜂鸣器初始化
    buzzer_init();
}

四、显示与用户界面

4.1 显示驱动

/* GC9A01 TFT显示屏驱动 */
#include "gc9a01.h"

// 显示屏参数
#define DISPLAY_WIDTH     240
#define DISPLAY_HEIGHT    240
#define DISPLAY_COLORS    65535  // 16位色
#define DISPLAY_SPI       SPI1
#define DISPLAY_CS_PIN    GPIO_PIN_4
#define DISPLAY_DC_PIN    GPIO_PIN_5
#define DISPLAY_RST_PIN   GPIO_PIN_6
#define DISPLAY_BL_PIN    GPIO_PIN_7

// 显示缓冲区(双缓冲)
uint16_t display_buffer1[DISPLAY_WIDTH * DISPLAY_HEIGHT];
uint16_t display_buffer2[DISPLAY_WIDTH * DISPLAY_HEIGHT];
uint16_t *active_buffer = display_buffer1;
uint16_t *draw_buffer = display_buffer2;

// 显示初始化
void display_init(void) {
    // 硬件复位
    HAL_GPIO_WritePin(GPIOA, DISPLAY_RST_PIN, GPIO_PIN_RESET);
    HAL_Delay(100);
    HAL_GPIO_WritePin(GPIOA, DISPLAY_RST_PIN, GPIO_PIN_SET);
    HAL_Delay(100);
    
    // 发送初始化序列
    display_send_command(0xEF);
    display_send_command(0xEB);
    display_send_data(0x14);
    
    // 配置显示方向
    display_set_rotation(0);  // 0度旋转
    
    // 开启显示
    display_send_command(0x29);
    
    // 设置背光
    display_set_backlight(80);  // 80%亮度
}

// 双缓冲交换
void display_swap_buffers(void) {
    // 等待DMA传输完成
    while (display_dma_transfer_busy());
    
    // 交换缓冲区
    uint16_t *temp = active_buffer;
    active_buffer = draw_buffer;
    draw_buffer = temp;
    
    // 更新显示
    display_update(active_buffer);
}

// 图形绘制函数
void display_draw_pixel(int16_t x, int16_t y, uint16_t color) {
    if (x < 0 || x >= DISPLAY_WIDTH || y < 0 || y >= DISPLAY_HEIGHT) {
        return;
    }
    draw_buffer[y * DISPLAY_WIDTH + x] = color;
}

void display_draw_line(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color) {
    int16_t dx = abs(x1 - x0);
    int16_t dy = abs(y1 - y0);
    int16_t sx = (x0 < x1) ? 1 : -1;
    int16_t sy = (y0 < y1) ? 1 : -1;
    int16_t err = dx - dy;
    
    while (1) {
        display_draw_pixel(x0, y0, color);
        if (x0 == x1 && y0 == y1) break;
        int16_t e2 = 2 * err;
        if (e2 > -dy) {
            err -= dy;
            x0 += sx;
        }
        if (e2 < dx) {
            err += dx;
            y0 += sy;
        }
    }
}

void display_draw_circle(int16_t x0, int16_t y0, int16_t r, uint16_t color) {
    int16_t f = 1 - r;
    int16_t ddF_x = 1;
    int16_t ddF_y = -2 * r;
    int16_t x = 0;
    int16_t y = r;
    
    display_draw_pixel(x0, y0 + r, color);
    display_draw_pixel(x0, y0 - r, color);
    display_draw_pixel(x0 + r, y0, color);
    display_draw_pixel(x0 - r, y0, color);
    
    while (x < y) {
        if (f >= 0) {
            y--;
            ddF_y += 2;
            f += ddF_y;
        }
        x++;
        ddF_x += 2;
        f += ddF_x;
        
        display_draw_pixel(x0 + x, y0 + y, color);
        display_draw_pixel(x0 - x, y0 + y, color);
        display_draw_pixel(x0 + x, y0 - y, color);
        display_draw_pixel(x0 - x, y0 - y, color);
        display_draw_pixel(x0 + y, y0 + x, color);
        display_draw_pixel(x0 - y, y0 + x, color);
        display_draw_pixel(x0 + y, y0 - x, color);
        display_draw_pixel(x0 - y, y0 - x, color);
    }
}

4.2 图形用户界面

/* 基于LVGL的图形界面 */
#include "lvgl.h"

// LVGL初始化
void lvgl_init(void) {
    // LVGL初始化
    lv_init();
    
    // 显示缓冲区
    static lv_disp_draw_buf_t draw_buf;
    static lv_color_t buf1[DISPLAY_WIDTH * 20];  // 行缓冲区
    static lv_color_t buf2[DISPLAY_WIDTH * 20];
    lv_disp_draw_buf_init(&draw_buf, buf1, buf2, DISPLAY_WIDTH * 20);
    
    // 显示驱动
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.hor_res = DISPLAY_WIDTH;
    disp_drv.ver_res = DISPLAY_HEIGHT;
    disp_drv.flush_cb = lvgl_flush_callback;
    disp_drv.draw_buf = &draw_buf;
    lv_disp_drv_register(&disp_drv);
    
    // 输入设备(触摸屏)
    static lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = lvgl_touch_read;
    lv_indev_drv_register(&indev_drv);
    
    // 创建主题
    lv_theme_t *theme = lv_theme_default_init(lv_color_hex(0x003a57), 
                                              lv_color_hex(0xffffff),
                                              LV_THEME_DEFAULT_DARK, 
                                              &lv_font_montserrat_16);
    lv_disp_set_theme(lv_disp_get_default(), theme);
}

// 主界面
void create_main_interface(void) {
    // 创建主屏幕
    lv_obj_t *main_screen = lv_obj_create(NULL);
    
    // 顶部状态栏
    create_status_bar(main_screen);
    
    // 主界面内容
    create_watch_face(main_screen);
    
    // 底部导航栏
    create_navigation_bar(main_screen);
    
    // 加载屏幕
    lv_scr_load(main_screen);
}

// 创建状态栏
void create_status_bar(lv_obj_t *parent) {
    lv_obj_t *status_bar = lv_obj_create(parent);
    lv_obj_set_size(status_bar, DISPLAY_WIDTH, 30);
    lv_obj_set_pos(status_bar, 0, 0);
    lv_obj_set_style_bg_color(status_bar, lv_color_hex(0x000000), 0);
    lv_obj_set_style_border_width(status_bar, 0, 0);
    
    // 时间显示
    lv_obj_t *time_label = lv_label_create(status_bar);
    lv_label_set_text(time_label, "12:00");
    lv_obj_align(time_label, LV_ALIGN_CENTER, 0, 0);
    
    // 电池图标
    lv_obj_t *battery_icon = lv_label_create(status_bar);
    lv_label_set_text(battery_icon, LV_SYMBOL_BATTERY_FULL);
    lv_obj_align(battery_icon, LV_ALIGN_RIGHT_MID, -10, 0);
    
    // 蓝牙图标
    lv_obj_t *bluetooth_icon = lv_label_create(status_bar);
    lv_label_set_text(bluetooth_icon, LV_SYMBOL_BLUETOOTH);
    lv_obj_align(bluetooth_icon, LV_ALIGN_LEFT_MID, 10, 0);
}

// 创建表盘
void create_watch_face(lv_obj_t *parent) {
    lv_obj_t *watch_face = lv_obj_create(parent);
    lv_obj_set_size(watch_face, 200, 200);
    lv_obj_align(watch_face, LV_ALIGN_CENTER, 0, 0);
    lv_obj_set_style_border_width(watch_face, 0, 0);
    
    // 时钟背景
    lv_obj_t *clock_bg = lv_obj_create(watch_face);
    lv_obj_set_size(clock_bg, 180, 180);
    lv_obj_align(clock_bg, LV_ALIGN_CENTER, 0, 0);
    lv_obj_set_style_radius(clock_bg, 90, 0);
    lv_obj_set_style_bg_color(clock_bg, lv_color_hex(0x1a1a2e), 0);
    
    // 时钟刻度
    for (int i = 0; i < 12; i++) {
        float angle = i * 30 * 3.14159 / 180;
        int16_t x1 = 90 + 70 * sin(angle);
        int16_t y1 = 90 - 70 * cos(angle);
        int16_t x2 = 90 + 80 * sin(angle);
        int16_t y2 = 90 - 80 * cos(angle);
        
        lv_obj_t *scale = lv_line_create(clock_bg);
        lv_point_t points[] = {{x1, y1}, {x2, y2}};
        lv_line_set_points(scale, points, 2);
        lv_obj_set_style_line_width(scale, 2, 0);
        lv_obj_set_style_line_color(scale, lv_color_hex(0xffffff), 0);
    }
    
    // 时针
    lv_obj_t *hour_hand = lv_line_create(clock_bg);
    lv_point_t hour_points[] = {{90, 90}, {90, 50}};
    lv_line_set_points(hour_hand, hour_points, 2);
    lv_obj_set_style_line_width(hour_hand, 6, 0);
    lv_obj_set_style_line_color(hour_hand, lv_color_hex(0xff0000), 0);
    
    // 分针
    lv_obj_t *minute_hand = lv_line_create(clock_bg);
    lv_point_t minute_points[] = {{90, 90}, {90, 30}};
    lv_line_set_points(minute_hand, minute_points, 2);
    lv_obj_set_style_line_width(minute_hand, 4, 0);
    lv_obj_set_style_line_color(minute_hand, lv_color_hex(0x00ff00), 0);
    
    // 秒针
    lv_obj_t *second_hand = lv_line_create(clock_bg);
    lv_point_t second_points[] = {{90, 90}, {90, 20}};
    lv_line_set_points(second_hand, second_points, 2);
    lv_obj_set_style_line_width(second_hand, 2, 0);
    lv_obj_set_style_line_color(second_hand, lv_color_hex(0x0000ff), 0);
    
    // 中心点
    lv_obj_t *center = lv_obj_create(clock_bg);
    lv_obj_set_size(center, 10, 10);
    lv_obj_align(center, LV_ALIGN_CENTER, 0, 0);
    lv_obj_set_style_radius(center, 5, 0);
    lv_obj_set_style_bg_color(center, lv_color_hex(0xffffff), 0);
}

五、传感器数据处理

5.1 心率血氧监测

/* MAX30102心率血氧监测算法 */
#include "max30102.h"
#include "algorithm.h"

#define SAMPLE_RATE     100  // 100Hz采样率
#define BUFFER_SIZE     256  // 缓冲区大小

// 数据缓冲区
int32_t red_buffer[BUFFER_SIZE];
int32_t ir_buffer[BUFFER_SIZE];
uint16_t buffer_index = 0;

// 心率血氧计算结果
typedef struct {
    uint16_t heart_rate;      // 心率(bpm)
    uint8_t spO2;            // 血氧饱和度(%)
    uint8_t confidence;      // 置信度(0-100%)
    uint32_t timestamp;      // 时间戳
} HRSpO2_Result;

// 初始化MAX30102
void max30102_init(void) {
    // 复位芯片
    max30102_write_register(MAX30102_MODECONFIG, 0x40);
    HAL_Delay(10);
    
    // 配置采样率
    max30102_write_register(MAX30102_SPO2CONFIG, 0x27);  // 100Hz, 411us pulse width
    
    // 配置LED电流
    max30102_write_register(MAX30102_LED1_PULSEAMP, 0x24);  // IR LED电流
    max30102_write_register(MAX30102_LED2_PULSEAMP, 0x24);  // Red LED电流
    
    // 开启传感器
    max30102_write_register(MAX30102_MODECONFIG, 0x03);  // SpO2模式
}

// 心率计算算法
void calculate_heart_rate(void) {
    static float heart_rate_filtered = 0;
    static float alpha = 0.1;  // 低通滤波系数
    
    // 获取PPG信号
    int32_t red_value = red_buffer[buffer_index];
    int32_t ir_value = ir_buffer[buffer_index];
    
    // 信号质量检测
    float signal_quality = evaluate_signal_quality(ir_buffer, BUFFER_SIZE);
    
    if (signal_quality > 0.8) {
        // 计算心率
        float heart_rate_raw = find_heart_rate(ir_buffer, BUFFER_SIZE, SAMPLE_RATE);
        
        // 滤波处理
        heart_rate_filtered = alpha * heart_rate_raw + (1 - alpha) * heart_rate_filtered;
        
        // 心率有效范围限制(30-250bpm)
        if (heart_rate_filtered < 30) heart_rate_filtered = 30;
        if (heart_rate_filtered > 250) heart_rate_filtered = 250;
        
        // 计算血氧
        float R_value = calculate_R_value(red_buffer, ir_buffer, BUFFER_SIZE);
        float spO2_raw = 110 - 25 * R_value;  // 简化计算公式
        
        // 血氧范围限制
        if (spO2_raw < 70) spO2_raw = 70;
        if (spO2_raw > 100) spO2_raw = 100;
        
        // 更新结果
        HRSpO2_Result result = {
            .heart_rate = (uint16_t)heart_rate_filtered,
            .spO2 = (uint8_t)spO2_raw,
            .confidence = (uint8_t)(signal_quality * 100),
            .timestamp = HAL_GetTick()
        };
        
        // 存储结果
        save_hr_spo2_result(&result);
        
        // 发送到显示
        update_hr_display(result.heart_rate, result.spO2);
    }
}

// 信号质量评估
float evaluate_signal_quality(int32_t *buffer, uint16_t size) {
    // 计算信号均值
    int64_t sum = 0;
    for (uint16_t i = 0; i < size; i++) {
        sum += buffer[i];
    }
    float mean = (float)sum / size;
    
    // 计算方差
    float variance = 0;
    for (uint16_t i = 0; i < size; i++) {
        float diff = buffer[i] - mean;
        variance += diff * diff;
    }
    variance /= size;
    
    // 计算信噪比
    float snr = 20 * log10(mean / sqrt(variance));
    
    // 信号质量评分(0-1)
    float quality = 0;
    if (snr > 20) quality = 1.0;
    else if (snr > 10) quality = 0.8;
    else if (snr > 5) quality = 0.5;
    else if (snr > 0) quality = 0.2;
    
    return quality;
}

5.2 运动监测算法

/* BMA423计步算法 */
#include "bma423.h"

// 计步数据结构
typedef struct {
    uint32_t step_count;      // 步数
    uint32_t step_timestamp;  // 最后一步时间戳
    float distance;          // 距离(米)
    uint16_t calories;       // 卡路里
    uint8_t activity_level;  // 活动等级
} StepData;

// 计步算法初始化
void step_counter_init(void) {
    // 初始化BMA423
    bma423_init();
    
    // 配置计步参数
    bma423_write_register(BMA423_STEP_CNT_CONFIG, 0x15);
    bma423_write_register(BMA423_STEP_CNT_CONFIG1, 0x03);
    
    // 开启计步功能
    bma423_write_register(BMA423_FEATURE_ENABLE, 0x04);
    
    // 使能中断
    bma423_enable_interrupt(BMA423_STEP_CNT_INT);
}

// 计步处理函数
void process_step_data(void) {
    static uint32_t last_step_count = 0;
    static StepData step_data = {0};
    
    // 读取计步器
    uint32_t current_steps = bma423_read_step_counter();
    
    // 检测新步数
    if (current_steps > last_step_count) {
        uint32_t new_steps = current_steps - last_step_count;
        step_data.step_count += new_steps;
        step_data.step_timestamp = HAL_GetTick();
        
        // 计算距离(假设步长0.7米)
        step_data.distance += new_steps * 0.7f;
        
        // 计算卡路里(假设0.04卡/步)
        step_data.calories += (uint16_t)(new_steps * 0.04f);
        
        // 更新活动等级
        update_activity_level(&step_data);
        
        // 更新显示
        update_step_display(step_data.step_count, step_data.distance, step_data.calories);
        
        last_step_count = current_steps;
    }
}

// 睡眠监测
typedef struct {
    uint8_t sleep_state;      // 睡眠状态
    uint32_t sleep_start;     // 入睡时间
    uint32_t sleep_end;       // 醒来时间
    uint32_t deep_sleep_time; // 深睡时间
    uint32_t light_sleep_time;// 浅睡时间
    uint8_t sleep_score;      // 睡眠评分
} SleepData;

// 睡眠分析算法
void analyze_sleep(void) {
    static SleepData sleep_data = {0};
    static uint32_t last_activity_time = 0;
    
    // 读取加速度数据
    int16_t accel[3];
    bma423_read_acceleration(accel);
    
    // 计算活动强度
    float activity = sqrt(accel[0]*accel[0] + accel[1]*accel[1] + accel[2]*accel[2]);
    
    // 睡眠状态检测
    uint32_t current_time = HAL_GetTick();
    
    if (activity < 0.1) {  // 低活动
        if (sleep_data.sleep_state == 0) {
            // 开始睡眠
            sleep_data.sleep_state = 1;
            sleep_data.sleep_start = current_time;
        } else {
            // 睡眠中
            uint32_t sleep_duration = current_time - sleep_data.sleep_start;
            
            // 根据活动变化判断深浅睡眠
            if (sleep_duration > 20 * 60 * 1000) {  // 20分钟后
                static float last_activity = 0;
                float activity_change = fabs(activity - last_activity);
                
                if (activity_change < 0.01) {
                    // 深睡眠
                    sleep_data.deep_sleep_time += 10;  // 10ms采样间隔
                } else {
                    // 浅睡眠
                    sleep_data.light_sleep_time += 10;
                }
                
                last_activity = activity;
            }
        }
    } else {
        if (sleep_data.sleep_state == 1) {
            // 睡眠结束
            sleep_data.sleep_state = 0;
            sleep_data.sleep_end = current_time;
            
            // 计算睡眠评分
            calculate_sleep_score(&sleep_data);
            
            // 保存睡眠数据
            save_sleep_data(&sleep_data);
            
            // 重置数据
            memset(&sleep_data, 0, sizeof(SleepData));
        }
    }
    
    last_activity_time = current_time;
}

参考代码 基于STM32智能穿戴手表设计 www.youwenfan.com/contentcnt/133701.html

六、蓝牙通信协议

6.1 蓝牙协议栈

/* 基于DA14531的蓝牙通信 */
#include "da14531.h"

// 蓝牙服务定义
#define SERVICE_UUID_HEART_RATE    0x180D
#define SERVICE_UUID_BATTERY       0x180F
#define SERVICE_UUID_DEVICE_INFO   0x180A
#define SERVICE_UUID_CUSTOM        0xFFF0

// 特征值定义
typedef struct {
    // 心率服务
    uint8_t heart_rate_measurement[3];  // 心率测量值
    uint8_t body_sensor_location;       // 传感器位置
    
    // 电池服务
    uint8_t battery_level;              // 电池电量
    uint8_t battery_state;              // 电池状态
    
    // 自定义服务
    uint8_t step_count[4];              // 步数
    uint8_t temperature[2];             // 温度
    uint8_t notification[20];           // 通知
} BluetoothCharacteristics;

// 蓝牙初始化
void bluetooth_init(void) {
    // 初始化蓝牙芯片
    da14531_init();
    
    // 配置蓝牙参数
    bluetooth_configure();
    
    // 创建GATT服务
    create_gatt_services();
    
    // 设置设备名称
    bluetooth_set_device_name("SmartWatch_V1.0");
    
    // 开始广播
    bluetooth_start_advertising();
}

// 创建GATT服务
void create_gatt_services(void) {
    // 心率服务
    gatt_service_t heart_rate_service = {
        .uuid = SERVICE_UUID_HEART_RATE,
        .characteristics = {
            {.uuid = 0x2A37, .properties = GATT_PROP_NOTIFY},  // 心率测量
            {.uuid = 0x2A38, .properties = GATT_PROP_READ}     // 传感器位置
        },
        .characteristic_count = 2
    };
    gatt_add_service(&heart_rate_service);
    
    // 电池服务
    gatt_service_t battery_service = {
        .uuid = SERVICE_UUID_BATTERY,
        .characteristics = {
            {.uuid = 0x2A19, .properties = GATT_PROP_NOTIFY | GATT_PROP_READ}
        },
        .characteristic_count = 1
    };
    gatt_add_service(&battery_service);
    
    // 自定义服务
    gatt_service_t custom_service = {
        .uuid = SERVICE_UUID_CUSTOM,
        .characteristics = {
            {.uuid = 0xFFF1, .properties = GATT_PROP_NOTIFY | GATT_PROP_READ},  // 步数
            {.uuid = 0xFFF2, .properties = GATT_PROP_NOTIFY | GATT_PROP_READ},  // 温度
            {.uuid = 0xFFF3, .properties = GATT_PROP_WRITE | GATT_PROP_NOTIFY}  // 通知
        },
        .characteristic_count = 3
    };
    gatt_add_service(&custom_service);
}

// 蓝牙数据处理
void bluetooth_data_handler(uint8_t *data, uint16_t length) {
    // 解析命令
    uint8_t command = data[0];
    
    switch (command) {
        case 0x01:  // 获取时间
            send_time_data();
            break;
            
        case 0x02:  // 获取健康数据
            send_health_data();
            break;
            
        case 0x03:  // 设置闹钟
            set_alarm(&data[1]);
            break;
            
        case 0x04:  // 控制音乐
            control_music(data[1]);
            break;
            
        case 0x05:  // 查找手机
            find_phone();
            break;
            
        case 0x06:  // 相机控制
            control_camera(data[1]);
            break;
            
        default:
            // 未知命令
            break;
    }
}

// 发送通知到手机
void send_notification(const char *message) {
    uint8_t buffer[20] = {0};
    
    // 消息类型
    buffer[0] = 0x01;  // 文本消息
    
    // 消息内容
    uint8_t len = strlen(message);
    if (len > 18) len = 18;
    memcpy(&buffer[1], message, len);
    buffer[len + 1] = '\0';
    
    // 通过蓝牙发送
    bluetooth_send_data(SERVICE_UUID_CUSTOM, 0xFFF3, buffer, len + 2);
}

七、电源管理系统

7.1 低功耗管理

/* 电源管理系统 */
#include "stm32l4xx_hal.h"

// 电源状态
typedef enum {
    POWER_STATE_ACTIVE,      // 全功能运行
    POWER_STATE_IDLE,        // 空闲状态
    POWER_STATE_SLEEP,       // 睡眠状态
    POWER_STATE_STANDBY,     // 待机状态
    POWER_STATE_SHUTDOWN     // 关机状态
} PowerState;

// 电源管理结构
typedef struct {
    PowerState current_state;
    PowerState next_state;
    uint32_t state_timer;
    uint8_t battery_level;
    bool is_charging;
    float power_consumption;
} PowerManagement;

// 进入低功耗模式
void enter_low_power_mode(PowerState target_state) {
    switch (target_state) {
        case POWER_STATE_IDLE:
            // 关闭外设时钟
            __HAL_RCC_GPIOA_CLK_DISABLE();
            __HAL_RCC_GPIOB_CLK_DISABLE();
            __HAL_RCC_GPIOC_CLK_DISABLE();
            __HAL_RCC_GPIOD_CLK_DISABLE();
            
            // 进入Sleep模式
            HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
            break;
            
        case POWER_STATE_SLEEP:
            // 关闭显示屏
            display_set_backlight(0);
            display_sleep();
            
            // 关闭传感器
            sensor_sleep_all();
            
            // 关闭蓝牙
            bluetooth_sleep();
            
            // 进入Stop模式
            HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
            break;
            
        case POWER_STATE_STANDBY:
            // 保存状态到备份寄存器
            save_system_state();
            
            // 进入Standby模式
            HAL_PWR_EnterSTANDBYMode();
            break;
            
        case POWER_STATE_SHUTDOWN:
            // 完全关机
            power_off();
            break;
            
        default:
            break;
    }
}

// 唤醒处理
void wakeup_handler(void) {
    // 检测唤醒源
    if (__HAL_PWR_GET_FLAG(PWR_FLAG_WU)) {
        // 按键唤醒
        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
        system_wakeup();
    } else if (__HAL_RTC_GET_FLAG(RTC_FLAG_ALRAF)) {
        // 闹钟唤醒
        __HAL_RTC_CLEAR_FLAG(RTC_FLAG_ALRAF);
        alarm_handler();
    }
}

// 电池管理
void battery_management_task(void) {
    static uint32_t last_check_time = 0;
    uint32_t current_time = HAL_GetTick();
    
    // 每10秒检查一次电池
    if (current_time - last_check_time > 10000) {
        last_check_time = current_time;
        
        // 读取电池电压
        float voltage = read_battery_voltage();
        
        // 计算电量百分比
        uint8_t level = calculate_battery_level(voltage);
        
        // 低电量警告
        if (level < 10) {
            show_low_battery_warning();
            
            // 进入省电模式
            if (level < 5) {
                enter_power_saving_mode();
            }
        }
        
        // 充电状态检测
        bool charging = check_charging_status();
        
        // 更新显示
        update_battery_display(level, charging);
    }
}

八、文件系统与数据存储

8.1 FAT文件系统

/* FATFS文件系统实现 */
#include "fatfs.h"

// 文件系统句柄
FATFS fs;
FIL file;
FRESULT res;

// 文件系统初始化
void filesystem_init(void) {
    // 挂载文件系统
    res = f_mount(&fs, "0:", 1);
    if (res != FR_OK) {
        // 格式化文件系统
        res = f_mkfs("0:", FM_FAT32, 0, work, sizeof(work));
        if (res == FR_OK) {
            f_mount(NULL, "0:", 0);
            f_mount(&fs, "0:", 1);
        }
    }
    
    // 创建目录结构
    f_mkdir("/Data");
    f_mkdir("/Data/Health");
    f_mkdir("/Data/Sport");
    f_mkdir("/Data/Sleep");
    f_mkdir("/Settings");
    f_mkdir("/Logs");
}

// 存储健康数据
void save_health_data(HealthData *data) {
    char filename[50];
    sprintf(filename, "/Data/Health/health_%lu.dat", data->timestamp);
    
    // 打开文件
    res = f_open(&file, filename, FA_WRITE | FA_CREATE_ALWAYS);
    if (res == FR_OK) {
        // 写入数据
        UINT bytes_written;
        f_write(&file, data, sizeof(HealthData), &bytes_written);
        
        // 关闭文件
        f_close(&file);
    }
}

// 读取历史数据
void read_history_data(HealthData *buffer, uint32_t start_time, uint32_t end_time) {
    DIR dir;
    FILINFO fno;
    
    // 打开目录
    res = f_opendir(&dir, "/Data/Health");
    if (res == FR_OK) {
        int index = 0;
        
        while (1) {
            res = f_readdir(&dir, &fno);
            if (res != FR_OK || fno.fname[0] == 0) break;
            
            // 解析文件名获取时间戳
            char *timestamp_str = strstr(fno.fname, "_");
            if (timestamp_str) {
                timestamp_str++;  // 跳过下划线
                uint32_t timestamp = atoi(timestamp_str);
                
                // 检查时间范围
                if (timestamp >= start_time && timestamp <= end_time) {
                    char full_path[100];
                    sprintf(full_path, "/Data/Health/%s", fno.fname);
                    
                    // 读取文件
                    FIL file;
                    if (f_open(&file, full_path, FA_READ) == FR_OK) {
                        f_read(&file, &buffer[index], sizeof(HealthData), NULL);
                        f_close(&file);
                        index++;
                    }
                }
            }
        }
        f_closedir(&dir);
    }
}

九、测试与验证

9.1 系统测试程序

/* 系统自检程序 */
void system_self_test(void) {
    printf("===== 智能手表自检程序 =====\n");
    
    // 1. 内存测试
    printf("1. 内存测试...\n");
    if (memory_test() == 0) {
        printf("  ✓ RAM测试通过\n");
    } else {
        printf("  ✗ RAM测试失败\n");
    }
    
    // 2. 显示屏测试
    printf("2. 显示屏测试...\n");
    display_test_pattern();
    if (check_display()) {
        printf("  ✓ 显示屏测试通过\n");
    } else {
        printf("  ✗ 显示屏测试失败\n");
    }
    
    // 3. 触摸屏测试
    printf("3. 触摸屏测试...\n");
    if (touch_calibrate()) {
        printf("  ✓ 触摸屏校准成功\n");
    } else {
        printf("  ✗ 触摸屏校准失败\n");
    }
    
    // 4. 传感器测试
    printf("4. 传感器测试...\n");
    test_sensors();
    
    // 5. 蓝牙测试
    printf("5. 蓝牙测试...\n");
    if (bluetooth_test()) {
        printf("  ✓ 蓝牙测试通过\n");
    } else {
        printf("  ✗ 蓝牙测试失败\n");
    }
    
    // 6. 电池测试
    printf("6. 电池测试...\n");
    test_battery();
    
    // 7. 性能测试
    printf("7. 性能测试...\n");
    performance_test();
    
    printf("===== 自检完成 =====\n");
}

// 传感器测试
void test_sensors(void) {
    // 心率传感器测试
    int32_t red, ir;
    max30102_read_fifo(&red, &ir);
    if (red > 0 && ir > 0) {
        printf("  ✓ 心率传感器正常\n");
    } else {
        printf("  ✗ 心率传感器异常\n");
    }
    
    // 加速度计测试
    int16_t accel[3];
    bma423_read_acceleration(accel);
    if (abs(accel[0]) + abs(accel[1]) + abs(accel[2]) > 0) {
        printf("  ✓ 加速度计正常\n");
    } else {
        printf("  ✗ 加速度计异常\n");
    }
    
    // 温度传感器测试
    float temperature = read_temperature();
    if (temperature > 10 && temperature < 50) {
        printf("  ✓ 温度传感器正常: %.1f°C\n", temperature);
    } else {
        printf("  ✗ 温度传感器异常\n");
    }
}

十、项目总结

10.1 主要特点

  1. 高性能处理器:STM32L476提供强大计算能力
  2. 丰富传感器:集成心率、血氧、运动、环境监测
  3. 优质显示:圆形TFT IPS显示屏,触摸操作
  4. 长续航:低功耗设计,支持无线充电
  5. 智能连接:蓝牙5.0、Wi-Fi、GPS、NFC
  6. 健康监测:专业级健康数据采集和分析

10.2 技术难点与解决方案

技术难点 解决方案
功耗优化 多级电源管理,动态频率调整
传感器精度 多传感器融合,软件滤波算法
小尺寸设计 高密度PCB布局,微型元件选型
防水防尘 IP68密封设计,专用接口保护
算法复杂度 优化算法,硬件加速支持

10.3 生产成本估算

项目 成本(元) 说明
主控MCU 25 STM32L476RGT6
显示屏 18 1.28寸圆形TFT
传感器 35 心率+加速度+气压+温度
通信模块 25 蓝牙+Wi-Fi+GPS+NFC
PCB与元件 30 4层板,各类被动元件
结构件 20 外壳、表带、螺丝等
电池 15 200mAh锂电池
组装测试 10 人工和测试成本
合计 178 小批量生产成本

10.4 扩展功能建议

  1. eSIM支持:增加蜂窝网络连接
  2. 语音助手:集成离线语音识别
  3. 支付功能:支持银联闪付、交通卡
  4. 血氧趋势:24小时血氧监测
  5. 跌倒检测:老人安全监护
  6. 无线升级:OTA固件升级
  7. 多语言支持:国际化界面
  8. 应用商店:第三方应用扩展
posted @ 2026-04-24 08:26  风一直那个吹  阅读(10)  评论(0)    收藏  举报