(HAL)stm32f407+freertos通过usb驱动移远4G模块-EC600U

概述

本篇文章主要介绍:

  1. 如何使用STM32CubeMX创建stm32F407+freertos+usb host的基础工程。
  2. USB-HOST-CDC驱动运行过程。
  3. 如何根据4G模块的具体信息修改usb相关代码。
  4. MCU如何通过usb与4G模块通信,收发数据。
  5. 调试过程中遇到的问题以及解决办法。
    整个过程中在网上搜罗了很多参考资料,有些与我理解不相符的就不罗列了,觉得有用的我会引用并简单说明。

创建工程

关于创建工程,网上资料太多了,freertos的,usb的都有详细教程,我这里就只罗列个大概,不详细展开了。

  1. 根据实际情况选择芯片。
    选择芯片
  2. 基础配置
    工程基础配置
  3. 启用freertos。
    启用freertos
  4. 启用USB。先根据硬件配置好USB对应的GPIO模式,然后配置USB,这里选用的是FS全速模式,单片机做为USB Host,4G模块为Slave(根据EC600U手册描述,也只能为Slave),然后添加usb相关驱动库。
    模块手册内容

配置USB相关GPIO
选择FS全速USB Host模式
添加USB驱动库
5. 生成代码。根据需要增加其他配置,配置完成后生成代码。
配置工程+生产代码
至此,基本工程已经创建完成了,后面再根据需要进行一些代码的修改,因为本篇主要讲述USB的使用,freertos的内容就不叙述了。

USB-HOST-CDC驱动运行过程

此部分简述了设备上电后USB驱动是如何运行的,理解相关的内容,可以略过。
在freertos下,USB-HOST-CDC驱动是在freertos的默认任务下进行的初始化,代码如下:

void MX_USB_HOST_Init(void)
{/* USER CODE BEGIN USB_HOST_Init_PreTreatment *//* USER CODE END USB_HOST_Init_PreTreatment *//* Init host Library, add supported class and start the library. */if (USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS) != USBH_OK){Error_Handler();}if (USBH_RegisterClass(&hUsbHostFS, USBH_CDC_CLASS) != USBH_OK){Error_Handler();}if (USBH_Start(&hUsbHostFS) != USBH_OK){Error_Handler();}/* USER CODE BEGIN USB_HOST_Init_PostTreatment *//* USER CODE END USB_HOST_Init_PostTreatment */
}

简单来说,上面的初始化完成后USB驱动就开始运行了。具体包括GPIO模式的配置代码,配置完成后它创建了一个单独的任务 SBH_Process_OS,就是在这个任务里调用了USB的处理函数USBH_Process,USBH_Process函数实现了USB驱动的状态机,包括设备检测、设备枚举等过程,是USB驱动的主要过程函数,借用这篇文章中的图片展示下状态机,该文章对驱动库进行了详细说明,可以看一下:
USB设备驱动状态机
其中比较重要的是设备枚举部分,截取相关代码如下,关于枚举这篇文章讲解的很详细:

