介绍该项目是一个简单的示例,展示了将STM32Cube项目设置为能够与BleuIODongle通信的USBCDC主机的快速方法。当BleuIODongle连接到Nucleo板的USB端口时,STM32会识别它。然后它将接受来自UART的3个不同输入,并根据输入将3个预编程命令之一发送到BleuIODongle。本示例中使用的命令是:ATI(加密狗信息)AT+ADVSTART(开始广告)AT+ADVSTOP(停止广告)我们使用了STM32Nucleo-144开发板和STM32H743ZIMCU(STM32H743ZImicrombed-EnabledDevelopmentNucleo-144seriesARM?Cortex?-M7MCU32-BitEmbeddedEvaluationBoard)作为例子。如果您想使用其他设置,您必须确保它支持USB主机,并注意GPIO设置可能不同,可能需要在.ioc文件中重新配置。这个项目基于一个新的STM32项目,在.ioc文件中有这些变化:在“连接”下,“USB_OTG_FS”模式更改为Host_Only,并在NVIC设置中启用所有全局中断。在“中间件”下,“USB_HOST”-“FSIP类”设置为“通信主机类(虚拟端口Com)”。为了确保主机能够识别引导加载程序何时完成且BleuIO固件正在运行,这已添加到“usb_host.c”中的USBH_UserProcess函数中(位于“USB_HOST”->“App”文件夹下):staticvoidUSBH_UserProcess(USBH_HandleTypeDef*phost,uint8_tid){/*USERCODEBEGINCALL_BACK_1*/switch(id){案例HOST_USER_SELECT_CONFIGURATION:中断;案例HOST_USER_DISCONNECTION:Appli_state=APPLICATION_DISCONNECT;isBleuIOReady=false;//打开红色LED,关闭绿色和黄色LEDHAL_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=bleuiofw)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,关闭黄色和红色LEDHAL_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,关闭绿色和红色LEDHAL_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也会根据连接状态进行设置。红色=已断开。黄色=连接。绿色=已连接。还设置了一个外部变量boolisBleuIOReady,因此可以从main.c访问加密狗的状态。一旦确认连接了BleuIO加密狗,就会运行USBH_CDC_Receive函数以开始从USBCDC接收数据。USBH_CDC_ReceiveCallback还需要实现:在这个例子中,接收到的数据只是回显到UART。使用USBH_CDC_Transmit函数将数据发送到Dongle。在此示例中,UART输入用于发送不同的命令。为此,我们创建了一个可以从main.c访问的包装函数:/***@brief简单的函数,它接受一个字符串并将其传输到加密狗*@retval无*/voidwriteToDongle(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无*/voidhandleUartInput(UARTCommandTypeDefcmd){switch(cmd){情况UART_RX_0:{//0uart_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:{//1uart_buf_len=sprintf(uart_tx_buf,"\r\n(1press)\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:{//2uart_buf_len=sprintf(uart_tx_buf,"\r\n(2press)\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板,可以使用带有USBA母对母适配器的“USBA到MicroUSBB”电缆。)如何设置项目从文章下方下载项目克隆项目,或将其下载为zip文件并将其解压缩到您的STM32CubeIDE工作区中。作为现有项目导入从STM32CubeIDE中选择File>Import...然后选择General>ExistingProjectsintoWorkspace然后点击“Next>”确保您在“选择根目录:”中选择了您的工作区您应该会看到项目“stm32_bleuio_example”,检查它并单击“完成”。运行示例在STMCubeIDE中,单击锤子图标以构建项目。使用TeraTerm、Putty或CoolTerm等串行终端仿真程序打开“STMicroelectronicsSTLink虚拟COM端口”。串行端口设置:波特率:115200数据位:8奇偶校验:无停止位:1流量控制:无在STMCubeIDE中,单击绿色播放按钮闪烁并在您的板上运行它。第一次单击它时,将出现“运行配置”窗口。您可以保持原样,然后单击运行。连接BleuIODongle。等到显示消息:“[BleuIODongleReady]”。–按0获取设备信息:按1开始广告:按2停止广告:BlueIO加密狗响应将打印到虚拟COM端口。本方案所用到的项目如果您对此项目有任何想法、意见或问题,请在下方留言。原文链接丨以上内容来源网络,如涉及侵权可联系删除。