程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)

STM2F411智能手环设计

最近闲来无事就想制作一款智能手环,为此我直接从网上找到一个开源项目OV-Watch。这里我们就以这个开源项目为例进行介绍,从最初的电路原理图绘制,到PCB打样焊接,到最后的程序编写烧录测试。

由于该开源项目包含了若干个版本,这里我们在复刻的时候以当前最新版本为例,即V2.4版本。

一、思考

我们要设计一款智能手环,我们通常需要经历如下几个步骤:

  • 市场需求调研,调研市场上销量比较高(受大众欢迎)的产品一般都具备哪些功能;
  • 技术方案预言,调研目前智能手环通常采用的硬件以及软件设计方案。

1.1 功能需求

设计一款智能手环涉及的功能多种多样,通常涵盖健康监测、运动跟踪、通知提醒、以及与手机的连接等功能。

1.1.1 健康监测功能
  • 心率监测:通过光学传感器(PPG,光电容积脉搏波传感器)测量佩戴者的心率;
  • 血氧监测:利用光学传感器测量血氧饱和度(SpO2);
  • 睡眠监测:通过加速度计和陀螺仪结合算法来监测睡眠阶段(深睡、浅睡等);
  • 压力监测:通过心率变异性分析来估算压力水平;
  • 体温监测:一些高级手环可以监测体温变化;
  • 步态监测:检测步伐和运动模式,帮助记录步数、运动量。
1.1.2 运动跟踪
  • 运动模式:支持跑步、骑行、游泳、登山等不同运动模式,并能记录运动数据;
  • GPS路径记录:使用内置GPS模块记录运动路径,或通过蓝牙与手机共享GPS数据.
1.1.3 通知提醒功能
  • 来电、短信、应用通知提醒:通过与手机的蓝牙连接,接收来电、短信、社交应用的提醒;
  • 振动提醒:当有通知时,通过内置的振动电机进行提醒。
1.1.4 电池管理
  • 低功耗:智能手环通常要求长时间待机,因此需要高效的电池管理系统,确保电池能够支持长时间使用;
  • 快速充电:支持快速充电技术,减少充电时间。
1.1.5 用户交互
  • 触摸屏:手环通常会有触摸屏,用于显示信息和交互;
  • 按键或触控感应:提供一定的物理按键或触摸控制功能;
  • 语音助手:部分高端手环可能内置语音助手,支持语音控制。
1.1.6 蓝牙连接
  • 手机同步:通过蓝牙与智能手机同步数据,查看运动、健康数据,接收通知等。
  • 蓝牙低能耗 (BLE):为了延长电池使用寿命,智能手环通常会使用BLE协议来降低功耗。

1.2 硬件组成

要实现这些功能,智能手环通常需要以下硬件组件;

1.2.1 MCU/SoC
  • 功能:作为智能手环的大脑,处理各种传感器数据,控制其他硬件模块;
  • 推荐芯片:低功耗的微控制器(如STMicroelectronics STM32系列、Nordic Semiconductor nRF52系列、Qualcomm Snapdragon Wear系列)或专用的SoC(如高通骁龙Wear系列)。这些芯片支持BLE、低功耗设计,适合穿戴设备;
1.2.2 传感器模块
  • 心率监测:光电容积脉搏波传感器(PPG)。常用的芯片如Maxim IntegratedMAX30100/30102LandoEM7028AMSAS7050等;
  • 血氧监测:PPG传感器也用于血氧监测(SpO2)。如前所述的MAX30100EM7028也可用于血氧检测;
  • 温度/测量:用于检测环境的温度和湿度。常见的芯片有 Aosong ElectronicsAHT20/AHT21
  • 海拔测量:用于测量大气压。常见的芯片有SensirionSPL06Bosch SensortecBMP180
  • 运动跟踪:
    • 加速度计和陀螺仪:用于测量佩戴者的运动和姿势。常见的芯片有:InvenSenseMPU6050(6轴传感器),STMicroelectronicsLSM6DSOX(6轴传感器),Bosch SensortecBNO055(9轴传感器)等;
    • GPS模块:对于需要高精度位置追踪的手环,可以使用GPS芯片,如u-blox NEO-M8NMediaTek 的 MT3333
    • 压力传感器:例如Bosch SensortecBMP280,用于监测气压和压力水平。
