本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于 STM32 的 BLE 项目

发布时间:2021-11-28
分享到:

基于 STM32 的 BLE 项目

发布时间:2021-11-28
分享到:

介绍

该项目是一个简单的示例,展示了将 STM32Cube 项目设置为能够与 BleuIO Dongle 通信的 USB CDC 主机的快速方法。

当 BleuIO Dongle 连接到 Nucleo 板的 USB 端口时,STM32 会识别它。然后它将接受来自 UART 的 3 个不同输入,并根据输入将 3 个预编程命令之一发送到 BleuIO Dongle。本示例中使用的命令是:

  • ATI(加密狗信息)
  • AT+ADVSTART(开始广告)
  • AT+ADVSTOP(停止广告)

我们使用了STM32 Nucleo-144开发板和STM32H743ZI MCU(STM32H743ZI micro mbed-Enabled Development Nucleo-144 series ARM? Cortex?-M7 MCU 32-Bit Embedded Evaluation Board)作为例子。

如果您想使用其他设置,您必须确保它支持 USB 主机,并注意 GPIO 设置可能不同,可能需要在 .ioc 文件中重新配置。

这个项目基于一个新的 STM32 项目,在 .ioc 文件中有这些变化:

在“连接”下,“USB_OTG_FS”模式更改为 Host_Only,并在 NVIC 设置中启用所有全局中断。

在“中间件”下,“USB_HOST”-“FS IP 类”设置为“通信主机类(虚拟端口 Com)”。

为了确保主机能够识别引导加载程序何时完成且 BleuIO 固件正在运行,这已添加到“usb_host.c”中的 USBH_UserProcess 函数中(位于“USB_HOST”->“App”文件夹下):

static  void  USBH_UserProcess   (USBH_HandleTypeDef *phost, uint8_t id)
 {
   /* USER CODE BEGIN CALL_BACK_1 */ switch (id)
  {
  案例HOST_USER_SELECT_CONFIGURATION:
  中断;

  案例HOST_USER_DISCONNECTION:
  Appli_state = APPLICATION_DISCONNECT;
  isBleuIOReady = false ;

  // 打开红色 LED,关闭绿色和黄色 LED
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
  打破;

  案例HOST_USER_CLASS_ACTIVE:
  应用状态 = APPLICATION_READY;
  // 检查 BleuIO 固件是否正在运行 // (idProduct:0x6001 = bootloader, idProduct:0x6002 = bleuio fw)if(phost->device.DevDesc.idProduct == 0x6002)
  {
      isBleuIOReady = true ;
      // 向 uart 发送消息,表明 BleuIO 已连接并准备就绪
      HAL_UART_Transmit(&huart3, ( uint8_t *)BLEUIO_READY, strlen (BLEUIO_READY), HAL_MAX_DELAY);

      // 打开绿色 LED,关闭黄色和红色 LED
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);

      // 开始从 USB 接收
      USBH_CDC_Receive(&hUsbHostFS, CDC_RX_Buffer, RX_BUFF_SIZE);
  }
  打破;

  案例HOST_USER_CONNECTION:
  应用状态 = APPLICATION_START;
  isBleuIOReady = false ;
  // 打开黄色 LED,关闭绿色和红色 LED
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
  打破;

  默认值:
  中断;
  }
  /* 用户代码结束 CALL_BACK_1 */
}

Nucleo 板上的绿色、红色和黄色 LED 也会根据连接状态进行设置。

  • 红色 = 已断开。
  • 黄色 = 连接。
  • 绿色 = 已连接。

还设置了一个外部变量 bool isBleuIOReady,因此可以从 main.c 访问加密狗的状态。

一旦确认连接了 BleuIO 加密狗,就会运行 USBH_CDC_Receive 函数以开始从 USB CDC 接收数据。

USBH_CDC_ReceiveCallback 还需要实现:

在这个例子中,接收到的数据只是回显到 UART。

使用 USBH_CDC_Transmit 函数将数据发送到 Dongle。在此示例中,UART 输入用于发送不同的命令。

为此,我们创建了一个可以从 main.c 访问的包装函数:

/**
  * @brief 简单的函数,它接受一个字符串并将其传输到加密狗
  * @retval 无
  */ 
void  writeToDongle ( uint8_t * cmd )
 {
    USBH_CDC_Transmit(&hUsbHostFS, cmd, strlen(( char *)cmd));
}
main.c中HAL_UART_RxCpltCallback被实现为收到输入从UART和一个简单的UART输入处理程序:
空隙 HAL_UART_RxCpltCallback(UART_HandleTypeDef * UartHandle)
 {
    如果(UartHandle ==&huart3)
    {
        RX_value = ( int )aRxBuffer[ 0 ];
        uartStatus = UART_RX_NONE;

        开关(RX_value)
        {
            情况UART_RX_0:
            {
                uartStatus = UART_RX_0;
                打破;
            }
            情况UART_RX_1:
            {
                uartStatus = UART_RX_1;
                打破;
            }
            情况UART_RX_2:
            {
                uartStatus = UART_RX_2;
                打破;
            }
            默认:
            {
                uartStatus = UART_RX_NONE;
                打破;
            }
        }
        // 重置 uart 接收中断模式
        HAL_UART_Receive_IT(&huart3, (uint8_t *)aRxBuffer, RXBUFFERSIZE);
    }
}


