疯壳·开发套件系列 版权所有,盗版必究
官网地址:https://www.fengke.club 淘宝店:http://shop115904315.taobao.com 官方 QQ 群:193836402
官网地址:https://www.fengke.club/GeekMart/su_fkIjRS6Sj.jsp
配套资料:https://www.fengke.club/GeekMart/su_fkZyGYgrp.jsp
配套视频:https://www.fengke.club/GeekMart/su_fTSgUL3y3.jsp
购买地址:https://www.fengke.club/GeekMart/su_fkIjRS6Sj.jsp
http://shop115904315.taobao.com/
QQ 群:193836402
整机代码
1 相关简介
本节,我们将融合前面的蓝牙收发、三轴记步、电量检测、外部 Flash 读写、
心率检测和 Led 屏幕显示,完成手环的制作。
以上各个部分可以参考前面的章节,这里还补充一点,DA14580 的中断。
DA14580 内 部 有 嵌 套 中 断 向 量 控 制 器 ( NVIC,Nested Vectored Interrupt
Controller),支持 24 个中断,能够中断配置与处理异常代码。当发生一个中断请
求时,自动执行对应的中断函数,不需要软件确定异常向量。中断可以有 4 个不
同的可编程的优先级,NVIC 自动处理嵌套中断。对于安全关键系统,又不可屏
蔽中断(NMI,Non maskable interrupt)输入。
DA14580 内部还有一个键盘控制器,可以用于延时 GPIO 信号进入的时间。
可以检测所有的 I/O 口的电平变化。当监测信号时,可以产生中断(KEYBR_IRQ)。
同时,另外有 5 个中断(GPIOn_IRQ)可以被 GPIO 口触发。
2 硬件设计
关于硬件,这里只提及 DA14580 最小系统以及手环中的按键部分,其他部分
请参考前面章节的硬件设计部分。
最小系统如下图所示,其中的 V_BLE 采用的是 3.3v。
疯壳·开发套件系列 版权所有,盗版必究
官网地址:https://www.fengke.club 淘宝店:http://shop115904315.taobao.com 官方 QQ 群:193836402
首先,看一下我们手环的整个软件主函数流程。
Y
N
N Y
Y
N
Y
N
代码运行后,首先进入初始化,初始化系统时钟、外设和蓝牙。除此之外,
还开启了定时中断和 GPIO 中断。
我们的定时中断每 10ms 触发一次,用于 ADC 定时采集心率数据。另外,由
于一些原因,主函数中的步数读取、电量检测、心率检测、屏幕显示并不是每一
次循环都执行一次。这里的定时中断也作为一个计时功能,步数 20 秒更新一次,
心率模块 1 分钟打开一次,亮屏无操作,5 秒熄灭屏幕。
开始
初始化
读取三轴
电量检测
心率检测
屏幕显示
蓝牙收发
存储步数
存储心率
疯壳·开发套件系列 版权所有,盗版必究
官网地址:https://www.fengke.club 淘宝店:http://shop115904315.taobao.com 官方 QQ 群:193836402
这里的 GPIO 中断主要是用来切换屏幕显示页面。
(1)完成系统初始化之后,要配置中断引脚。
GPIO_ConfigurePin(BUTTON_PORT, BUTTON_PIN1, INPUT, PID_GPIO, false);
(2)进行中断初始化。
void my_int_init(void)
{
//注册 GPIO 中断,及回调函数
GPIO_RegisterCallback(GPIO0_IRQn, my_int_button1_handler);
//使能 GPIO 中断寄存器
GPIO_EnableIRQ( BUTTON_PORT, BUTTON_PIN1, GPIO0_IRQn, 1, 1, 10 );
}
(3)编写回调函数。
void my_int_button1_handler(void)
{
Touch_release =1;
}
从 GPIO 的中断回调函数中可以看出,每次中断只是把变量 Touch_release 置
1,而在定时中断的回调函数中,判断变量 Touch_release 的值,从而确定我们是
长时间按键,还是短时间按键,来完成相应的处理。
关于蓝牙收发部分,我们在蓝牙收发章节的基础上进行了修改,通过手机软
件 Wolverine BLE 发送 step 获取步数、发送 cal 获取卡路里、发送 heart 获取心率
值。下面是函数
static int gattc_write_cmd_ind_handler(ke_msg_id_t const msgid, struct
gattc_write_cmd_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const
src_id) 的部分代码。
switch(att_idx)
{
case CUST1_IDX_INDICATEABLE_VAL:
attmdb_att_set_value(param->handle, param->length, (uint8_t*)&(param->value[0]));
memcpy(value_buf, &(param->value),param->length);