0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简述STM32+RW007如何实现BLE透传功能

RTThread物联网操作系统 来源:RT-Thread物联网操作系统 作者:RT-Thread物联网操作 2021-05-24 09:28 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

今天我们将使用STM32F411-NUCLEO通过 RW007 BLE 功能读取来自KT6368A蓝牙模块的MPU6050传感器数据,实现BLE透传功能,算是学习 RW007 模块 BLE 功能的一个综合Demo实战哈!!!

硬件准备

1.STM32F411-NUCLEO 开发板,RW007 EVB模块

2.PC 电脑

3.USB 数据线

4.BLE 数据透传模块(如HC-08模块、KT6368A蓝牙模块等)

5.STM32F401-NUCLEO开发板,MPU6050模块

6.USB-TTL 模块(如CH340等)

7.杜邦线若干条

软件准备

1.RT-Thread Studio IDE软件

2.串口调试软件(xshell、SSCOM 等)

要实现MPU6050传感器数据BLE透传的功能,需要分为发送端设备和接收端设备。

发送端设备:

由 STM32F401-NUCLEO读取 mpu6050传感器数据配合KT6368A蓝牙模块数据透传。

可以分为以下的 7 个步骤:

步骤1:创建 RT-Thread Studio IDE 工程

步骤2:项目工程配置 I2C设备框架和硬件IO 引脚配置及硬件连接

步骤3:添加mpu6050软件包,测试 mpu6050 数据获取

步骤4:项目工程配置开启 uart6串口配置和硬件连接

步骤5:测试 uart6串口功能

步骤6:把获取的mpu6050数据通过 uart6串口输出

步骤7:把KT6368A蓝牙模块的RXD引脚接在uart6串口配置的TXD

其中各个步骤的具体操作如下:

步骤1:创建 RT-Thread Studio IDE 工程

由于使用RT-Thread Studio IDE如何创建STM32F401-NUCLEO的工程,这个在官方的文档中心中有相关的文档说明,这里只作简单说明。

(1)通过点击新建RT-Thread项目,选择基于开发板,型号选择STM332F401-NUCLEO,输入工程名称,点击完成按钮开始创建工程。

步骤2:项目工程配置 I2C设备框架和硬件IO 引脚配置及硬件连接

在配置I2C设备框架前,先确定使用那组硬件 IO 引脚,在这里使用 PA4 连接到mpu6050模块的SCL,PA1连接到mpu6050模块的SCK.由于使用的是软件模拟的 I2C功能,只需确保对应的IO引脚没有被复用即可。

f6acafda-bc28-11eb-bf61-12bb97331649.png

配置完成后,编译工程烧录到板子上,通过串口验证是否I2C设备框架正常工作。

注意:如果程序下载过程中提示 Warning: The core is locked up,需要在属性中配置为 system Reset 的复位模式

f6dbb9c4-bc28-11eb-bf61-12bb97331649.png

如图,通过list_device可以查看到有i2c1这个 device,表明配置已经生效。

步骤3:添加mpu6050软件包,测试 mpu6050 数据获取

关于 mpu6050软件包的使用,可以参考官方文档关于mpu6050传感器的使用,在这里仅是说明如何使用从官网相关文档中下载的mpu6050驱动包,获取数据。

mpu6050软件驱动包的下载连接:https://www.rt-thread.org/document/site/application-note/driver/i2c/i2c-mpu6050.rar下载后的软件包中包含的文件如下图

在工程目录中刷新后可以显示添加的文件。

f74c808c-bc28-11eb-bf61-12bb97331649.png

添加mpu6050软件包后需要适当修改SConscript 脚本

添加mpu6050软件包后需要适当修改drv_mpu6050.c 文件中的 MPU6050_I2CBUS_NAME为 i2c1。

然后编译工程,烧录测试mpu6050的功能。

f8c2afcc-bc28-11eb-bf61-12bb97331649.png

步骤4:项目工程配置开启 uart6串口配置和硬件连接