/**
  * @brief 简单的 UART 输入处理程序
  * @retval 无
  */ 
void  handleUartInput ( UARTCommandTypeDef cmd )
 {
     switch (cmd)
    {
        情况UART_RX_0:
        {
            // 0 
            uart_buf_len = sprintf(uart_tx_buf, "\r\n(0 按下)\r\n" );
            HAL_UART_Transmit(&huart3, (uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
            如果(isBleuIOReady)
            {
                writeToDongle((uint8_t*)DONGLE_CMD_ATI);
            }其他
            {
                uart_buf_len = sprintf(uart_tx_buf,BLEUIO_NOT_READY_MSG);
                HAL_UART_Transmit(&huart3, (uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
            }
            uartStatus = UART_RX_NONE;
            打破;
        }
        情况UART_RX_1:
        {
            // 1 
            uart_buf_len = sprintf(uart_tx_buf, "\r\n(1 press )\r\n" );
            HAL_UART_Transmit(&huart3, (uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
            如果(isBleuIOReady)
            {
                writeToDongle((uint8_t*)DONGLE_CMD_AT_ADVSTART);
            }其他
            {
                uart_buf_len = sprintf(uart_tx_buf,BLEUIO_NOT_READY_MSG);
                HAL_UART_Transmit(&huart3, (uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
            }
            uartStatus = UART_RX_NONE;
            打破;
        }
        情况UART_RX_2:
        {
            // 2 
            uart_buf_len = sprintf(uart_tx_buf, "\r\n(2 press )\r\n" );
            HAL_UART_Transmit(&huart3, (uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
            如果(isBleuIOReady)
            {
                writeToDongle((uint8_t*)DONGLE_CMD_AT_ADVSTOP);
            }其他
            {
                uart_buf_len = sprintf(uart_tx_buf,BLEUIO_NOT_READY_MSG);
                HAL_UART_Transmit(&huart3, (uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
            }
            uartStatus = UART_RX_NONE;
            打破;
        }
        情况UART_RX_NONE:
        {
            打破;
        }
        默认:
        {
            uartStatus = UART_RX_NONE;
            打破;
        }
    }
}
所述handleUartInput()处理的输入为0,1和2以及每个映射到一定加密狗命令。该处理器被然后把主循环中。
  /* 无限循环 *//* 用户代码开始时 */ while ( 1 )
   {
     /* 用户代码结束时 */
    MX_USB_HOST_Process();
    /* 用户代码开始 3 */// UART 输入的简单处理程序
    handleUartInput(uartStatus);
  }
  /* 用户代码结束 3 */

使用示例项目

你需要什么

  • BleuIO 加密狗 (https://www.bleuio.com/)
  • 带有带 USB 端口的 STM32 微控制器的板。(Nucleo-144 开发板:NUCLEO-H743ZI2,用于开发此示例。(https://www.st.com/en/evaluation-tools/nucleo-h743zi.html)

要将加密狗连接到 Nucleo 板,可以使用带有 USB A 母对母适配器的“USB A 到 Micro USB B”电缆。)

如何设置项目

从 文章下方 下载项目

克隆项目,或将其下载为 zip 文件并将其解压缩到您的 STM32CubeIDE 工作区中。

作为现有项目导入

从 STM32CubeIDE 中选择 File>Import...

然后选择 General>Existing Projects into Workspace 然后点击“Next>”

确保您在“选择根目录:”中选择了您的工作区

您应该会看到项目“stm32_bleuio_example”,检查它并单击“完成”。

运行示例

在 STMCubeIDE 中,单击锤子图标以构建项目。

使用 TeraTerm、Putty 或 CoolTerm 等串行终端仿真程序打开“STMicroelectronics STLink 虚拟 COM 端口”。串行端口设置:

波特率:115200

数据位:8

奇偶校验:无

停止位:1

流量控制:无

在 STMCubeIDE 中,单击绿色播放按钮闪烁并在您的板上运行它。第一次单击它时,将出现“运行配置”窗口。您可以保持原样,然后单击运行。

连接 BleuIO Dongle。

等到显示消息:“[BleuIO Dongle Ready]”。

– 按 0 获取设备信息:

按1开始广告:

按2停止广告:

BlueIO 加密狗响应将打印到虚拟 COM 端口。

本方案所用到的项目

如果您对此项目有任何想法、意见或问题,请在下方留言。

原文链接丨以上内容来源网络,如涉及侵权可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论