API 操作


状态更改的 GPIO 通知

如下图所示,DWM 模块可以通过将专用 GPIO 引脚 (P0.26) 切换为高电平,来发送状态变化通知,而不是由主机设备启动 SPI/UART 通信. 要启用此功能,主机设备需要使用 dwm_int_cfg_set 命令. 在检测到高电平时,主机设备可以启动 dwm_status_get 命令来获取 DWM1001 设备的状态. dwm_int_cfg 和 dwm_status_get 命令都可以通过前面章节介绍的 SPI 或 UART 方案发送.

../../../_images/image14.png

DWM1001 使用数据就绪 GPIO 引脚通知主机设备状态变化

如果状态变化发生在上述的 SPI TLV 请求/响应过程中,该 GPIO 引脚的电平变化将被推迟,以避免冲突. 具体来说,当 SPI 处于状态时: “SPI:等待回调“, ”SPI:等待读取 SIZE “和 ”SPI:等待读取 DATA/ERR “时,GPIO 方案将放弃对 GPIO 引脚的控制. SPI 通信结束后,当 SPI 处于 ” SPI: Idle “状态时,GPIO 方案将重新获得 GPIO 引脚的控制权.


模块上 C 代码用户应用程序的 API

用户可以在预编译固件的板载包中提供的某些入口文件中,添加自己的代码并使用 C 代码 API 功能. 这样,用户就可以在模块固件内添加自己的功能,而无需添加外部主控制器设备.

在使用板载固件时,C 代码用户需要注意以下几点:

  • 用户应用是基于 eCos RTOS 和 DWM 库.

  • 用于与用户应用程序链接的文件:

    • dwm.h - 头文件 - 封装构建用户应用程序所需的所有头文件

    • libdwm.a - 静态库

    • extras.o, vectors.o, libtarget.a - eCos 静态库

    • target_s132_fw1.ld - 固件第 1 部分的链接脚本

    • target_s132_fw2.ld - 固件第 2 部分的链接脚本

  • API 为用户应用程序提供函数和定义

    • 操作系统的常见功能,如线程创建, 内存分配, 访问接口(如 GPIO, SPI……)和同步(mutex, 信号).

    • DWM 通信栈的初始化, 配置和维护

    • 输入数据和测量的回调注册.

    • API将保护用户应用程序,防止错误的设置影响系统性能.


系统规格

最大用户线程数: 5

  • 最终用户的内存:约 KB (D12 之后待定,预计 > 5KB)

  • 为最终用户提供的闪存: 约 TBD kB (D12 之后待定,预计 >= 40KB)


DWM1001 线程

在 DWM1001 固件系统中,有许多线程,包括 SPI, BLE, UART, Generic API, User App 和其他线程. 每个线程处理特定任务. SPI, BLE 和 UART 线程控制与外部设备的数据传输. 它们不会解析收到的请求. 所有收到的请求都会发送到通用 API 线程. 通用 API 线程是接收到的请求的解析器. 它判断接收到的请求是否有效. 如果有效,固件会继续准备相应的数据作为响应;如果无效,固件会使用错误信息作为响应. 然后,通用应用程序接口线程运行call_back()函数,将准备好的响应信息发送回发出请求的线程. 板载用户应用程序线程是一个独立的线程,供用户添加自己的功能. DWM1001 板载软件包中的 dwmexamplesolder 文件夹提供了入口. dwmexamplesdwm-simple 文件夹中提供了一个示例项目.


位置表示

在实时定位系统中显示位置和距离时,有两件事需要考虑:

  • 准确性

  • 精度

精度是指节点报告的位置与实际位置之间的误差. 目前,本设计中使用的 DW1000 可提供约 10 厘米的精度. 精度是一个最小有效位(LSB)所代表的值. 在本系统的板载固件中,精度为 1 毫米,即 0.001 米. 位置以三维坐标(X, Y, Z)表示,其中 X, Y 和 Z 为 32 位整数(4 字节). 每个 LSB 代表 1 毫米. 这样更容易解释数值,也更容易对报告的数值进行数学计算.

在决定精度时,重要的是要根据精度来选择,这样才能得到有意义的结果. 如果精度很低,向用户显示精确的数值是没有用的. 与当前的 10 厘米精度相比,1 毫米的精度过于精细. 因此,在显示位置时,使用了 1 厘米的精度,即 0.01 米. 只有当坐标/距离变化超过 1 厘米时,才会显示更新值. 这类似于将浮点数/二进制数值舍入到有意义的小数位数.