基于stm32的USB模拟UART的尝试F429

目录

  • 基于stm32的USB模拟UART的尝试F429
    • 实验目的
    • 场景使用原理图
    • USBX 组件
    • 移植USBX实现虚拟串口
    • 配置USB
    • 移植USBX源码
    • 工程中添加对应源码
    • 修改usb_otg.c
    • 创建 USBX 任务
    • 添加使用串口的代码
    • 上机现象
    • 本文中使用的测试工程

基于stm32的USB模拟UART的尝试F429

本文目标:基于stm32的USB模拟UART的尝试F429

按照本文的描述,没能跑通demo,仅做记录。

先决条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVision5

使用外设:USB、USART1、GPIO

HAL库版本:STM32F4xx HAL Driver version number 1.26.0

STMCubeMX版本:6.10.0

Keil uVision5版本:V5.38.0.0

实验目的

新手学习,在之前的H5的实验中,能够实现usb转串口的实验,但是移植到f103上时发现ram空间不够用,实验不成功,于是手里还有个f429的板子,想着也跟着移植试试看。学习USB虚拟UART编程,体验串口的高效接收,设计一个实验,实现基于usb模拟的串口实验。

场景使用原理图

在这个应用场景中,原理图的内容如下:

在这里插入图片描述

基于以上的原理设计,使用usb接口进行接口通讯实验。usb是一个复杂的外设,笔者并没有深入研究,我这里也只是进行简单记录,设计一个实验将USB发来的数据。

USBX 组件

使用一个开源的组件来辅助这次的实验。

参考:https://wiki.stmicroelectronics.cn/stm32mcu/wiki/Introduction_to_USBX

关于USBX :USBX 是 Azure®RTOS USB 主机和 USB 设备嵌入式堆栈。它与 ThreadX 紧密耦合。在某些类中,它需要 FileX 和 NetX Duo 堆栈。它允许使用具有多种配置的 USB 设备、复合设备和USB OTG 进行操作。它支持 USB 电源管理。USBX 为 USB 主机和 USB 设备堆栈提供了大量的 USB 类。一旦低级驱动程序能够响应USBX 请求,模块化架构就可以更容易地移植到不同的 USB 硬件 IP 上。所有 STM32 USB IP(主机、设备、OTG、高速和全速)均由 USBX 通过通用 STM32 HAL驱动程序 API 透明支持。

USBX 分为三层,如下图所示:

① 控制器层:最底层,USB 设备控制器的驱动程序,通常是 HAL 库

② stack layer:实现 USB 设备的基本操作,比如描述符的操作、使用 endpoint 进行数据传输

③ Class layer:实现各类 USB 设备的操作,比如 HID 设备、音频设备、虚拟串口,给 APP

提供接口

在这里插入图片描述

在这里插入图片描述

在 STM32 的固件中,可以看到 USBX 目录,比如:

在这里插入图片描述

移植USBX实现虚拟串口

移植 Controller layer、stack layer、Class layer ,重点在于 2 点:

① 怎么初始化硬件以确保 Controller layer 可以正常运行

② 怎么编写 APP:提供设备信息、传输数据

配置USB

在这里插入图片描述

想添加USBX的代码,发现STMCubeMX没有这个组件,自己手动从源仓库进行移植添加。

在这里插入图片描述

解决一下时钟的报错问题

在这里插入图片描述

选择Yes,让上位机自行解决,顺便看一下系统时钟频率是否是自己需要跑的频率。

移植USBX源码

找到USBX的源码,将源码移植进工程路径中。

在这里插入图片描述

工程中添加对应源码

需要添加 USBX 的 3 层源码,按照模板来进行添加,我添加的文件结构如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

添加含有“ux_device_class_cdc_acm”前缀的 C 文件,需要先选择目录,然后用搜索的方式来进行添加,进行回车之后然后选择文件添加。

在这里插入图片描述

再添加“stack layer”源码,可以从文件名的前面看出它们的作用,比如

