低功耗精准定位开发板BU03-Kit ——【软件篇】
一、硬件介绍
硬件功能、UWB功能介绍等,详见【硬件篇】
二、开发方式
1、AT指令
【AT指令表详见】
在出厂固件下,使用相关AT指令,能快速上手使用。可以进行算法选择、距离、角度测量配置等
(1)用数据线连接至开发板的TTL口,并打开串口助手连接
(2)连接后,使用指令 AT
进行测试,若返回 OK
,即代表AT指令处理成功

主要相关指令:
保存配置:AT+SAVE
恢复出厂模式:AT+RESTORE
获取配置信息:AT+GETCFG
(getcfg ID:65535, Role:0, CH:1, Rate:1)
算法切换指令:AT+SETUWBMODE=X
算法选择 X=0:TWR 1:PDOA)
配置完需执行保存配置 AT+SAVE指令
设置配置信息:AT+SETCFG=X1,X2,X3,1
X1: 设备ID(0~10)
X2:设备角色(0:标签 1:基站)
X3:设备信道(0:信道 9 1:信道 5)
1:(设备速率6.8M) 【目前只支持6.8M】
配置完需执行保存配置AT+SAVE指令
流水灯测试指令
AT+TESTLED=X
开始 / 停止开发板LED(流水灯)测试
X:1:开始测试LED 0:停止测试LED
注:执行AT+SETCFG配置设备信息前使用
获取加速度传感器数据
AT+GETSENSOR
获取加速度传感器数据 (BU03模组支持,BU04模组硬件不支持)
acc_x:80.000000 acc_y:960.000000 acc_z:144.000000 angle: 81.493958
使用串口助手的定时发送功能,此时再移动开发板的位置,即可获得此时开发板传感器的实时数据

TWR算法指令
TWR测距
(1)用数据线连接至A开发板的TTL口,使用AT指令 AT+SETUWBMODE=0
AT+SETCFG=0,1,1,1
以及 AT+SAVE
配置为**“基站”**
(2)用数据线连接至B开发板的TTL口,使用AT指令 AT+SETUWBMODE=0
AT+SETCFG=0,0,1,1
以及 AT+SAVE
配置为**“标签**”
此时,“基站”开发板的OLED屏幕将会显示,当前**“标签”与“基站”之间的距离**
也可以在“基站”上使用 AT+DISTANCE
指令,显示距离

专用指令
获取设置的相关系数参数
AT+GETDEV
(getdev cap:10 anndelay:16336, kalman_enable:1, kalman_Q:0.018, kalman_R:0.642, para_a:1.0142, para_b:-173.75, pos_enable:0, pos_dimen:0)
设置设备的系数
AT+SETDEV=X1,X2,X3,X4,X5,X6,X7,X8,X9
X1:标签容量(标签刷新速率)
X2:天线延迟参数
X3:是否卡尔曼滤波使能位
X4:卡尔曼滤波参数 Q
X5:卡尔曼滤波参数 R
X6:校正参数 a
X7:校正参数 b
X8:是否定位使能位
X9:定位维度设置
配置完需执行保存配置AT+SAVE指令
PDOA算法指令
PDOA测距 / 角度
(1)用数据线连接至A开发板的TTL口,使用AT指令 AT+SETUWBMODE=1
AT+SETCFG=0,1,1,1
以及 AT+SAVE
配置为**“基站”**
此时继续观察“基站”TTL口,将会打印出一串标签 ID,使用AT指令 AT+ADDTAG=267F1313,8834,1,64,0
AT+SAVE
进行绑定。

(2)用数据线连接至B开发板的TTL口,使用AT指令 AT+SETUWBMODE=1
AT+SETCFG=0,0,1,1
以及 AT+SAVE
配置为**“标签”**
此时,“基站”OLED屏幕显示与标签的距离D 和 角度A
专用指令
以下指令,仅适用与“基站”:
AT+GETDLIST
获取 [发现列表]
AT+GETKLIST
获取 [配对列表]
AT+ADDTAG
增加标签到 [配对列表]
(AT+ADDTAG=267F1313,8834,1,64,0)
AT+DELTAG
从 [配对列表] 删除标签、
更多指令【AT指令表详见】
2、二次开发SDK
Github地址
Gitee地址
此SDK只适用于安信可BU03或BU04系列模组或开发板
2.1、开发环境
(1)此开发板的主控MCU为STM32系列,因此可以使用 Keil 开发,SDK文件夹下的README.md有相关的配置使用方法
(2)打开下载好的SKD文件夹,在\Projects\USER目录下面找到Project.uvprojx文件双击打开工程
SDK工程目录结构
文件夹 |
描述 |
Components |
组件 |
Components/APP |
应用程序 |
Components/HAL |
驱动库 |
Components/Main |
入口函数 |
Projects/USER |
工程文件 |
doc |
直到文档和图片 |
名称及路径 |
说明 |
/APP |
应用代码。包含串口收发封装处理、AT指令处理、初始化、应用层事件。 |
/HAL |
外设驱动。led、timer、uart、flash、spi、i2c、usb初始化、配置以及驱动功能实现。 |
/OSAL |
系统抽象层。队列操作等。 |
/Main |
应用程序入口。包含总的应用逻辑。 |
/DW/Twr |
TWR算法相关代码。包含与DW3000 SPI通讯、唤醒、休眠、中断等,TWR node和TWR tag算法。 |
/DW/Driver |
UWB原厂驱动。 |
/OLED |
OLED显示屏驱动文件。 |
/USB |
USB配置、读写处理文件。 |
/USB/Lib |
USB库 |
/LIS2DH12 |
三轴加速度传感器。初始化、读写、数据处理。 |
/DW/PDoA |
PDOA算法相关代码。包PDOA node和PDOA tag算法、配置、输出。 |
/Device |
stm32f10x标准库 |
(3)Keil环境配置

