软件资源如下:
结合上述使用到的硬件资源,下面我们着重介绍软件实现流程以及相关配置代码。由于本应用方案
ble蓝牙芯片与APP建立连接过程中需要应用到配对的功能,利用蓝牙库的接口函数可以实现,这里将配对秘钥设置为“123456”,在连接时候需要设置正确才能配对成功并且连接上;控制DC马达的功能引脚全都配成推挽输出模式,直接连到驱动IC上去,通过改变高低电平组合来控制电机的正反转和启停;另外再对测试和模拟功能的引脚进行配置,从而更为直观地对应用效果的观测和验证,且使能看门狗复位功能来保证蓝牙服务的稳定性能;由于方案应用电池供电对低功耗的需要,本方案低功耗采用STOP模式。
以下为主函数初始化配置内容,主要将所有的外设资源和蓝牙协议栈初始化,并且以中断服务程序的方式运行蓝牙,主函数的循环中主要实现的功能为判断是否进入低功耗模式,并且唤醒后根据接收到的蓝牙数据对DC马达进行不同的操作,代码如下:
下面简单介绍一下蓝牙低功耗和DC马达操作相关的几个函数:
//初始化DC马达控制引脚PD2、PD3,并且全部置为低电平
void MOTOR_Init(void);//停止DC马达的转动
static void MOTOR_Stop(void);//根据不同方向参数去控制DC马达运转
static void MOTOR_Run(unsigned char direction);
在MOTOR_Proc()处理函数中针对蓝牙接收到的密码数据进行解析,如果与默认设置的4位0-9数字密码完全匹配上则操作解锁,将DC马达按照设定方向控制运转,为了简易验证,模拟一个信号表示解锁成功,这里是通过采集指定IO引脚PA1的输入来实现,采集到输入为高电平那么停止DC马达转动,且清零锁定标志位。以下为代码实现内容:
我们在gatt_user_send_notify_data_callback函数中给手机发送数据,该函数属于回调函数,协议栈会在系统允许的时候(异步)回调本函数,该函数被用于蓝牙模块端主动发送是否解锁状态信息给手机APP,函数内部不得增加阻塞代码。详细实现代码如下:
//蓝牙连接成功后协议在空闲的时候会调用本回调函数
void gatt_user_send_notify_data_callback(void)
{
static u8 LockFlagBak = 1;
if (LockFlagBak != LockFlag)
{
LockFlagBak = LockFlag;//LockFlag标志位会在MOTOR_Proc()中清零和置位
sconn_notifydata(&LockFlagBak,1);
}
}
蓝牙协议会周期性回调本UsrProcCallback()函数,无论是在广播状态还是连接状态,在该函数中可以做运行和低功耗模式切换的超时计数,给IrqMcuGotoSleepAndWakeup()来处理是否进入低功耗模式,并且针对获取到的是否连接信息用LED指示灯做不同的状态显示。详细实现代码如下:
//蓝牙协议会周期性回调本函数
void UsrProcCallback(void)
{
static unsigned char led_flash = 0;
IWDG_ReloadCounter();
StandbyTimeout ++;
if(gConnectedFlag){ //连接成功
StandbyTimeout = 0;
LED_ONOFF(1);
}else{
led_flash ++;
LED_ONOFF(!(led_flash%10)); //蓝牙未连接,指示灯快闪
}
}
除了上述关键的蓝牙数据发送函数外,下面再简单介绍一些与蓝牙相关的特征值定义,在const BLE_CHAR AttCharList[] 中定义了本案中的两个特征值:
{TYPE_CHAR,0x0011,{ATT_CHAR_PROP_W_NORSP,0x12,0,0xf1,0xff}, UUID16_FORMAT},//解锁命令
{TYPE_CHAR,0x0013,{ATT_CHAR_PROP_RD|ATT_CHAR_PROP_NTF,0x14,0,0xf2,0xff}, UUID16_FORMAT},//锁体状态
在void att_server_rdByGrType( u8 pdu_type, u8 attOpcode, u16 st_hd, u16 end_hd, u16 att_type )中实现了自定义特征值服务声明;
在void ser_write_rsp()中实现对手机APP发送的蓝牙数据接收和存储:
if (StartEncryption)
{
if (valueLen_w < 9)//对蓝牙数据进行解析和存储
{
Password_wr[0] = valueLen_w;
memcpy(&Password_wr[1], attValue, valueLen_w);
}
}else{ //无效数据,不保存
Password_wr[0] = 0;
}
在void server_rd_rsp(u8 attOpcode, u16 attHandle, u8 pdu_type)中实现把锁体状态回复给手机APP:
att_server_rd( pdu_type, attOpcode, attHandle, &LockFlag, 1); //将LockFlag 标志位返回给手机APP
软件资源如下:
结合上述使用到的硬件资源,下面我们着重介绍软件实现流程以及相关配置代码。由于本应用方案
ble蓝牙芯片与APP建立连接过程中需要应用到配对的功能,利用蓝牙库的接口函数可以实现,这里将配对秘钥设置为“123456”,在连接时候需要设置正确才能配对成功并且连接上;控制DC马达的功能引脚全都配成推挽输出模式,直接连到驱动IC上去,通过改变高低电平组合来控制电机的正反转和启停;另外再对测试和模拟功能的引脚进行配置,从而更为直观地对应用效果的观测和验证,且使能看门狗复位功能来保证蓝牙服务的稳定性能;由于方案应用电池供电对低功耗的需要,本方案低功耗采用STOP模式。
以下为主函数初始化配置内容,主要将所有的外设资源和蓝牙协议栈初始化,并且以中断服务程序的方式运行蓝牙,主函数的循环中主要实现的功能为判断是否进入低功耗模式,并且唤醒后根据接收到的蓝牙数据对DC马达进行不同的操作,代码如下:
下面简单介绍一下蓝牙低功耗和DC马达操作相关的几个函数:
//初始化DC马达控制引脚PD2、PD3,并且全部置为低电平
void MOTOR_Init(void);//停止DC马达的转动
static void MOTOR_Stop(void);//根据不同方向参数去控制DC马达运转
static void MOTOR_Run(unsigned char direction);
在MOTOR_Proc()处理函数中针对蓝牙接收到的密码数据进行解析,如果与默认设置的4位0-9数字密码完全匹配上则操作解锁,将DC马达按照设定方向控制运转,为了简易验证,模拟一个信号表示解锁成功,这里是通过采集指定IO引脚PA1的输入来实现,采集到输入为高电平那么停止DC马达转动,且清零锁定标志位。以下为代码实现内容:
我们在gatt_user_send_notify_data_callback函数中给手机发送数据,该函数属于回调函数,协议栈会在系统允许的时候(异步)回调本函数,该函数被用于蓝牙模块端主动发送是否解锁状态信息给手机APP,函数内部不得增加阻塞代码。详细实现代码如下:
//蓝牙连接成功后协议在空闲的时候会调用本回调函数
void gatt_user_send_notify_data_callback(void)
{
static u8 LockFlagBak = 1;
if (LockFlagBak != LockFlag)
{
LockFlagBak = LockFlag;//LockFlag标志位会在MOTOR_Proc()中清零和置位
sconn_notifydata(&LockFlagBak,1);
}
}
蓝牙协议会周期性回调本UsrProcCallback()函数,无论是在广播状态还是连接状态,在该函数中可以做运行和低功耗模式切换的超时计数,给IrqMcuGotoSleepAndWakeup()来处理是否进入低功耗模式,并且针对获取到的是否连接信息用LED指示灯做不同的状态显示。详细实现代码如下:
//蓝牙协议会周期性回调本函数
void UsrProcCallback(void)
{
static unsigned char led_flash = 0;
IWDG_ReloadCounter();
StandbyTimeout ++;
if(gConnectedFlag){ //连接成功
StandbyTimeout = 0;
LED_ONOFF(1);
}else{
led_flash ++;
LED_ONOFF(!(led_flash%10)); //蓝牙未连接,指示灯快闪
}
}
除了上述关键的蓝牙数据发送函数外,下面再简单介绍一些与蓝牙相关的特征值定义,在const BLE_CHAR AttCharList[] 中定义了本案中的两个特征值:
{TYPE_CHAR,0x0011,{ATT_CHAR_PROP_W_NORSP,0x12,0,0xf1,0xff}, UUID16_FORMAT},//解锁命令
{TYPE_CHAR,0x0013,{ATT_CHAR_PROP_RD|ATT_CHAR_PROP_NTF,0x14,0,0xf2,0xff}, UUID16_FORMAT},//锁体状态
在void att_server_rdByGrType( u8 pdu_type, u8 attOpcode, u16 st_hd, u16 end_hd, u16 att_type )中实现了自定义特征值服务声明;
在void ser_write_rsp()中实现对手机APP发送的蓝牙数据接收和存储:
if (StartEncryption)
{
if (valueLen_w < 9)//对蓝牙数据进行解析和存储
{
Password_wr[0] = valueLen_w;
memcpy(&Password_wr[1], attValue, valueLen_w);
}
}else{ //无效数据,不保存
Password_wr[0] = 0;
}
在void server_rd_rsp(u8 attOpcode, u16 attHandle, u8 pdu_type)中实现把锁体状态回复给手机APP:
att_server_rd( pdu_type, attOpcode, attHandle, &LockFlag, 1); //将LockFlag 标志位返回给手机APP
举报