这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【FRDM-RW612板卡试用】2、过程贴

共2条 1/1 1 跳转至

【FRDM-RW612板卡试用】2、过程贴

菜鸟
2026-01-04 15:03:37     打赏

当硬件和开发环境调整好后,就可以开始实现我的一些想法啦~

一、开发计划

开发目标:我想开发一个和低功耗蓝牙相关的项目,将开发板的某些采集信息实时同步给手机或者上位机。

目标拆解:首先需要采集某些信息,其次我需要将它通过蓝牙转发。所以我起码需要2个demo,一个是采集相关,另一个是BLE相关,最后将他们组合起来就可以了。那么采集相关很方便的选择有2个:

  • P3T1755DP:I3C/I²C总线精确数字温度传感器,精度为±0.5°C    

  • 按键:SW2

斟酌了一下还是选择了按键,因为演示起来更直观方便。。。至于蓝牙,我选择了低功耗蓝牙而非经典蓝牙,因为它的功耗更低,也足够满足我的需求,最重要的是,我对低功耗蓝牙更熟悉,测试工具和方法齐全。

二、开发过程

思路虽然有了,但中间也有一些小插曲, 首先是电脑从win10更换到了ubuntu,其次是这块板子的蓝牙有一些特别,需要手动烧录一个固件,单纯烧录例程的话是搜不到蓝牙信号的。

1、ubuntu安装开发环境简述

1、到官网下载软件:https://nxp.flexnetoperations.com/control/frse/download?agree=Accept&element=6441981

2、bin文件下载好后,命令行找到下载的文件,加上运行权限,安装

 sudo chmod +x mcuxpressoide-24.9.25.x86_64.deb.bin 
 sudo ./mcuxpressoide-24.9.25.x86_64.deb.bin

3、设置工作空间,在ide里下载板子的支持包,这些内容和前面就一样了,可以看我前面的帖子。

2、按键开发

我是在frdmrw612_gpio_input_interrupt例程的基础上修改的。

实现以下功能:

  • 按键滤波

  • 按下按键后,显示“SW2 is turned on.”

  • 统计按键状态和按下次数

核心代码如下:

 void sw_task(void)
 {
     gpio_pin_config_t sw_config    = {kGPIO_DigitalInput, 0};
     gpio_interrupt_config_t config = {kGPIO_PinIntEnableEdge, kGPIO_PinIntEnableLowOrFall};
     /* Init input switch GPIO. */
     EnableIRQ(APP_SW_IRQ);
     GPIO_PortInit(GPIO, APP_SW_PORT);
     GPIO_PinInit(GPIO, APP_SW_PORT, APP_SW_PIN, &sw_config);
     PRINTF("2\r\n");
     // /* Enable GPIO pin interrupt */
     GPIO_SetPinInterruptConfig(GPIO, APP_SW_PORT, APP_SW_PIN, &config);
     GPIO_PinEnableInterrupt(GPIO, APP_SW_PORT, APP_SW_PIN, 0);
 
     PRINTF("demo gpio\r\n");
     while (1)
     {
         vTaskDelay(10);
         g_sw = GPIO_PinRead(GPIO, APP_SW_PORT, APP_SW_PIN);
         if (g_InputSignal)
         {
             vTaskDelay(10);
             if (APP_SW_CONNECTED_LEVEL == GPIO_PinRead(GPIO, APP_SW_PORT, APP_SW_PIN))
             {
                 PRINTF("%s is turned on.\r\n", APP_SW_NAME);
                 g_sw = true;
                 g_sw_on++;
             }
             /* Reset state of switch. */
             g_InputSignal = false;
         }
     }
 }

3、低功耗蓝牙开发1、烧录固件

低功耗蓝牙开发的时候,是基于frdmrw612_peripheral_ht这个例程,但是当我编译烧录运行后,发现上位机上不能搜到蓝牙信号,这里卡了我一段时间,后来搜到这位大佬的帖子,问题遂解决。

https://bbs.eeworld.com.cn/thread-1333959-1-1.html

补充2点:

  • 固件在frdmrw612_peripheral_ht这个例程里面就有,路径为:workplace目录下/frdmrw612_peripheral_ht/component/conn_fwloader/fw_bin/rw61x_sb_ble_a2.bin

  • 烧录蓝牙固件的时候,除了命令行,也可以使用ide的gui界面来烧录,具体如下:

image-20251231110750345

image-20251231110750345.png

然后我们再把这个例程的代码编译下载到板子上,运行,就可以在手机上搜到蓝牙的信号啦。在板子背面贴了蓝牙的地址信息,可以通过这个来验证我们找到的信号是否正确。

2、修改代码

但是这个时候连接的话会发现需要配对码,而且还卡卡的容易连不上,所以将它禁掉。需要修改2个地方

 static void connected(struct bt_conn *conn, uint8_t err)
 {
     char addr[BT_ADDR_LE_STR_LEN];
     bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
 
     if (err)
     {
         PRINTF("Failed to connect to %s (err %u)\n", addr, err);
     }
     else
     {
         PRINTF("Connected to peer: %s\n", addr);
 #if CONFIG_BT_SMP
         if (bt_conn_set_security(conn, BT_SECURITY_L1))  // 使用安全级别1,避免配对码
         {
             PRINTF("Failed to set security\n");
         }
 #endif
     }
 }
 
 /******************************************************************************/
 
 static struct bt_conn_auth_cb auth_cb_display = {
     .passkey_display = NULL,  // 设置为NULL,禁用配对码显示
     .passkey_entry = NULL,
     .cancel = auth_cancel,
 };

虽然后来发现把CONFIG_BT_SMP这个宏改成0就行了。。。

编译烧录,命令行监控串口;

 screen /dev/ttyUSB0 115200

image-20251231135251709.png

手机连上蓝牙后,出现上报温度的log。手机上也能查看设备信息和显示温度了。

格式很奇怪是因为:在linux下\n换行,\r回车,他们是分开的,光有\n的话,字符会到下一行,但是不会回到行首。而且只有linux下会有这个问题,在win下,\n就能执行换行+回车这两个动作了。

3、开发新功能

啰嗦一点背景知识:每个ble下可以有输个服务,比如说前面例程里的健康服务,比如说后面开发会用到的自动化IO服务;而每个服务下面又可以有不同的特征值来进行详细数据的交互(比如前面的温度、设备信息等),每个特征值可以有不同的权限(比如write、read、notify等);服务和特征值都由它们的uuid,当然除了规定好的一些uuid,还可以自定义uuid。

那么若想要实现开发板自动向手机上报它按键的状态,就可以选择BT_UUID_AIOS_VAL (自动化输入输出服务)和BT_UUID_GATT_DO_VAL (数字信号输出特征值);它们的uuid是已经被规定好的,分别为0x1815和0x2a57,当使用他们与手机通信时,手机上自动就会显示这些信息了。其中read和write需要由手机主动来查询,notify可以由开发板主动发送数据给手机,因此我们想要实时显示开发板的按键信息的话,就要使用notify。

由前面的示例,修改服务和特征值的uuid,后就可以将信息传输到手机了,主要代码如下:

 // BT_UUID_AIOS_VAL 自动化输入输出服务
 // BT_UUID_GATT_DO_VAL 按键输出 特征值UUID
 // 定义自定义GATT服务
 static BT_GATT_SERVICE_DEFINE(custom_svc,
     BT_GATT_PRIMARY_SERVICE(BT_UUID_AIOS),
         BT_GATT_CHARACTERISTIC(BT_UUID_GATT_DO,
                               BT_GATT_CHRC_NOTIFY,
                               BT_GATT_PERM_NONE, NULL, NULL, NULL),
         BT_GATT_CCC(custom_ccc_cfg_changed,
                    BT_GATT_PERM_READ | BT_GATT_PERM_WRITE)
 );
 static void indicate_cb(struct bt_conn *conn,
       struct bt_gatt_indicate_params *params, uint8_t err)
 {
     PRINTF("Indication %s\n", err != 0U ? "fail" : "success");
 }
 void bt_custom_notify(void)
 {
     uint8_t sw_status[2] ;
 
     sw_status[0] = g_sw;
     sw_status[1] = g_sw_on;
     if(cccd_written)
     {
         PRINTF("sw notify %d, %d \n\r",g_sw,g_sw_on);
         if (0 != bt_gatt_notify(NULL, &custom_svc.attrs[2], &sw_status, sizeof(sw_status)))
         {
             PRINTF("bt_gatt_notify error\n\r");
         }
     }
 }





院士
2026-01-04 17:22:42     打赏
2楼

谢谢分享。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]