由于默认创建的工程中没有开启uart6串口的配置,需要使用CubeMX开启 uart6的串口功能配置。

由于默认的图形化配置中没有UART6的配置,需要手动修改添加。

修改 Kconfig添加 UART6的配置后,需要图形化配置。

如图,默认USART6串口功能的RXD引脚是PC7,TXD引脚是PC6.

此时,可以使用一个 USB-TTL串口模块的与STM32F401-NUCLEO进行连接测试uart6的功能。

步骤5:测试 uart6串口功能

关于 uart通信的示例,在官网的文档中心中有相关详细的说明,这里就不进行详细的描述。

直接从相关文档中参考一小段代码进行测试。

1#define SAMPLE_UART_NAME “uart6” /* 串口设备名称 */ 2static rt_device_t serial; /* 串口设备句柄 */ 3char str[] = “hello RT-Thread! ”; 4struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 配置参数 */ 5/* 查找串口设备 */ 6serial = rt_device_find(SAMPLE_UART_NAME); 7 8/* 以中断接收及轮询发送模式打开串口设备 */ 9rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); 10/* 发送字符串 */ 11rt_device_write(serial, 0, str, (sizeof(str) - 1));

把上面的代码添加到工程里面的main.c文件中,通过MSH命令启动测试。

fa0c1d32-bc28-11eb-bf61-12bb97331649.png

此时通过 SSCOM 串口调试工具观察 USB-TTL串口模块接收来自STM32F401-NUCLEO串口 UART6发送的数据。

到此,验证uart6串口功能正常。

步骤6:把获取的mpu6050数据通过 uart6串口输出

这里需要把获取的mpu6050数据通过uart6串口输出,需要适当修改代码,主要是添加 uart6串口的初始化还有把mpu6050数据通过uart6输出。

在main.c文件中,添加BLE_UART_NAME和serial的声明。

1#define BLE_UART_NAME “uart6” /* 串口设备名称 */ 2static rt_device_t serial; /* 串口设备句柄 */

在main函数中,添加 uart6串口的初始化代码。

1 /* 查找系统中的串口设备 */ 2 serial = rt_device_find(BLE_UART_NAME); 3 if (!serial) 4 { 5 rt_kprintf(“find %s failed! ”, BLE_UART_NAME); 6 return RT_ERROR; 7 } 8 rt_kprintf(“open uart6 ok.。。 ”); 9 rt_device_open(serial, RT_DEVICE_FLAG_INT_RX)

在mpu6050_thread_entry函数中,添加把mpu6050数据通过uart6输出的功能代码。