1.2.3 显示屏
  • OLED/LCD显示屏:许多智能手环使用OLED显示屏,因为它们能提供清晰、节能的显示效果;
  • 屏幕控制芯片:例如,SSD1306控制器,用于驱动OLED显示器。
1.2.4 电池和充电管理
  • 锂电池:大多数智能手环使用小型锂电池,容量一般在100mAh500mAh之间,具体视续航需求而定;
  • 充电管理IC:如Texas InstrumentsBQ24195、南京拓微的TP4056M,用于电池充电和管理;
  • 低功耗设计:优化电池的续航,利用低功耗MCU、屏幕和传感器设计,以及高效的电源管理模块。
1.2.5 振动电机
  • 功能:用于振动提醒功能;
  • 推荐:使用小型的LRA(线性振动执行器)或ERM(偏心旋转质量振动执行器)。
1.2.6 蓝牙模块
  • 功能:支持蓝牙低能耗(BLE)协议,进行数据同步、通知提醒等功能;
  • 推荐芯片:如Nordic SemiconductornRF52840BroadcomBCM43438Keen High ElectronicsKT6368A
1.2.7 外壳与传感器窗口
  • 功能:提供坚固的外壳保护,同时确保传感器的有效工作(如心率传感器需要透光设计);
  • 材料:常用的外壳材料有塑料、铝合金、陶瓷等,传感器窗口通常使用透明的塑料或玻璃。

二、OV-Watch简介

OV-Watch项目制作的是一个基于STM32F411CUE6FreeRTOSLVGL的低成本的超多功能的STM32智能手环。

img

其实现了日历、计算器、秒表、NFC、蓝牙无线升级、与手机传信息、抬腕亮屏、心率检测、环境温湿度检测、指南针、海拔测量等功能。

  1. 电源部分:手环使用的是3.7V锂电池,通过TPS63020(升压-降压转换器)提供3V3电源,V2.2版本之后,充电口留了两个焊盘,用来接触磁吸充电口;
    • 特别注意,V2.0版本使用的无线充电,使用了芯片T3168,但是用无线充电的话,加上线圈和多的器件,体积就非常大了,同时还有散热问题;
  2. 蓝牙部分:
    • V2.2用的是HC-04(邮票孔封装);
    • V2.3版本改成了用国产芯片KT6328A
    • V2.4换成了KT6368A
  3. NFC部分:
    • V2.0版本的IC卡复制器模块介绍详见:https://oshwhub.com/no_chicken/ICka-fu-zhi-qi
    • V2.2版本为了精简减小体积,仅有UID卡,可以被外部读卡器读写。而在V2.0版本中,用的是RC522和一张UID卡组成的,可以自行复制外部IC卡,然后也可以被外部读卡器读写如下图所示:
img

2.1 系统组成

系统框图如下所示:

其中:

  • 主控使用STM32F411CEU6
  • 操作系统使用FreeRTOS
  • 图形库使用的LVGL
  • 传感器部分:手势识别使用6轴MPU6050
  • 心率血氧使用的是EM7028
  • 海拔测量用的气压计SPL06-001
  • 电子指南针使用LSM303DLHC
  • 蓝牙芯片换成了KT6368AV2.4版本),有SPP功能,支持无线升级。

2.2 软件框架

智能手环的软件架构如下所示:

img

三、电路原理图设计

电路原理图分为两部分,核心板和背板,我们首先放上完整的原理图:

注意:这里没有KT6368A电路原理图,这个下面我们单独介绍。

