本文转载自:
作者:谷动谷力,AB32VG1开发】基于RT-Thread 中科蓝讯AB32VG1 BLE开发例程讲解
中科蓝讯最近出的SDK(bluetrum_sdk) V1.1.0,支持了BLE开发,目前官方还没有正式文档,我来摸索一下吧
安装最近SDK
操作步骤详细请参阅: 基于RT-Thread的AB32VG1开发环境搭建
![poYBAGGuFZ6ALDtCAAK3VpadgEM069.png](http://file.elecfans.com/web2/M00/23/D8/poYBAGGuFZ6ALDtCAAK3VpadgEM069.png)
选择中科蓝讯AB32VG1开发板最新SDK(bluetrum_sdk) 1.1.0安装
建RT-Thread工程
操作步骤详细请参阅: 基于RT-Thread的AB32VG1开发环境搭建
注意选择最新SDK 1.1.0
![poYBAGGuFc6AeL5oAANZyV66ddU436.png](http://file.elecfans.com/web2/M00/23/D8/poYBAGGuFc6AeL5oAANZyV66ddU436.png)
配置工程
操作步骤详细请参阅: 基于RT-Thread的AB32VG1开发环境搭建
配置详情如下:
![poYBAGGuFeuAQoGdAAF43GqPo6Q408.png](http://file.elecfans.com/web2/M00/23/D8/poYBAGGuFeuAQoGdAAF43GqPo6Q408.png)
开启:
复制宏: [SOC_AB32VG1]
宏: [PKG_USING_BLUETRUM_NIMBLE]
宏: [BSP_USING_TIM](这后面加的,因为出现这个了定时报告数据时运行错误:(rt_object_get_type(&timer->parent) == RT_Object_Class_Timer) assertion failed at function:rt_timer_stop, line number:502 )我以为加上TIMER模块,就加了,但是还是没解决。
配置后,保存会出现错误:local variable 'get_git_root' referenced before assignment Operation failed.这里不管它,编译时看看具体是哪里同, 我们再修改。
![poYBAGGuFjmAJisiAAEOci3nUzI499.png](http://file.elecfans.com/web2/M00/23/D8/poYBAGGuFjmAJisiAAEOci3nUzI499.png)
修改代码
首先熟悉一下BLE_SDK代码目录:
![pYYBAGGuFkyAVHt4AADSzV2P1zk270.png](http://file.elecfans.com/web2/M00/23/DE/pYYBAGGuFkyAVHt4AADSzV2P1zk270.png)
修改mac_addr
工程目录下:
复制packages\bluetrum_sdk-latest\bluetrum_nimble\porting\npl\rtthread\src\ble_platform.c
![pYYBAGGuFqCAdcXqAAI-ImxrZGE127.png](http://file.elecfans.com/web2/M00/23/DF/pYYBAGGuFqCAdcXqAAI-ImxrZGE127.png)
我修改如下:
复制void bt_get_local_bd_addr(uint8_t *addr)
{
uint8_t addr_table[6] = {0x41, 0x42, 0x18, 0x58, 0x68, 0x88}; //mac_addr是6bytes, SDK代码里只写了5个数据
memcpy(addr, addr_table, 6);
}
复制注意:mac_addr是6bytes, SDK代码里只写了5个数据,这是疏漏还是有意为之
修改BLE_name(名字)
工程目录下:
复制\packages\bluetrum_sdk-latest\bluetrum_nimble\apps\blehr\src\blehr.c
![pYYBAGGuFs6AetRpAAEfpKAgvm8475.png](http://file.elecfans.com/web2/M00/23/DF/pYYBAGGuFs6AetRpAAEfpKAgvm8475.png)
我修改如下:
复制static const char *device_name = "Silicon_blehr_sensor";
复制注意:不能是中文,中文会找不到设备
修改服务及设备信息
工程目录下:
packages\bluetrum_sdk-latest\bluetrum_nimble\appsblehrsrc
![pYYBAGGuFv-Ab9HBAANKkyju3eg538.png](http://file.elecfans.com/web2/M00/23/DF/pYYBAGGuFv-Ab9HBAANKkyju3eg538.png)
我修改如下:
复制static const char *manuf_name = "谷动谷力"; //Sunshine Silicon";可以中文,但长度限制了,没有找到哪里限制了
static const char *model_num = "SunSilicon HR Sensor";
复制static const struct ble_gatt_svc_def gatt_svr_svcs[] = { { /* Service: Heart-rate */ .type = BLE_GATT_SVC_TYPE_PRIMARY, .uuid = BLE_UUID16_DECLARE(GATT_HRS_UUID), .characteristics = (struct ble_gatt_chr_def[]) { { /* Characteristic: Heart-rate measurement */ .uuid = BLE_UUID16_DECLARE(GATT_HRS_MEASUREMENT_UUID), .access_cb = gatt_svr_chr_access_heart_rate, .val_handle = &hrs_hrm_handle, .flags = BLE_GATT_CHR_F_NOTIFY, }, { /* Characteristic: Body sensor location */ .uuid = BLE_UUID16_DECLARE(GATT_HRS_BODY_SENSOR_LOC_UUID), .access_cb = gatt_svr_chr_access_heart_rate, .flags = BLE_GATT_CHR_F_READ, }, { 0, /* No more characteristics in this service */ }, } },
{ /* Service: Device Information */ .type = BLE_GATT_SVC_TYPE_PRIMARY, .uuid = BLE_UUID16_DECLARE(GATT_DEVICE_INFO_UUID), .characteristics = (struct ble_gatt_chr_def[]) { { /* Characteristic: * Manufacturer name */ .uuid = BLE_UUID16_DECLARE(GATT_MANUFACTURER_NAME_UUID), .access_cb = gatt_svr_chr_access_device_info, .flags = BLE_GATT_CHR_F_READ, }, { /* Characteristic: Model number string */ .uuid = BLE_UUID16_DECLARE(GATT_MODEL_NUMBER_UUID), .access_cb = gatt_svr_chr_access_device_info, .flags = BLE_GATT_CHR_F_READ, }, { 0, /* No more characteristics in this service */ }, } }, { 0, /* No more services */ },
};
修改服务属性
![AB32VG1_ble_Svr.png](https://file.elecfans.com//web2/M00/23/50/pYYBAGGrgyqADNGQAAByeEy9s5Y879.png)
这里服务,我们没做修改,保存默认。
编译
编译工程:Ctrl+B,会出错, 如下:
复制In file included from :
E:\RT-ThreadWorkspace\AB32_BLE_Demo\rtconfig_preinc.h:8:9: error: no macro name given in #define directive
8 | #define
| ^
In file included from :
E:\RT-ThreadWorkspace\AB32_BLE_Demo\rtconfig_preinc.h:8:9: error: no macro name given in #define directive
8 | #define
| ^
make: *** [rt-thread/src/subdir.mk:57: rt-thread/src/device.o] Error 1
make: *** Waiting for unfinished jobs....
In file included from :
E:\RT-ThreadWorkspace\AB32_BLE_Demo\rtconfig_preinc.h:8:9: error: no macro name given in #define directive
8 | #define
| ^
In file included from :
E:\RT-ThreadWorkspace\AB32_BLE_Demo\rtconfig_preinc.h:8:9: error: no macro name given in #define directive
8 | #define
| ^
make: *** [rt-thread/src/subdir.mk:57: rt-thread/src/clock.o] Error 1
make: *** [rt-thread/src/subdir.mk:57: rt-thread/src/components.o] Error 1
make: *** [rt-thread/src/subdir.mk:57: rt-thread/src/idle.o] Error 1
"make -j4 all2" terminated with exit code 2. Build might be incomplete.
14:29:13 Build Failed. 9 errors, 0 warnings. (took 1s.464ms)
双击出错提示,定位到出错的地方,#define后面是空的,删除这个#define即可
标题重新编译
保存修改内容: ctrl+s, 编译:ctrl+b
![poYBAGGuF0iAXIJQAAPtmZoE0KE579.png](http://file.elecfans.com/web2/M00/23/D8/poYBAGGuF0iAXIJQAAPtmZoE0KE579.png)
编译成功
调试
将编译好的,目标文件:rtthread.elf,烧录到中科蓝讯AB32VG1 BLE开发板,操作步骤详细请参阅: 基于RT-Thread的AB32VG1开发环境搭建
![pYYBAGGuG_WAN1A_AAIYWxLBi1I930.png](http://file.elecfans.com/web2/M00/23/E0/pYYBAGGuG_WAN1A_AAIYWxLBi1I930.png)
手机打开蓝牙
![poYBAGGuHA-AG-9yAAI7v2ez_2A292.png](http://file.elecfans.com/web2/M00/23/D9/poYBAGGuHA-AG-9yAAI7v2ez_2A292.png)
手机打开蓝牙BLE调试助手
![AB32_BLE_debug_phone_openBLEdbg.JPG](https://file.elecfans.com//web2/M00/23/49/poYBAGGrgzKAcGTuAAQri2esjoM516.jpg)
连接BLE设备
扫描到与我们代码设置一样BLE设备名字,说明代码修改正确.连接与我们代码设置一样BLE设备名字.
![AB32_BLE_debug_phone_conect_bleg.JPG](https://file.elecfans.com//web2/M00/23/50/pYYBAGGrgzSAVjm-AAJcgoaje1c736.jpg)
设备相关数据服务列表
![AB32_BLE_debug_blereportsrv.JPG](https://file.elecfans.com//web2/M00/23/4A/poYBAGGrgzaAHsk2AAGESrkq_DU164.jpg)
获取BLE设备数据--制造商信息
![AB32_BLE_debug_blerd.JPG](https://file.elecfans.com//web2/M00/23/50/pYYBAGGrgzmATMdqAAGqIm9BUY8560.jpg)
点"读取"即可,这与我们代码设置一样,说明代码修改正确
![AB32_BLE_debug_blereport.JPG](https://file.elecfans.com//web2/M00/23/4A/poYBAGGrgzuAIdx5AAFkdRFoZaY944.jpg)
获取BLE设备数据--设备型号信息
点"读取"即可,这与我们代码设置一样,说明代码修改正确
![AB32_BLE_debug_blerdnum.JPG](https://file.elecfans.com//web2/M00/23/50/pYYBAGGrgz2AAtzxAAHAjDdISGA477.jpg)
读取心率相关数据
![AB32_BLE_debug_blerdhr01.JPG](https://file.elecfans.com//web2/M00/23/4A/poYBAGGrgz-AcLeDAAKLyczvcRE158.jpg)
心率数据自动数据通知上报
![AB32_BLE_debug_blerdhr01.JPG](https://file.elecfans.com//web2/M00/23/4A/poYBAGGrgz-AcLeDAAKLyczvcRE158.jpg)
![AB32_BLE_debug_blerdhr02.JPG](https://file.elecfans.com//web2/M00/23/4A/poYBAGGrg0GAWsc1AAJLbJAd_28159.jpg)
![AB32VG1_debug_ble_err.png](https://file.elecfans.com//web2/M00/23/50/pYYBAGGrg0KAbFtbAAD_AeBWiMc886.png)
![AB32VG1_debug_ble_err02.png](https://file.elecfans.com//web2/M00/23/4A/poYBAGGrg0KAYAM2AAB6NB6lIho960.png)
这个数据点代码有BUG,不定什么时候,报错,每次错误还不一样, 这个还得官方分析一下.
遗留问题
1) 定时上报数据点代码有BUG,不定什么时候,报错,每次错误还不一样, 这个还得官方分析一下.
2)现在只有Read(BLE上报数据)功能,没有write(APP->BLE下达数据)功能,这个后面移植一下
3)连接现有通用平台功能, 如微信涂鸦天猫精灵.....等等
4)mac_addr是6bytes, 代码里只写了5个数据,这是疏漏还是有意为之
5)制造名长度限制了,没有找到哪里限制了,是不是上报告数据长度限制了,在代码哪里呢
上面遗留问题,还请专家帮忙解决一下,我能力有限.
总结
用RT-Thread基于中科蓝讯AB32VG1 BLE开发快捷方便.做一个只要官方有的驱动及软件,相关方便快捷,没有话自己移植的话,还是比较复杂.