1void mpu6050_thread_entry(void *parameter) 2{ 3 rt_int16_t temp; //温度 4 rt_int16_t gx,gy,gz; //三轴加速度 5 rt_int16_t ax,ay,az; //三轴角速度 6 7 char TempStr[15] = {0}; 8 //char Gx[10] = {0}; 9 10 rt_err_t ret; 11 12 while(1) 13 { 14 ret = mpu6050_temperature_get(&temp); 15 if (ret != RT_EOK) 16 { 17 rt_kprintf(“mpu6050 : get temperature error ”); 18 } 19 ret = mpu6050_accelerometer_get(&ax, &ay, &az); 20 if (ret != RT_EOK) 21 { 22 rt_kprintf(“mpu6050 : get acc error ”); 23 } 24 ret = mpu6050_gyroscope_get(&gx, &gy, &gz); 25 if (ret != RT_EOK) 26 { 27 rt_kprintf(“mpu6050 : get gyro error ”); 28 } 29 if (ret == RT_EOK) 30 { 31 //rt_kprintf(“mpu6050: temperature=%-6d gx=%-6d gy=%-6d gz=%-6d ax=%-6d ay=%-6d az=%-6d ”,temp/100,gx,gy,gz,ax,ay,az); 32 sprintf(TempStr,“55temp=%dAA”,temp/100); 33 rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); 34 memset(TempStr,0,sizeof(TempStr)/sizeof(char)); 35 rt_thread_delay(rt_tick_from_millisecond(500)); 36 sprintf(TempStr,“55gx=%dAA”,gx); 37 rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); 38 memset(TempStr,0,sizeof(TempStr)/sizeof(char)); 39 rt_thread_delay(rt_tick_from_millisecond(500)); 40 41 sprintf(TempStr,“55gy=%dAA”,gy); 42 rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); 43 memset(TempStr,0,sizeof(TempStr)/sizeof(char)); 44 rt_thread_delay(rt_tick_from_millisecond(500)); 45 46 sprintf(TempStr,“55gz=%dAA”,gz); 47 rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); 48 memset(TempStr,0,sizeof(TempStr)/sizeof(char)); 49 rt_thread_delay(rt_tick_from_millisecond(500)); 50 51 sprintf(TempStr,“55ax=%dAA”,ax); 52 rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); 53 memset(TempStr,0,sizeof(TempStr)/sizeof(char)); 54 rt_thread_delay(rt_tick_from_millisecond(500)); 55 56 sprintf(TempStr,“55ay=%dAA”,ay); 57 rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); 58 memset(TempStr,0,sizeof(TempStr)/sizeof(char)); 59 rt_thread_delay(rt_tick_from_millisecond(500)); 60 61 sprintf(TempStr,“55az=%dAA”,az); 62 rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); 63 memset(TempStr,0,sizeof(TempStr)/sizeof(char)); 64 } 65 rt_thread_delay(rt_tick_from_millisecond(1000)); 66 } 67}

说明:由于 BLE设备单次发送的数据长度有限制,需要拆分mpu6050的数据,并在发送的一帧数据前加上55作为数据头,在一帧数据后添加AA作为数据尾,这样方便接收方解析数据。

fa992b32-bc28-11eb-bf61-12bb97331649.png

步骤7:把KT6368A蓝牙模块的RXD引脚接在uart6串口配置的TXD

基于前面的步骤,这里距离蓝牙数据透传功能的实现仅需要进行最后一步,把KT6368A蓝牙模块的RXD引脚接在uart6串口配置的TXD,由于KT6368A蓝牙模块一旦被连接后,就自动进入了透传模式,这时候可以参考上面的使用手机调试的方法,尝试读取数据。

到此,STM32F401-NUCLEO读取 mpu6050传感器数据配合KT6368A蓝牙模块数据透传的功能完成。

接收端设备:

STM32F411-NUCLEO通过 RW007 BLE 功能读取mpu6050传感器数据。

可以分为以下的 2 个步骤:

步骤1:创建 RT-Thread Studio IDE 工程

步骤2:添加BLE功能读取mpu6050传感器数据并解析的功能实现代码

步骤1:创建 RT-Thread Studio IDE 工程

这里可以参考前面 使用STM32F411-NUCLEO通过RW007BLE 功能测试BLE蓝牙模块数据传输功能 这部分的内容,进行创建工程,在这个工程的基础上,只需要添加一小部分代码就可以实现读取mpu6050传感器数据的功能。这里在 application目录下添加ble_example.c文件,并修改applications目录下的SConscript脚本,把ble_example.c添加到工程编译。

fafd5382-bc28-11eb-bf61-12bb97331649.png

步骤2:添加BLE功能读取mpu6050传感器数据并解析的功能实现代码

在ble_example.c文件中添加BLE功能读取mpu6050传感器数据并解析的功能实现代码,主要参考rw007软件包中的ble_cmd_rw007.c里面关于ble命令的使用。

(1)添加RW007 BLE 功能初始化

1static int ble_example_init(void) 2{ 3 rt_kprintf(“ble_example_init ”); 4 rt_uint8_t roles = 0; 5 roles = RW007_BLE_INIT_ROLE_CENTRAL; 6 7 rw007_ble_init(roles); 8 9 rw007_ble_resp_handle_cb_reg(rw007_ble_resp_handle); 10 rw007_ble_ntf_handle_cb_reg(rw007_ble_ntf_handle); 11 return 0; 12 13}

说明:上面代码实现RW007 BLE 功能作为主机初始化并设置相关回调的功能,rw007_ble_resp_handle 和 rw007_ble_ntf_handle函数可以直接参考ble_cmd_rw007.c文件里面的,具体的可以查询相关的代码。

(2)添加RW007 BLE 功能通过addr连接指定的BLE设备由于前面的步骤中,明确了需要连接的BLE设备的addr(即mac地址),这里就使用了。

1static int ble_example_connect(void) 2{ 3 rt_kprintf(“ble_example_connect ”); 4 ble_addr_t addr; 5 addr.type = RW007_BLE_ADDR_PUBLIC; 6 rt_kprintf(“str_addr: %s ”, “eeffcc:aa”); 7 8 _hexstrtoaddr(“eeffcc:aa”, addr.val); 9 10 rt_kprintf(“mac addr: %2x:%2x:%2x:%2x:%2x:%2x ”, addr.val[0], addr.val[1], 11 addr.val[2], addr.val[3], 12 addr.val[4], addr.val[5]); 13 rw007_ble_connect(&addr); 14 return 0; 15}

说明:上面代码实现通过BLE设备的addr(即mac地址)进行连接。

(3)添加RW007 BLE 功能通过UUID接收数据在前面的步骤中,知道可以通过 UUID=0XFFF1来接收BLE设备的数据。

1static int ble_example_gatt_notify_change_by_uuid(void) 2{ 3 rt_kprintf(“ble_example_gatt_notify_change_by_uuid ”); 4 rt_uint16_t conn_handle = 0; 5 rt_uint16_t char_value = 0; 6 7 int uuidint; 8 rw007_ble_uuid_t uuid; 9 10 conn_handle = 1; 11 char_value = 1; 12 13 uuid.type = BLE_UUID_TYPE_16; 14 sscanf(“0xfff1”, “%x”, &uuidint); 15 uuid.uuid.uuid16 = uuidint & 0xFFFFu; 16 17 rw007_ble_gatt_notify_change_by_uuid(conn_handle, &uuid, char_value); 18 return 0; 19}

说明:上面的代码中实现,通过设置UUID=0XFFF1来接收BLE设备的数据`

(4)添加数据解析部分的功能通过前面的测试中,可以知道BLE_TEST设备会把数据通过NOTIFY发送,此时只需要在RW007_BLE_NTF_TYPE_NOTIFY_RX中进行处理,把接收的数据解析(去掉数据头55、数据尾AA)

1 case RW007_BLE_NTF_TYPE_NOTIFY_RX: 2 { 3 struct rw007_ble_gap_event_notify_rx *notify_rx; 4 5 rt_kprintf(“RW007_BLE_NTF_TYPE_NOTIFY_RX ”); 6 7 notify_rx = (struct rw007_ble_gap_event_notify_rx *)data; 8 rt_kprintf(“conn_handle:%d, attr_handle:%d, rcv (%s) length:%d, data: ”, 9 notify_rx-》conn_handle, notify_rx-》attr_handle, 10 notify_rx-》indication ? “indication”:“notification”, notify_rx-》length_data); 11 hex_dump((const rt_uint8_t *)(notify_rx + 1), notify_rx-》length_data); 12 13 char *pcBegin = NULL; 14 char *pcEnd = NULL; 15 char cRes[15]={0}; 16 17 //Here to solve Data 18 pcBegin = strstr((const rt_uint8_t *)(notify_rx + 1),“55”); 19 pcEnd = strstr((const rt_uint8_t *)(notify_rx + 1),“AA”); 20 if(pcBegin == NULL || pcEnd == NULL || pcBegin 》 pcEnd) 21 { 22 rt_kprintf(“data not found!!! ”); 23 } 24 else { 25 pcBegin += strlen(“55”); 26 rt_memcpy(cRes, pcBegin, pcEnd-pcBegin); 27 rt_kprintf(“data:%s ”,cRes); 28 } 29 break; 30 }

(5)添加启动测试命令

在调试过程中,可以把启动的函数导出到msh命令中执行。

1static int ble_example_start(void) 2{ 3 ble_example_init(); 4 rt_thread_delay(1000); 5 ble_example_connect(); 6 rt_thread_delay(5000); 7 ble_example_gatt_notify_change_by_uuid(); 8 9 return 0; 10 11} 12MSH_CMD_EXPORT(ble_example_start,ble_example_start)说明:把ble_example_start函数导出到msh命令行中执行,代码中添加一些适当的延时是考虑到BLE设备执行连接需要等待一些时间。 (6)工程编译与下载按照上面的步骤操作后,重新编译工程下载到板子上,在STM32F411-NUCLEO的调试串口上输入ble_example_start的命令进行通过 RW007 BLE 功能读取mpu6050传感器数据。

到此,STM32F411-NUCLEO通过 RW007 BLE 功能读取mpu6050传感器数据功能完成。

常见问题

1.下载程序过程中提示Warning: The core is locked up,导致程序烧录失败。

fb6b6c0a-bc28-11eb-bf61-12bb97331649.png

一般在属性设置中重新配置工程的复位模式即可解决。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2578

    文章

    55833

    浏览量

    795534
  • usb
    usb
    +关注

    关注

    60

    文章

    8489

    浏览量

    286687
  • IDE
    IDE
    +关注

    关注

    0

    文章

    369

    浏览量

    49302
  • 开发板
    +关注

    关注

    26

    文章

    6513

    浏览量

    121371

原文标题:【RW007系列综合实战1】STM32+RW007实现BLE透传功能

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    GC433-TC007P 433MHz 无线传模块:小身材大能量

    GC433-TC007P 433MHz 无线传模块:小身材大能量 在无线射频和物联网领域,一款性能出色的无线传模块往往能为产品带来极大的便利和竞争力。今天,我们就来深入了解一下深圳市硅传
    的头像 发表于 05-09 10:50 189次阅读

    如何快速上手BLE SoC CMT4531,开发高效的短距传方案?

    BLE短距传方案通过无线传输实现设备间数据互通,需优化串口通信与MCU调度,提升系统性能。钱
    的头像 发表于 03-02 14:21 1781次阅读
    如何快速上手<b class='flag-5'>BLE</b> SoC CMT4531,开发高效的短距<b class='flag-5'>透</b>传方案?

    蓝牙的Mesh会不会和ble功能有冲突

    蓝牙 Mesh(BLE Mesh) 与 传统 BLE(Bluetooth Low Energy)功能 在技术上是基于同一底层物理层(2.4GHz ISM频段、GFSK调制等)构建的,但它们在协议栈
    发表于 01-30 20:11

    PB332在PB331基础上增加了抢占避让和按优先级队列上 传功能,并可以完全并网PB331系统进行传通讯

    PB332是POWERBUS-C 技术的从站通讯芯片。PB332在PB331基础上增加了抢占避让和按优先级队列上传功能,并可以完全并网PB331系统进行传通讯。POWERBUS-C属于低压供电总线
    发表于 01-30 13:03

    BLE-TPT蓝牙串口传模块有何应用优点

    在物联网与智能设备快速发展的今天,稳定、高效的无线数据传输方案成为众多嵌入式系统的核心需求。蓝牙传模块,特别是基于低功耗蓝牙(BLE)技术的串口传模块,因其易于集成、功耗低、兼容性强等特点,被广泛用于各类无线通信场景中。
    的头像 发表于 01-08 15:20 480次阅读
    <b class='flag-5'>BLE</b>-TPT蓝牙串口<b class='flag-5'>透</b>传模块有何应用优点

    探索NXP FRDM - RW612开发板:功能特性与应用指南

    探索NXP FRDM - RW612开发板:功能特性与应用指南 在当今的电子设计领域,一款功能强大且性价比高的开发板对于工程师们来说至关重要。NXP的FRDM - RW612开发板就是
    的头像 发表于 12-24 13:55 665次阅读

    低功耗蓝牙BLE传模块应用方案

    在物联网设备与智能硬件快速发展的今天,稳定、灵活的数据传输方案成为产品开发中的关键。BLE传模块以其高度集成、灵活配置和低功耗优势,为设备间的无线通信提供了可靠且高效的解决方案。
    的头像 发表于 12-15 16:56 890次阅读
    低功耗蓝牙<b class='flag-5'>BLE</b><b class='flag-5'>透</b>传模块应用方案

    BLE蓝牙模块实现原理深度解析:低功耗设计的奥秘与应用

    众所周知,BLE蓝牙是功耗低并且传输距离适中的一种无线通讯技术,也就是凭借这两点,蓝牙在物联网市场中获得了迅速发展。那么它是如何实现低功耗的?下面我们来了解下它的原理 一:BLE蓝牙模块的实现
    的头像 发表于 12-08 11:50 161次阅读

    工业智能网关能够支持数据传到上位机吗

    工业智能网关能够支持数据传到上位机 ,其传功能通过硬件接口、协议适配及传输模式设计实现,并具备多协议支持、高实时性、高可靠性及灵活配置等优势,具体分析如下: 一、
    的头像 发表于 11-11 11:16 687次阅读
    工业智能网关能够支持数据<b class='flag-5'>透</b>传到上位机吗

    WT2605C语音芯片:蓝牙音频播放+BLE传,引领智能设备语音交互革新

    一、双模蓝牙技术:音频与通信的完美融合1.1蓝牙音频播放与BLE传的协同优势WT2605C作为一款高性能音频蓝牙芯片,创新性地将传统蓝牙音频播放与低功耗蓝牙(BLE传技术集成于一
    的头像 发表于 11-11 09:07 1231次阅读
    WT2605C语音芯片:蓝牙音频播放+<b class='flag-5'>BLE</b><b class='flag-5'>透</b>传,引领智能设备语音交互革新

    物联网开发必备:四款低功耗蓝牙传模块参数全解析与应用实战

    物联网开发必备:四款低功耗蓝牙传模块参数全解析与应用实战 作为物联网设备的“无线神经末梢”,低功耗蓝牙(BLE传模块的选择直接关系到产品的功耗、连接稳定性与开发周期。本文将从工程师视角,深度
    的头像 发表于 11-05 14:37 1044次阅读

    请问vision-board开发板如何在模板共程添加RW007软件包?

    1.勾选Enable RW007后,会自动勾选Enable SCI Controller 2.查看示例工程的配置,不需要勾选Enable SCI Controller
    发表于 09-26 07:42

    RW007模块验证,一直通信失败的原因?

    1.测评nxp mcxa 156 rw007 2.使用env配置之后rw007一直通信失败 3.之前线下活动碰到过rw007模块坏的情况 4.使用手上psoc64验证 配置是否有问题 这样烧录之后还是通信失败
    发表于 09-12 06:39

    JDY-24M模块基本使用说明(主从传、MESH组网、BLE等数据传输)

    本文介绍了JDY-24M蓝牙模块的基本特性,如何使用其串口蓝牙数据传功能,蓝牙MESH组网数据传输。
    的头像 发表于 07-22 13:22 2640次阅读
    JDY-24M模块基本使用说明(主从<b class='flag-5'>透</b>传、MESH组网、<b class='flag-5'>BLE</b>等数据传输)

    低功耗蓝牙BLE传模块HM-BT4531的技术规格与应用指南

    SRAM和256KB FLASH,支持无线数据传功能,通过与外部MCU通信实现BLE从设备与主设备的无线连接和数据通信。模块支持多种AT指令用于配置和控制,如调整
    发表于 06-12 17:13 3次下载