3.1 供电部分(TPS63020

供电部分采用TPS63020芯片;

BAT(H2位置)连接的是3.7V锂电池,作为TPS63020芯片VIN(1011)引脚的输入;

当我们长按SW2按键,二极管D4导通(压降0.5~0.7V),TPS_EN输出高电平,即TPS63020芯片(12引脚输入高电平),芯片使能,VOUT输出3.3V电压,STM32F411CEU6开始工作;

此外:

  • WEAK连接到了STM32F411CEU6PA4引脚,SW2按键按下,PA4为高电平,否则为低电平;
  • POWER_EN连接到了STM32F411CEU6PA3引脚;因此我们可以在STM32F411CEU6工作之后,通过PA3引脚输出高电平,二极管D5导通(压降0.5~0.7V),TPS_EN输出高电平,从而维持TPS63020芯片时钟处于使能状态。
3.1.1 功能介绍

供电部分使用了TPS63020TPS63020设备为由双电池或三电池碱性、镍镉或镍氢电池、单电池锂离子或锂聚合物电池、超级电容器或其他供电轨供电的产品提供电源解决方案;

  • 输入电压:1.8V-5.5V
  • 可调整的输出电压1.2V-5.5V
  • 输出电流:当输入电压大于2.5V时,输出电压为3.3V时,电流2A
  • 转换效率高:工作静态电流:25µA ,带模式选择的节能模式;
  • 平均电流模式buck-boost转换:模式之间的自动转换;
  • 安全可靠的操作特性:具有过热、过压保护,停机期间断开负载回路。

TPS63020的输入在1.8~5.5V,输出可固定,这就特别适合电池放电了,因为随着电池的放电,电压是会下降的,使用该芯片,就能够提高电池的效率,尽可能的榨干电池电量。

3.1.2 引脚介绍

TPS63020一共14个引脚:

  • EN使能引脚(12):启用输入(1启用,0禁用)不能为悬空状态
  • FB可调版本的电压反馈(3):必须连接到固定输出电压版本的VOUT
  • GND2):控制逻辑接地;
  • L189):电感器连接;
  • L267):电感器连接;
  • PG14):输出功率良好(1良好,0故障;漏极开路),可以保持打开状态;
  • PGND15):电源接地;
  • PS/SYNC13):启用/禁用省电模式(1禁用,0启用,同步时钟信号)不能为悬空状态;
  • VIN1011):输入电压;
  • VINA1):控制级电源电压;
  • VOUT45):buck-boost变换器输出。
3.1.3 Power save模式

这个芯片工作由两种模式:

  • 正常工作模式:该工作模式下,新芯片的工作频率比较高,所以带载能力强,可以最大到4A;
  • Power save模式:该芯片的工作频率会降低,带载能力降低,不超过100mA

正常工作模式下,这个芯片的待机电流能达到7~8mA,这个对于电池供电设备来说,等到切换到Power save模式下,该芯片的静态功耗可以降低到25uA左右(参考《TPS63020-电池升降压芯片及静态电流7~8mA原因》)。

Power save模式的切换,是通过拉低PS/SYNC引脚,置该引脚为低电平即可。该引脚如果悬空或者置高电平,芯片处于正常运行模式。

应用步骤:

CPU上电后,PS/SYNC引脚应置为高电平或悬空,此时芯片处于正常模式,CPU也处于正常功耗模式。

CPU完成主要功能后,即将进入低功耗模式(还未进入)前,设定PS/SYNC引脚为低电平,芯片进入Power save模式;

CPU进入低功耗模式。

CPU被唤醒,退出低功耗模式后,先不要进行主要功能,因为主要功能可能很耗电(大于100mA),需要先设定PS/SYNC引脚为高电平,使芯片退出Power save模式,进入正常模式。

CPU运行主要功能,运行完成后,再跳转到步骤②,以此类推, 循环执行。

