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


亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」
介绍
该项目是一个简单的示例,展示了将 STM32Cube 项目设置为能够与 BleuIO Dongle 通信的 USB CDC 主机的快速方法。
当 BleuIO Dongle 连接到 Nucleo 板的 USB 端口时,STM32 会识别它。然后它将接受来自 UART 的 3 个不同输入,并根据输入将 3 个预编程命令之一发送到 BleuIO Dongle。本示例中使用的命令是:
我们使用了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 */
使用示例项目
你需要什么
要将加密狗连接到 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 端口。
如果您对此项目有任何想法、意见或问题,请在下方留言。
原文链接丨以上内容来源网络,如涉及侵权可联系删除。
OpenA,让品牌企业成为DT时代的“矿主”
2018-03-12
基于AD7134的医疗采集系统电路设计
2020-03-01
实例分析:基于STM32的USB设备电路这样设计更巧妙
2020-09-29
基于STM32的数据采集与监控系统的远程监控终端设计方案
2020-05-28
基于 STM32 的激光测距仪
2021-11-11
STM32单片机Boost升压恒流电源模块电路及程序设计讲解
2020-06-12
STM32 Blue Pill与Black Pill微控制器板对比,哪个更适合初学者?
2020-03-02
MATLAB(SIMULINK)自动生成STM32工程代码
2020-06-10
STM32图形界面 GUI高阶实战演练
2020-06-04
STM32F407你真的了解吗?【大神带你学STM32】
2020-06-11
讨论