若提示报错,将报错的misc.c的131行的NVIC->IPR[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
更改为 NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
2.2、快速上手例程
Example下有不同的例程,以ds_twr_sts_sdc_init(双边测距发起者例程)、ds_twr_sts_sdc_resp(双边测距回复者例程) 为例
TWR双边测距回复者例程(UWB基站),负责接收发起者(UWB标签)的数据,并计算距离数据,实现在串口上显示TWR下的距离
- 此应用程序发送一个 “轮询 ”帧(记录轮询的 TX 时间戳)
- 然后等待 “ds_twr_sts_sdc_resp”示例代码(此应用程序的配套代码)发出 “响应 ”信息。
- 收到响应后,记录其 RX 时间戳,然后发送 “最终 ”报文完成交换。
- 最终报文包含本应用程序记录的所有时间戳,包括计算/预测的最终报文本身的 TX 时间戳。
- 配套的 “ds_twr_sts_sdc_resp”示例应用程序(回复者)可计算出空中飞行时间,并由此估算出两地之间的距离。
- 从而估算出两个设备之间的距离。
发起者:发起双边定位的设备,负责发送定位数据包,可视为"UWB标签"
回复者:负责接收定位数据包,并计算测距距离,可视为 "UWB基站"

(1)打开 example_defines.h ,把宏 #define EXAMPLE_DEMO 的值改成 1,打开 example_selection.h,取消宏 #define TEST_DS_TWR_INI_STS的注释
(2)编译后,连接开发板的TTL口,下载并烧录到开发板中,配置为“标签”

(3)打开 example_selection.h ,取消宏 #define TEST_DS_TWR_RESP_STS 的注释
example_selection.h 每次只能运行一个例程,所有要注释 #define TEST_DS_TWR_INI_STS

(4)让距离信息从UART上打印出来
- 打开 “ ds_twr_sts_sdc_resp.c ” 定位到 285 行
- 取消相关的注释
- 定义 dist_str 数组变量

(5)编译后,连接另一块开发板的TTL口,下载并烧录到开发板中,配置为“基站”
- 上电运行ds_twr_sts_sdc_init例程的设备A “标签”
- 上电运行ds_twr_sts_sdc_resp例程的设备B “基站”
(6)打开串口助手,输出标签到基站之间的距离数据 (间隔1s)

2.3、SDK相关代码介绍
UWB 驱动API指南
main.c:若没有打开 EXAMPLE_DEMO 宏 ,则执行主要任务 nt_task();

nt_task:主要是根据设备的不同配置、角色进行不同初始化和操作;
根据工作模式的不同,处理不同的数据传输模式(TWR / PDOA模式)
void nt_task (void)
{
//读取上次flash存储数据
load_bssConfig();
if (sys_para.param_Config.s.userConfig.workmode == 0)
{
OLED_ShowStr (19, 2, "Please Send", 2);
OLED_ShowStr (19, 4, "AT Command", 2);
while (app.pConfig->s.userConfig.nodeAddr == 0xFFFF) //AOA是否有设置
{
App_Module_Sys_Work_Mode_Event();
}
if (app.pConfig->s.userConfig.twr_pdoa_mode == 0)
{
if (sys_para.flag == 0xAAAA)
{
if (sys_para.param_Config.s.userConfig.role == 1) //node
{
node_start();
}
else if (sys_para.param_Config.s.userConfig.role == 0) //tag
{
tag_start();
}
}
}
else
{
if (sys_para.param_Config.s.userConfig.role == 1)
{
ds_twr_sts_sdc_responder();
}
else if (sys_para.param_Config.s.userConfig.role == 0)
{
ds_twr_sts_sdc_initiator();
}
}
}
else
{
while (1)
{
App_Module_Sys_Work_Mode_Event();
}
}
for (;;);
}
方式一:使用SWD接口下载 / 调试
接线方式
BU03-Kit |
DAPLink |
3V3 |
3V3 |
GND |
GND |
SWDIO |
SWDIO |
SWCLK |
SWCLK |
Keil 烧录配置

方式二:使用串口USB下载
Uart烧录软件:点击下载
(1)使用数据线连接至TTL口

(2)打开烧录软件
- 选择固件,已编译出来的Hex文件
- 点击搜索串口,选择对应的Port。
- 长按板载的BOOT0不松开,再按一下RESET后松开BOOT0。进入烧录模式,开始编程即可开始烧录。等待烧录完成即可。