不过如果你看我们这个电路图设计,你会发现PS/SYNC引脚直接被设置为了低电平,也就是说芯片工作在Power save模式。

3.1.4 输出电压计算

TPS63020输出电压由外部电阻分压器设置。电阻分压器必须连接在VOUTFBGND之间。反馈电压VFB500 mV标准值
,低压侧电阻器R13FBGND之间)必须保持在200k的范围内;

\[VOUT = (\frac{R_{12}}{R_{13}} + 1) \times VFB \]

由于R121MΩR13为v180KΩ,所以VOUT=3.3V,所以电路原理图中VOUT输出连接到3.3V

3.2 充电部分(TP4056M

充电部分使用TP4056M, 用于给标准3.7V锂电池充电, 输入为5V,接口通过过孔连接到Back的两个焊盘, 对应2.84mm磁吸线的两个触点, 一个+5V一个GND, 该芯片具体的外围电路设计可以详见手册;

VIN输入电压为5V,经过A7整流二极管,它的正向导通电压通常在0.7V左右,则到VBUS电压大概为4.3V.

VBUS连接到TP4056MVCC4)引脚,用于给该芯片供电。

右侧连接的两个发光二极管为充电状态指示灯;

  • CHRG7)连接的指示灯通常为红色,表示正处于充电状态;
  • STDBY6)连接的指示灯通常为绿色,表示充电完成。

BAT5)引脚为输出引脚,连接锂电池正极。

3.3 LCDP169H002-CT

核心板可以外接SPI通信的LCD屏;

这里我们将MCU侧的引脚列出来:

STM32F411CEU6 AFC01-S18FCA-00
PA15 TP_RST
PB4 TP_SDA
PB6 TP_SCL
PB7 LCD_RST
PB5 LCD_MOSI
PB3 LCD_CLK
PB8 LCD_CS
PB9 LCD_DC
PB0 LCD_BLK

比如这里可以外接P169H002-CTP电容触摸屏;

引脚定义如下:

需要注意的是:LCD引脚和电路原理图中的引脚顺序是反过来的。

3.4 EEPROMBL24C02F

BL24C02F提供2048比特串行电可擦写存储器,组成256个字节,每页16个字节,共16页,其采用I2C通信;

这里我们将MCU侧的引脚列出来:

STM32F411CEU6 BL24C02F
PA12 PROM_SCL
PA11 PROM_SDA

3.5 背板I2C总线

背板原理图上使用了大量的传感器模块,主要通过I2C总线与各个I2C传感器通信;

3.5.1 MPU6050

MPU6050是一个6轴姿态传感器(3轴加速度计和3轴陀螺仪传感器),可以测量芯片自身XYZ轴的加速度、角度参数,通过数据融合,可以得到姿态角。其在四轴飞行器中使用的较多,这里我们需要使用该传感器进行运动检测;

MPU6050同样采用的I2C通信;

STM32F411CEU6 MPU6050
PB12 MPU6050_INT
PB14 MPU6050_SCL
PB13 MPU6050_SDA
3.5.2 SPL06-001

SPL06-001是一款小型的数字压力传感器,分辨率可达0.06pa

SPL06-001同样采用的I2C通信;

STM32F411CEU6 SPL06-001
PB14 SPL_SCL
PB13 SPL_SDA
3.5.3 AHT21

AHT21是一款小型温湿度传感器;

AHT21同样采用的I2C通信;

STM32F411CEU6 AHT21
PB14 AHT_SCL
PB13 AHT_SDA
3.5.4 LSM303DLHC

LSM303DLHC是一款由意法半导体(STMicroelectronics)推出的三轴加速度计和三轴磁力计组合传感器。它可以同时测量加速度和地磁场,因此常用于运动追踪、导航、地理定位等应用。

LSM303DLHC同样采用的I2C通信;

STM32F411CEU6 LSM303DLHC
PB14 LSM_SCL
PB13 LSM_SDA
3.5.5 EM7028