“ux_device_stack”表示这是 stack 源码,“ux_utility”表示这是辅助函数,“ux_system”表示是这是系统函数。

将相关的头文件路径添加进来,然后一顿猛的编译,还是报很多错,这个时候需要耐心的一个个解决。

在这里插入图片描述

经过一番的添加对应的文件之后,解决了编译问题解决。

修改usb_otg.c

使用 STM32CubeMX 配置 usb 后生成的 usb_otg.c 里,只是初始化了 USB 控制器,并未启动它,也没有跟 USBX 建立联系,需要修改代码。

void MX_USB_OTG_FS_PCD_Init(void)
{/* USER CODE BEGIN USB_OTG_FS_Init 0 *//* USER CODE END USB_OTG_FS_Init 0 *//* USER CODE BEGIN USB_OTG_FS_Init 1 */UINT MX_USBX_Device_Init(void);MX_USBX_Device_Init();/* USER CODE END USB_OTG_FS_Init 1 */hpcd_USB_OTG_FS.Instance = USB_OTG_FS;hpcd_USB_OTG_FS.Init.dev_endpoints = 4;hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL;hpcd_USB_OTG_FS.Init.dma_enable = DISABLE;hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED;hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE;hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE;hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE;hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE;hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE;if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK){Error_Handler();}/* USER CODE BEGIN USB_OTG_FS_Init 2 */HAL_PCDEx_PMAConfig(&hpcd_USB_OTG_FS, 0x00, PCD_SNG_BUF, 0x14);HAL_PCDEx_PMAConfig(&hpcd_USB_OTG_FS, 0x80, PCD_SNG_BUF, 0x54);HAL_PCDEx_PMAConfig(&hpcd_USB_OTG_FS, USBD_CDCACM_EPINCMD_ADDR, PCD_SNG_BUF, 0x94);HAL_PCDEx_PMAConfig(&hpcd_USB_OTG_FS, USBD_CDCACM_EPOUT_ADDR, PCD_SNG_BUF, 0xD4);HAL_PCDEx_PMAConfig(&hpcd_USB_OTG_FS, USBD_CDCACM_EPIN_ADDR, PCD_SNG_BUF, 0x114);ux_dcd_stm32_initialize((ULONG)USB_OTG_FS, (ULONG)&hpcd_USB_OTG_FS);HAL_PCD_Start(&hpcd_USB_OTG_FS);/* USER CODE END USB_OTG_FS_Init 2 */}

创建 USBX 任务

使用单独模式( STANDALONE ) 时 , 需 要 创 建 一 个 任 务 , 不 断 运 行

“_ux_system_tasks_run”函数。在默认任务中进行测试

