通过 FRDM-MCXW71 上的 BLE 无线 UART 控制 LED
此演示允许用户通过串行终端与设备交互。它还允许用户通过智能手机通过 IoT Toolbox 发送的命令更改 LED 的颜色。
主板:FRDM-MCXW71、FRDM-MCXW7X
类别:无线连接
外设:GPIO、UART
工具链:MCUXpresso IDE、IAR
目录
1.软件
此代码使用 MCUXpresso IDE 版本 11.9.0 和 SDK 版本 2.16.000 实现。
笔记:
要在 MCXW71 中使用任何无线示例,请上传 NBU 镜像。此镜像包含在您在本例中使用的 SDK 版本中:
2.硬件
购买支持的主板:
3. 设置
3.1 步骤 1
使用 MCUXpresso IDE 页面文档部分中的“MCUXpresso IDE - 用户指南”的以下部分将项目“w_uart”导入 MCUXpresso IDE
笔记:
要在 IoT 工具箱中查看无线 UART,请在应用程序中更改 GAP 角色:按 SW4,然后按 SW2。
3.2 第 2 步
将无线 UART 示例导入工作区后,添加正确的配置以启用 LED 命令。以下部分介绍了您应该关注的主要方面:
- wireless_uart.c文件
需要此文件来添加声明、变量,并包含配置 LEDS 命令的说明:
声明和变量:
c
uint8_t command_uart;
uint8_t command_lenght;
必要功能:
需要声明并创建将 LED 配置到项目中的函数:
```c
void commandLed(void)
{
if (commanduart == '1' && commandlenght <= 2)
{
GPIOPortSet(GPIOA, 1U << 20U);
GPIOPortSet(GPIOA, 1U << 19U);
GPIO_PortSet(GPIOA, 1U << 21U);
gpio_pin_config_t rgbled_config = {
kGPIO_DigitalOutput,
0,
};
PORT_SetPinMux(PORTA, 21U, kPORT_MuxAsGpio);
GPIO_PinInit(GPIOA, 21U, &rgbled_config);
GPIO_PortClear(GPIOA, 1U << 21U);
GPIO_PortSet(GPIOA, 1U << 20U);
GPIO_PortSet(GPIOA, 1U << 19U);
}
else if (command_uart == '2' && command_lenght <= 2)
{
gpio_pin_config_t rgbled_config = {
kGPIO_DigitalOutput,
0,
};
PORT_SetPinMux(PORTA, 20U, kPORT_MuxAsGpio);
GPIO_PinInit(GPIOA, 20U, &rgbled_config);
GPIO_PortClear(GPIOA, 1U << 20U);
GPIO_PortSet(GPIOA, 1U << 19U);
GPIO_PortSet(GPIOA, 1U << 21U);
}
else if (command_uart == '3' && command_lenght <= 2)
{
gpio_pin_config_t rgbled_config = {
kGPIO_DigitalOutput,
0,
};
PORT_SetPinMux(PORTA, 19U, kPORT_MuxAsGpio);
GPIO_PinInit(GPIOA, 19U, &rgbled_config);
GPIO_PortClear(GPIOA, 1U << 19U);
GPIO_PortSet(GPIOA, 1U << 20U);
GPIO_PortSet(GPIOA, 1U << 21U);
}
else if (command_uart == '0' && command_lenght <= 2)
{
gpio_pin_config_t rgbled_config = {
kGPIO_DigitalOutput,
0,
};
PORT_SetPinMux(PORTA, 21U, kPORT_MuxAsGpio);
GPIO_PinInit(GPIOA, 19U, &rgbled_config);
GPIO_PinInit(GPIOA, 20U, &rgbled_config);
GPIO_PinInit(GPIOA, 21U, &rgbled_config);
GPIO_PortClear(GPIOA, 1U << 20U);
GPIO_PortClear(GPIOA, 1U << 21U);
GPIO_PortClear(GPIOA, 1U << 19U);
}
else
{
gpio_pin_config_t rgbled_config = {
kGPIO_DigitalOutput,
0,
};
PORT_SetPinMux(PORTA, 21U, kPORT_MuxAsGpio);
GPIO_PinInit(GPIOA, 19U, &rgbled_config);
GPIO_PinInit(GPIOA, 20U, &rgbled_config);
GPIO_PinInit(GPIOA, 21U, &rgbled_config);
GPIO_PortSet(GPIOA, 1U << 19U);
GPIO_PortSet(GPIOA, 1U << 20U);
GPIO_PortSet(GPIOA, 1U << 21U);
}
}
```
无线 UART 示例中使用了 LED,以便用户以不同的方式与开发板交互。因此,需要在 BLE 功能中调用以下函数:
在BLE接收UART中调用命令LED函数:
c
static void BleApp_ReceivedUartStream
(
deviceId_t peerDeviceId,
uint8_t *pStream,
uint16_t streamLength
)
就在这一行之后:
```c
if (defined(SERIALMANAGERNONBLOCKINGMODE) && (SERIALMANAGERNONBLOCKINGMODE > 0U))
serial_manager_status_t status = SerialManager_InstallTxCallback((serial_write_handle_t)s_writeHandle, Uart_TxCallBack, pBuffer);
(void)status;
assert(kStatus_SerialManager_Success == status);
(void)SerialManager_WriteNonBlocking((serial_write_handle_t)s_writeHandle, pBuffer, streamLength);
endif /SERIAL_MANAGER_NON_BLOCKING_MODE > 0U/
}
CommandLed();
/* update the previous device ID */
previousDeviceId = peerDeviceId;
}
```
用户使用智能手机发送的命令需要在函数中捕获:
```c
static void BleAppGattServerCallback
(
deviceIdt deviceId,
gattServerEventt *pServerEvent
)
{
uint16t tempMtu = 0;
switch (pServerEvent->eventType)
{
case gEvtAttributeWrittenWithoutResponse_c:
{
if (pServerEvent->eventData.attributeWrittenEvent.handle == (uint16_t)value_uart_stream)
{
command_uart = *pServerEvent->eventData.attributeWrittenEvent.aValue;
command_lenght = pServerEvent->eventData.attributeWrittenEvent.cValueLength;
BleApp_ReceivedUartStream(deviceId, pServerEvent->eventData.attributeWrittenEvent.aValue,
pServerEvent->eventData.attributeWrittenEvent.cValueLength);
}
break;
}
.
.
.
}
.
.
.
}
```
4. 运行演示
当 MCXW71 通电时,它开始发挥广告作用,您可以使用 IoT Toolbox 应用程序连接您的智能手机:
将手机与 MCXW71 连接后,您会在终端窗口中看到此消息:
您可以从手机向终端发送消息:
您可以使用“命令”在屏幕之间切换:
RGB 白色(命令‘0’)
RGB 红色(命令‘1’)
RGB 蓝色(命令‘2’)
RGB 绿色(命令‘3’)
** 任何其他命令“RGB OFF”
5. 常见问题解答
6. 支持
项目元数据
有关此示例的内容/正确性的问题可以作为此 GitHub 存储库中的问题输入。
来源:恩智浦appcodehub