EM7028是一款低功耗心率传感器,通过光学检测来监测心率。它包括16ADC、可调增益和分辨率,以及接口模块,包括心率传感器(HRS)和带有2个绿色LED的内部LED电流驱动器

EM7028同样采用的I2C通信;

STM32F411CEU6 EM7028
PB14 EM7028_SCL
PB13 EM7028_SDA
PB15 LED_EN

3.6 KT6368A

KT6368A芯片是一款支持蓝牙双模的纯数据芯片,蓝牙5.1版本。芯片的亮点在超小尺寸SOP8封装,性价高。以及简单明了的透传和串口AT控制功能。大大降低了嵌入蓝牙在其它产品的开发难度和成本同时支持SPPBLE 。但是只能任选其中一个协议使用。

KT6368A采用串口通信;

STM32F411CEU6 KT6368A
PA10(USART1_RX) BLE_TX
PA9(USART1_TX) BLE_RX
PA8 BLE_EN

3.7 看门狗

看门狗定时器(WDTWatch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始倒计数。

如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始倒计数。如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。

STM32F411CEU6芯片内部有自己的看门狗,不过这里片外看门狗专用芯片TPS3823

其中:

  • RST连接到了STM32F411CEU6的复位引脚;
  • WDI连接到了STM32F411CEU6PB2引脚;
  • WDOG_EN连接到了STM32F411CEU6PB1引脚;
3.7.1TPS3823

TPS3823一共有5个引脚,各个引脚功能如下:

  • GND:节点链接;
  • \(\overline{MR}\):手动复位输入。拉至低电平可强制复位。只要\(\overline{MR}\)为低电平,\(\overline{RESET}\)就会保持低电平,持续时间为\(\overline{MR}\)变为高电平后的超时周期。未使用时保持未连接或连接到VDD;
  • \(\overline{RESET}\):低电平有效复位输出;
  • VDD:电源电压;
  • WDI:看门狗计时器输入;
    • WDI引脚用于接收外部控制信号,告诉芯片当前系统处于正常工作状态。正常情况下,外部电路会定期向WDI引脚发送脉冲信号,以“喂狗”;
    • 如果WDI引脚在预定的时间窗口内(即看门狗定时器的计时周期)接收到脉冲信号,TPS3823会重置其计时器,保持系统处于正常状态。这样,芯片就不会触发复位操作;
    • 如果WDI引脚没有在预定时间内接收到有效的脉冲信号(即超时),TPS3823会认为系统可能出现故障或挂起,进而触发复位信号,使系统重新启动,避免系统进入不确定状态

TPS3823工作时序图如下:

在编写程序中,STM32F411CEU6要在300ms内不断地通过WDI口输出喂狗信号,才能保证系统正常工作。

3.7.2 BL1551

BL1551是一款单电源宽带(300MHz)快速单刀双掷模拟开关。在Vcc=5.0V条件下,导通电阻仅有2.7Ω。工作电压范围1.8V ~ 5.5V

具体可以参考《BL1551模拟开关,封装SC70-6》。

3.8 按键

核心板设计有两个按键;

其中KEY连接到STM32F411CEU6PA5引脚,按下为低电平。SW2在供电电路中使用,前面已经介绍过。

四、PCB打样焊接

4.1 PCB打样

既然要从头开始,那我首页我们就需要有一块PCB电路板,我们打开链接【智能手环OV-Watch】,找到PCB小节,然后点击【在编译器中打开】;点击【智能手环OV-Watch】项目,选择菜单栏【下单】中的【嘉立创-PCB/SMT】。

我这里仅仅是制作了十块板子,大概花费了我50大洋,耐心等待两到三天,就可以收到寄过来的PCB板子。

4.2 硬件材料准备

这里我们需要购买电路原理图中的电子元件,涉及到二极管、发光二极管、三极管、贴片电阻、贴片电容、各种芯片、按键、排针等;

第一张图片为核心板的BOM清单,第二张图为背板的BOM清单;这些元件可以直接从立创商城购买;

不过还有部分元件立创商场可能购买不到,或者价格过于昂贵,因此我还从淘宝购买了部分元件;

注意:充电管理芯片型号要选择TP4056MMSOP8SOP8的微型版本,尺寸更小),这里我购买成了TP4056SOP8)了。