void StartDefaultTask(void *argument)
{/* USER CODE BEGIN defaultTask *//* Infinite loop */for(;;){// HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);// vTaskDelay(100);ux_system_tasks_run();}/* USER CODE END defaultTask */
}

添加使用串口的代码

static void SPILCDTaskFunction( void *pvParameters ) 
{char buf[100];int cnt = 0;while (1){sprintf(buf, "LCD Task Test : %d", cnt++);int ux_device_cdc_acm_send(uint8_t *datas, uint32_t len, uint32_t timeout);ux_device_cdc_acm_send((uint8_t *)buf, strlen(buf), 1000);vTaskDelay(1000); }
}

在这个文件中usbx\app\ux_device_cdc_acm.c添加如下的代码片段实现接收

static UINT ux_device_class_cdc_acm_read_callback(struct UX_SLAVE_CLASS_CDC_ACM_STRUCT *cdc_acm, UINT status, UCHAR *data_pointer, ULONG length)
{// int Draw_String(uint32_t x, uint32_t y, char *str, uint32_t front_color, uint32_t back_color);HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);extern UART_HandleTypeDef huart1;if (status == UX_SUCCESS){data_pointer[length] = '\0';// Draw_String(0, 0, (char *)data_pointer, 0x0000ff00, 0);HAL_UART_Transmit_DMA(&huart1, (uint8_t *)data_pointer, length);}return 0;
}

解决了编译错误之后,一顿操作之后,工程终于0错误,0警告了。

上机现象

烧写运行程序后,接上 USB 线,在电脑上可以识别出 USB 串口,查看设备管理器,可以看到如下设备:

在这里插入图片描述

但是使用串口助手打开时,发现一直转圈,一直未响应,打不开。

在这里插入图片描述

所以本次实验失败,没教程很难坚持,后期深入研究时在进行解决。

本文记录到此,算是自己工程的一次实践,本文完!!感谢阅读,感谢关注。

本文中使用的测试工程

https://download.csdn.net/download/weixin_44317448/89244327

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/830312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp-vue3-wechat:基于uniapp+vue3仿微信app聊天实例(H5+小程序+App端)

uni-vue3-wchat:基于uni-appvue3pinia2高仿微信app聊天模板。 原创基于最新跨端技术uni-appvue3.xpinia2vite4uv-ui构建三端仿微信app界面聊天实例。实现编辑框多行消息/emoj混合、长按触摸式仿微信语音面板、图片/视频预览、红包/朋友圈等功能。支持编译到H5小程序…

数据结构与算法-抽象数据类型ADT系列

以前在学习数据结构的时候做实验,老师要求用ADT抽象数据类型来写这些实现代码。后面也要复习数据结构,在这里就先放下链接。不过以前学习的时候使用的编程语言是C,里面会用到很多指针。现在编代码过程大多数时候都是用Java。不过思路应该还是…

keytool,openssl的使用

写在前面 在生成公钥私钥,配置https时经常需要用到keytool,openssl工具,本文就一起看下其是如何使用的。 keytool是jdk自带的工具,不需要额外下载,但openssl需要额外下载 。 1:使用keytool生成jks私钥文件…

WEB攻防-IIS中间件PUT漏洞

IIS6.0 server在web服务扩展中开启了WebDAV(Web-based Distributed Authoring and Versioning)。WebDAV是一种HTTP1.1的扩展协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,如PUT&#xff0c…

自动驾驶横向控制算法

本文内容来源是B站——忠厚老实的老王,侵删。 三个坐标系和一些有关的物理量 使用 frenet坐标系可以实现将车辆纵向控制和横向控制解耦,将其分开控制。使用右手系来进行学习。 一些有关物理量的基本概念: 运动学方程 建立微分方程 主要是弄…

Linux进程——进程的概念(PCB的理解)

前言:在了解完冯诺依曼体系结构和操作系统之后,我们进入了Linux的下一篇章Linux进程,但在学习Linux进程之前,一定要阅读理解上一篇内容,理解“先描述,再组织”才能更好的理解进程的含义。 Linux进程学习基…

Hadoop3:集群搭建及常用命令与shell脚本整理(入门篇,从零开始搭建)

一、集群环境说明 1、用VMware安装3台Centos7.9虚拟机 2、虚拟机配置:2C,2G内存,50G存储 3、集群架构 从表格中,可以看出,Hadoop集群,主要有2部分,一个是HDFS服务,一个是YARN服务 …

记一次内网渗透

环境搭建: 排错: 在搭建过程中发现报错,删除这部分内容就成功解决。 信息收集 端口扫描 使用namp -sn 探测存活IP 接着去查看服务 web服务 然后发现80端口。访问 发现有管理员接口,并泄露了默认用户名和密码。 弱口令登录 …

vue中配置 测试、准生产、生产环境

在package.json,scripts中配置 "dev": "vue-cli-service serve --open --mode dev",在项目根目录下配置 新建 .env.dev 和.env.development文件 //类似于title NODE_ENV "serve" //各环境API数据接口请求地址 VUE_APP_BASE_API "http:…

软件测试笔记_习题_面经

软件测试------按测试阶段划分有几个阶段? 单元测试、集成测试、系统测试、验收测试 软件测试------按是否查看源代码划分有几种测试方法? 黑盒、白盒、灰盒 软件测试------按是否运行划分有几种测试方法? 静态测试、动态测试 软件测试------按是否自动化划分有几种测试方…

在远程服务器上安装anaconda以及配置pytorch虚拟环境

目录 第一步:官网或者清华源下载Anaconda。 第二步:创建虚拟环境。 第三步:在服务器终端输入nvidia-smi查看服务器信息。 第四步:在pytorch官网找到对应版本cuda的命令。 第一步:官网或者清华源下载Anaconda。 官网…

智慧安防边缘计算硬件AI智能分析网关V4算法启停的操作步骤

TSINGSEE青犀视频智能分析网关V4内置了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,上报识别结果,并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入,可兼容市面上常…

02 - 步骤 Kafka consumer

简介 Kafka consumer 步骤,用于连接和消费 Apache Kafka 中的数据,它可以作为数据管道的一部分,将 Kafka 中的数据提取到 Kettle 中进行进一步处理、转换和加载,或者将其直接传输到目标系统中。 使用 场景 我需要订阅一个Kafka的数据&…

MyBatis(环境配置+基本CRUD)

文章目录 1.基本介绍1.为什么需要MyBatis?2.MyBatis介绍3.MyBatis工作示意图4.MyBatis的优势 2.快速入门文件目录1.需求分析2.数据库表设计3.父子模块环境配置1.创建maven父项目2.删除父项目的src目录3.pom.xml文件文件解释 4.创建子模块1.新建一个Module2.创建一个…

MySQL Binlog 闪回与分析

文章目录 前言1. 修改 event 实现闪回1.1 binlog 结构1.2 闪回案例1.3 方法总结 2. 解析文本闪回2.1 mysqlbinlog2.2 闪回案例2.3 方法总结 3. 在线订阅闪回3.1 mysql-replication3.2 binlog2sql3.3 方法总结 4. Binlog 分析方法4.1 分析场景4.2 辅助定位事务4.3 方法总结 5. 平…

【C/C++笔试练习】OSI分层模型、源端口和目的端口、网段地址、SNMP、状态码、tcp报文、域名解析、HTTP协议、计算机网络、美国节日、分解因数

文章目录 C/C笔试练习选择部分(1)OSI分层模型(2)源端口和目的端口(3)网段地址(4)SNMP(5)状态码(6)tcp报文(7)域…

美国站群服务器上常见的操作系统选择指南

美国站群服务器上常见的操作系统选择指南 美国站群服务器的选择操作系统对于服务器的性能和功能至关重要。本文将为您介绍在美国站群服务器上常见的操作系统选择指南,以帮助您做出明智的决策。 在选择美国站群服务器时,选择合适的操作系统是至关重要的…

鸿蒙OpenHarmony【标准系统 烧录】(基于RK3568开发板)

烧录 烧录是指将编译后的程序文件下载到芯片开发板上的动作,为后续的程序调试提供基础。DevEco Device Tool提供一键烧录功能,操作简单,能快捷、高效的完成程序烧录,提升烧录的效率。 RK3568的镜像烧录通过Windows环境进行烧录&…

pytorch库 01 安装Anaconda、Jupyter,Anaconda虚拟环境连接pycharm

文章目录 一、安装Anaconda1、卸载Anaconda(可选)2、下载并安装Anaconda3、配置环境变量4、桌面快捷方式 二、安装 PyTorch(GPU 版)库1、创建虚拟环境,并安装一些常用包2、GPU 基础3、检查驱动4、安装CUDA(…

Spring Boot | Spring Security ( SpringBoot安全管理 )、Spring Security中 的 “自定义用户认证“

目录 : Spring Boot 安全管理 :一、Spring Security 介绍二、Spring Security 快速入门2.1 基础环境搭建 :① 创建Spring Boot 项目② 创建 html资源文件③ 编写Web控制层 2.2 开启安全管理效果测试 :④ 添加 spring-boot-starter-security 启动器⑤ 项目启动测试 三…