case HOST_ENUMERATION:/* Check for enumeration status */status = USBH_HandleEnum(phost);if (status == USBH_OK){/* The function shall return USBH_OK when full enumeration is complete */USBH_UsrLog("Enumeration done.");phost->device.current_interface = 0U;if (phost->device.DevDesc.bNumConfigurations == 1U){USBH_UsrLog("This device has only 1 configuration.");phost->gState = HOST_SET_CONFIGURATION;}else{phost->gState = HOST_INPUT;}
#if (USBH_USE_OS == 1U)phost->os_msg = (uint32_t)USBH_STATE_CHANGED_EVENT;
#if (osCMSIS < 0x20000U)(void)osMessagePut(phost->os_event, phost->os_msg, 0U);
#else(void)osMessageQueuePut(phost->os_event, &phost->os_msg, 0U, 0U);
#endif
#endif}break;

设备枚举成功后,通常就可以通信了,但是因为刚接触USB通信,一直调不通,所以对枚举过程也进行了一些研究,在USBH_HandleEnum函数中会调用到以下接口:

ReqStatus = USBH_Get_DevDesc(phost, 8U);
ReqStatus = USBH_Get_DevDesc(phost, USB_DEVICE_DESC_SIZE);
ReqStatus = USBH_SetAddress(phost, USBH_DEVICE_ADDRESS);
ReqStatus = USBH_Get_CfgDesc(phost, USB_CONFIGURATION_DESC_SIZE);
ReqStatus = USBH_Get_CfgDesc(phost, phost->device.CfgDesc.wTotalLength)

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

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

相关文章

suricata7 rule加载(三)加载options

suricata7.0.5 加载options (msg:“HTTP Request Example”; flow:established,to_server; http.method; content:“POST”; http.uri; content:“query.php”; bsize:>9; http.protocol; content:“HTTP/1.1”; bsize:8; http.host; content:“360”; bsize:>3; class…

LabVIEW自动测控与故障识别系统

使用LabVIEW 2019在Win10 64位系统上开发自动测控软件&#xff0c;通过与基恩士NR-X100数据采集仪通讯&#xff0c;实时采集和分析数据&#xff0c;自动识别判断产品是否合格&#xff0c;并增加数据记录和仿真功能。 具体解决方案&#xff1a; 1. 系统架构设计 硬件接口&#…

IP 地址:优化网络游戏

IP地址和网络游戏 在现代网络游戏中&#xff0c;IP地址不仅用于服务器分配&#xff0c;还能针对性进行玩家匹配与优化网络延迟。本文将探讨IP地址在网络游戏中的具体应用。 *服务器分配* 全球服务器分布&#xff1a; 网络游戏需要在全球范围内提供快速、稳定的连接&#xff…

网络安全合规建设

网络安全合规建设 一、法律安全需求基本合规&#xff08;1&#xff09;《网络安全法》重要节点等级保护政策核心变化 二、安全需求 业务刚需&#xff08;1&#xff09;内忧&#xff08;2&#xff09;外患 三、解决方法&#xff08;1&#xff09;总安全战略目标图&#xff08;2&…

springboot文献检索系统-计算机毕业设计源码48521

摘要 文献检索系统主要功能模块包括用户管理、公告信息、新闻资讯、文献信息等&#xff0c;采取面对对象的开发模式进行软件的开发和硬体的架设&#xff0c;能很好的满足实际使用的需求&#xff0c;完善了对应的软体架设以及程序编码的工作&#xff0c;采取MySQL作为后台数据的…

!vue3中defineEmits接收父组件向子组件传递方法,以及方法所需传的参数及类型定义,避免踩坑!

使用说明 1、在子组件中调用defineEmits并定义要发射给父组件的方法 const emits defineEmits([‘foldchange’]) 2、使用defineEmits会返回一个方法&#xff0c;使用一个变量emits(变量名随意)去接收 3、在子组件要触发的方法中&#xff0c;调用emits并传入发射给父组件的方法…

封装了一个仿照抖音效果的iOS评论弹窗

需求背景 开发一个类似抖音评论弹窗交互效果的弹窗&#xff0c;支持滑动消失&#xff0c; 滑动查看评论 效果如下图 思路 创建一个视图&#xff0c;该视图上面放置一个tableView, 该视图上添加一个滑动手势&#xff0c;同时设置代理&#xff0c;实现代理方法 (BOOL)gestur…

挑战杯 opencv 图像识别 指纹识别 - python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器视觉的指纹识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适…

基于swagger插件的方式推送接口文档至torna

目录 一、前言二、登录torna三、创建/选择空间四、创建/选择项目五、创建/选择应用六、获取应用的token七、服务推送7.1 引入maven依赖7.2 test下面按照如下方式新建文件 一、前言 Torna作为一款企业级文档管理系统&#xff0c;支持了很多种接口文档的推送方式。官方比较推荐的…

蓝牙人员定位精准吗?是否会对人体有伤害?

不知道大家现在使用的蓝牙人员定位系统都是什么样的呢&#xff1f;其实就出行而言&#xff0c;使用GPS定位也就是足够了的&#xff0c;而且目前的定位相对也比较精准了&#xff0c;效果还是很不错的。但是如果说是室内定位&#xff0c;很显然常规的定位系统是无法满足使用需求的…

[数据结构] 基于插入的排序 插入排序希尔排序

标题&#xff1a;[数据结构] 排序#插入排序&希尔排序 水墨不写bug 目录 &#xff08;一&#xff09;插入排序 实现思路&#xff1a; 插入排序实现&#xff1a; &#xff08;二&#xff09;希尔排序 希尔排序的基本思想&#xff1a; 希尔排序的实现&#xff1a; 正…

PHP同城多商户多行业系统小程序源码

同城新生态&#xff0c;解锁多商户多行业系统的无限魅力&#x1f306;&#x1f680; &#x1f308; 开篇&#xff1a;同城新纪元&#xff0c;多商户多行业系统引领潮流&#xff01; 想象一下&#xff0c;在同一个城市内&#xff0c;无论是美食探索、购物狂欢&#xff0c;还是…

Python在量化交易中的应用

量化交易近年来越来越受到投资者的青睐。Python因其简洁的语法和丰富的库&#xff0c;成为量化交易的首选编程语言。本文将从Python量化交易的基础知识、主要技术及其在实际交易中的应用三个方面进行介绍。 一、Python量化交易的基础知识 1. 量化交易的概念 量化交易是指利用…

东方通Tongweb发布vue前端

一、前端包中添加文件 1、解压vue打包文件 以dist.zip为例&#xff0c;解压之后得到dist文件夹&#xff0c;进入dist文件夹&#xff0c;新建WEB-INF文件夹&#xff0c;进入WEB-INF文件夹&#xff0c;新建web.xml文件&#xff0c; 打开web.xml文件&#xff0c;输入以下内容 …

sdwan是硬件还是网络协议?

SD-WAN&#xff08;Software-Defined Wide Area Network&#xff0c;软件定义广域网&#xff09;并不是一个硬件产品或单一的网络协议&#xff0c;而是结合了软件、硬件和网络技术的一种解决方案。SD-WAN的核心在于其软件定义的特性&#xff0c;它通过软件来控制和管理广域网的…

【BUG】RestTemplate发送Post请求后,响应中编码为gzip而导致的报错

BUG描述 20240613-09:59:59.062|INFO|null|810184|xxx|xxx||8|http-nio-xxx-exec-1|com.xxx.jim.xxx.XXXController.?.?|MSG接收到来自xxx的文件请求 headers:[host:"xxx", accept:"text/html,application/json,application/xhtmlxml,application/xml;q0.9,*…

Apache Seata分布式事务原理解析探秘

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 前言 fescar发布已有时日&#xff0c;分布式事务一直是业界备受关注的领域&#xff0c;fesca…

如何探索高效知识管理:FlowUs知识库体验很好

在当今信息爆炸的时代&#xff0c;有效的知识管理对于个人和团队的发展至关重要。FlowUs 知识库作为一款创新的知识管理工具&#xff0c;正逐渐成为众多用户的首选&#xff0c;为他们带来了高效、便捷和有条理的知识管理体验。 FlowUs 知识库的一大特色在于其简洁直观的界面设计…

雷池WAF动态防护功能初体验

一、 介绍 大名鼎鼎的雷池WAF最近新上了个名为 动态防护 的功能 所谓动态防护&#xff0c;是在用户浏览到的网页内容不变的情况下&#xff0c;将网页赋予动态特性&#xff0c;即使是静态页面&#xff0c;也会具有动态的随机性。 说白了就是给你网站的 html 和 js 代码加上加密…

前端与嵌入式开发通信之QWebChannel(Qt)

前端与嵌入式开发通信之QWebChannel 最近开发中需要用到和c开发的操作台进行通信的的需求&#xff0c;就找到了这个技术&#xff0c;记录一下 首先需要安装导入 qwebchannel npm i qwebchannel import { QWebChannel } from "qwebchannel"; 初始化qwebchannel并封…