除此之外,我们还需要从淘宝购买:

由于我买的材料数量都比较少,一套下来成本都100多块钱,属实有点小贵。

4.3 焊接

4.3.1 焊接方式

准备完材料之后就是焊接工作了,由于电路原理图中采用的元件都是比较小的,其中电阻电容均是0402型号,因此使用电洛铁焊接还是比较考验技术的,这里我采用了锡膏+加热台的焊接方式;

由于PCB上并没有标明每个元器件的位号,焊接的时候可以借助嘉立创EDA的【焊接辅助工具】这个功能;

可以轻易的查看每个元件的型号信息;

焊接时需要注意:

  • 锡膏熔点为183°,加热台温度设置为200°,加热3~5分钟即可;
  • PCB涂抹锡膏时,对于STM32TPS6020这种引脚比较密集的芯片,可以采用尖嘴镊子在同一侧引脚涂抹上锡膏;
    • 这里可以把镊子看做是笔,然后绘制一条细细的线即可(注意,这里一定要细,不然加热的时候可能部分引脚会沾到一块);
    • 在使用加热台加热的时候会自动融化,焊接到对应引脚上;
  • 注意二极管/发光二极管的方向,可以使用万用表测量(将万用表调到蜂鸣器档位),正极->负极压降一般为0.5~0.7V,如果反过来测量将是无穷大;
  • 注意芯片的方向,一般芯片的左上方都会有一个小圆点,需要和PCB上对应元件封装上的圆点对应上;
  • 如果使用加热台焊接后的芯片有引脚沾到一块,可以考虑使用电洛铁将其修正;或者使用热风枪将其拆下,重现涂上锡膏,使用热风枪焊接上;

焊接完成后,我们一定要记得使用万用表测量一下正负极是否出现短路,同时可以使用万用表蜂鸣声来判断一些芯片引脚是否焊接正确。

4.3.2 焊接效果

这里以核心板为例,焊接完之后的效果如下:

这里有几处没有焊接:

  • 由于我充电管理IC芯片TP4056M封装购买错了,所以左下角U4位置并没有焊接;
  • 左上角的4个引脚(H4位置)可以在调试阶段焊接一个1x4P的排针,并且程序SWD下载方式也是通过这四个引脚实现的;
  • 最上面一排1x9PH5)的和左下方1x2PH1)位置不用焊接,这两个位置是用来将核心板和背板连接在一块的;
  • 右下角的1x2PH2位置)是用来连接3.7V锂电池的;
  • 正下方FPC连接器(X2位置)用来连接LCD触摸屏;

五、烧录测试

板子焊接完成后,我们就需要给板子通上电,然后进行烧录测试。

5.1 准备阶段

5.1.1 SWD接线

在测试阶段,我们并不使用3.7V锂电池供电,我们直接给核心板左上角3.3V以及GND引脚接上3.3V电源。

此外我们需要通过SWD进行源码下载和调试,因因此需要将JLink的如下引脚与开发板对应引脚连接起来;

  • TCK连接到核心板左上角排针的CLK引脚;
  • TMS连接到核心板左上角排针的DIO引脚;
  • VTref连接到核心板左上角排针的3.3V;
  • GND连接到核心板左上角排针的GND
5.1.2 下载源码

我们直接从https://gitee.com/kingham/OV-Watch下载源码,并下载到本地;

git clone https://gitee.com/zyly2033/OV-Watch.git

这里我将下载的源码存放在G:\project\OV-Watch\OV-Watch目录,打开Firmware文件夹;

可以看到已经编译好的固件。

V2.4版本以后的手环的代码分为BootloaderAPP了,为的是方便用户戴在手上进行不用拆解的升级,BOOT区后面划分了一个Flag区,用于记录是否是完整的APP,这个位置是APP传输完成后才记录的,为的是保证程序完整性。

img

5.2 项目介绍

接着我们打开MDK 5,打开项目,项目位于G:\project\OV-Watch\OV-Watch\Software\OV_Watch\MDK-ARM目录;

目录结构如下:

├─Application/MDK-ARM               # 用于存放.s文件
├─Application/User/Core             # 用于存放CubeMX生成的初始化文件
│  │  main.c
│  │  gpio.c
│  │  ...
│
├─Application/User/System           # 用于存放自定义的delay.c sys.h等
│  │  delay.c
│  │  ...
│
├─Application/User/Tasks            # 用于存放任务线程的函数
│  │  user_TaskInit.c
│  │  user_HardwareInitTask.c
│  │  user_RunModeTasks.c
│  │  ...
│
├─Application/User/MidFunc          # 用于存放管理函数
│  │  StrCalculate.c
│  │  HWDataAccess.c
│  │  PageManager.c
│
├─Application/User/GUI_APP          # 用于存放用户的ui app
│  │  ui.c
│  │  ...
│
├─Application/User/GUI_FONT_IMG     # 用于存放字体和图片
│  │  ...
│
├─Drivers/CMSIS
│  │  ...
│
├─Drivers/User/BSP                  # 用于存放板载设备驱动
│  │  ...
│
├─Middleware/FreeRTOS               # FreeRTOS的底层
│  │  ...
│
├─Middleware/LVGL/GUI               # LVGL的底层
│  │  ...
│
└─Middleware/LVGL/GUI_Port          # 用于存放LVGL驱动
    ├─lv_port_disp.c
    ├─lv_port_indev.c
5.2.1 CubeMX框架

工程是用CubeMX生成的MDK工程,这里默认使用的AC5编译,这里默认大家已经能够熟练使用CubeMXHAL库了,HAL库淡化硬件层非常适合进行软件开发。

本次手环项目使用到的片上外设包括GPIOIICSPIUSARTTIMADCDMA。 具体的对PCB板上器件的驱动,例如LCD, EEPROM等,详见BSP

简述一下各个片上外设的用途:

  • DMA这里主要是配合SPISPI通信不通过CPU而是通过DMA直接发送,如果使用多线程,那么视觉上来讲,刷屏应该就会快一些,因为CPU可以去执行其它任务;
  • IIC主要用来跟背板各个传感器进行通信,传感器都挂在一个总线上的;
  • TIM主要是提供时基,另外一个就是给LCD调节背光;
  • ADC只接了一个电池的分压,进行电池电压采样,预估剩余电量;
  • USART接了蓝牙,方便进行IAP和与手机和电脑的助手通信。
5.2.2 板载驱动BSP

详见BSP文件夹中的代码,BSP很多很杂,不需要了解的同学可以先跳过,直接调用相关API函数即可。

简述一下部分BSP

  1. WDOG采用外置的原因是,想要做睡眠低功耗,那么使用MCU内部的看门狗关闭不了,只能一直唤醒喂狗,否则就要重启,那么这样就失去了睡眠的意义了;
  2. IIC使用的软件模拟的方式进行驱动,没有用硬件IIC,还是更推荐使用硬件IICIIC总线的定义如下,定义了GPIO的口和CLK使能函数,在各个设备中直接用iic_bus_t进行创建IIC即可,然后调用iic_hal.c中的API即可;
  3. key按键的驱动,GPIO设置有添加中断,这个是为了按键唤醒进入STOP模式的MCU
  4. EM7028心率,驱动中只写了对寄存器的读取,具体的心率算法和血氧算法没有放在BSP中;
  5. DataSave数据保存,为了方便保存手环设置等数据,自定义了EEPROM中的存储帧,详见代码;
  6. IMUdmp库中的init函数是改过的,还有MP6050.c,有比较多低功耗相关的,建议直接拿去用,不需要再改了。关于MPU6050记步的问题,难点主要在实现低功耗记步,它的内部是有一个寄存器存储步数的,应该MPU6050内部是有记步算法的,不需要用户在外部再自己设计记步算法了。

5.3 代码调试

5.3.1 代码修改

为了方便调试,只调试APP,不烧录BootLoader,需要将MDK工程中的设置中,ROM地址由0x800C000改为为0x08000000

img

代码中main.c的地址偏移设置为0x00000000U,当然设置为0x08000000U也是同样的。

// SCB->VTOR = 0x0000C000U;
SCB->VTOR = 0x00000000U;
5.3.2 代码下载

MDK工程设置完,代码改完后编译即可进行代码的下载。由于开发板只提供了SWD下载方式,因此我们可以参考《STM32F103简介SWD下载小节内容,将编译后的二进制文件烧录到Flash

下载如果遇到如下错误:

可以尝试修改Options for Target ‘OV_Watch’—> Debug —> Settings—> Debug ,将下载最大速度调整为200kHz

注意:如果检测不到SW Deviice,可以尝试点击Auto Clk

再次尝试下载可以了;

烧录完成后如果硬件没有问题,是可以点亮LCD的,效果如下:

5.3.3 代码调试

代码调试很简单,点击菜单栏的Start/Stop Debug Session按钮;

如果点击调试出现如下错误:

这里我将锂电池供电接到H2位置,就不再出现这个错误了(不过我个人感觉和这个没有多大关系);

5.4 蓝牙升级

如果你想调试完功能后,继续给你的成品手环使用,即使用BootLoader给你的手环进行下载,则需要将工程中的地址偏移改回0x0800C000,然后编译得到的.bin文件按照下面步骤进行APP升级。

5.4.1 烧录BootLoader程序

Bootloader源码位于G:\project\OV-Watch\OV-Watch\Software\IAP_F411\MDK-ARM,直接编译烧录BootLoader程序。

5.4.2 电脑设置

按住KEY1给手环上电进入BootLoader的升级模式,电脑找到手表的蓝牙进行配对, 一般来讲蓝牙是叫KT6368A-SPP之类的。

具体的看自己情况, 我这里是叫KT6368A-SPP-2.1,配对成功后。

然后找到更多蓝牙设置,找到蓝牙设备对应的传出端口号,我这里是COM6;

如果没有串口端口,可以自行添加:

5.4.3 下载文件

打开SecureCRT,并连接到蓝牙对应的端口, 然后会出现以下界面,没出现就按回车Enter几下;

按照提示进行数字输入即可, 输入1即可进行APP文件传输, 此时电脑一直会收到CCCCCC..., 此时就是在等待你用Ymodem协议发文件;

选择send YmodemG:\project\OV-Watch\OV-Watch\Firmware\OV_Watch_V2_4_3.bin这个文件传进去即可;

过程比较慢, 耐心等待升级即可;

最后传输完毕, 输入3即可执行APP,等候开开机,以后每当APP有更新后,就算装进外壳了,也可以直接使用蓝牙无线升级。

参考文章

[1] 立创硬件开源

[2] 油炸鸡开源硬件手册网站

[3] github仓库: https://github.com/No-Chicken/OV-Watch

[4] gitee仓库: https://gitee.com/kingham/OV-Watch

[5] STM32下载程序报错cannot enter debug mode··· Error: Flash Download failed - Target DLL has been cancelled

[6] 电子器件系列七:看门狗

posted @ 2024-11-30 19:09  大奥特曼打小怪兽  阅读(1166)  评论(0)    收藏  举报
如果有任何技术小问题,欢迎大家交流沟通,共同进步