【GD32F427开发板试用】二、USB库移植与双USB CDC-ACM功能开发

news2024/11/28 4:43:55

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:chenjie

【GD32F427开发板试用】一、环境搭建与freertos移植
【GD32F427开发板试用】二、USB库移植与双USB CDC-ACM功能开发
【GD32F427开发板试用】三、USB转CAN功能开发与试用总结

3.USB库移植

GD的USB库在

GD32F4xx\\_Firmware\\_Library\\_V3.0.2\GD32F4xx\\_Firmware\\_Library\Firmware\GD32F4xx\\_usb\_library

中,然后他们提供了demo,demo在

GD32F4xx\\_Firmware\\_Library\\_V3.0.2\GD32F4xx\\_Firmware\_Library\Examples\USB

里面,这里可以选,作为host还是device,然后device模式的时候有多种模式。

这里笔者使用的是device模式,和上位机的USB通信模式可以用cdc-acm也可以用hid。作为 cdc-acm的时候,对于上位机,它类似于一个高速的串口,如果是上位机运行linux,会容易开发一点。

这里可以识别到GD32的CDC\_ACM设备为high-speed,说明USB3300已经正常工作了。

然后测试收发

可以看到发送的内容都接收到了,说明USB 收发正常。

4.双USB CDC-ACM功能开发

所谓的双USB CDC-ACM,就是使用USB复合设备,一个USB设备上面有几种功能。最典型的应用的就是4G模块。

GD原生并不支持双USB CDC-ACM,不过他们给了一个复合设备的demo,是hid+打印机的,可以在GD32F4xx\\_Firmware\\_Library\Examples\USB\USB\\_Device\composite\\_dev\\_hid\\_printer找到它。然后网上有人基于STM32F7设计过多个USB
CDC-ACM复合设备(https://shequ.stmicroelectronics.cn/forum.php?mod=viewthread&tid=613510)。那么可以基于这些工程来进行GD32F427上面双USB CDC-ACM的开发。

GD的USB库跟ST的USB库整体框架差不多,看下面这个图就能明白。

endpoint是usb的最小通信单元,GD32F427的USBFS有8个endpoint,四收四发,USBHS有12个endpoint,6收6发。一个CDC-ACM需要三个endpoint,命令端口收一个,数据端口收发各一个。端点0的收发都不能占用,是用于USB匹配的。因此要实现两个USB-ACM复合,只能使用USBHS。USB各个class从endpoint里面拿到数据之后可以根据各自协议的不同来实现协议解析,定长度传输等。CDC-ACM是最简单的,endpoint里面拿到的就是原始数据,不用转换。而像CDC-ECM这种,里面的数据则是要经过IP TCP(UDP)等协议转换之后才能给到应用层处理。

下面针对开发步骤进行说明。

1、模板使用的是GD的工程里面单USB
CDC-ACM的。新建一个源文件,比如叫做dual\\_cdc\\_acm.c,将cdc\\_acm\\_core.c里面的内容复制进去。

2、注意到USB的初始化函数

关注它最后两个参数,前面那个是USB描述信息,也就是给端点0用于与HOST端进行匹配的。后面那个是一系列回调函数,用于中断里面事务处理。这里新建两个结构体

3、修改USB描述信息,结构体usb\\_desc\\_dev

这里bDeviceClass要改为0xEF,意思是USB复合设备,然后bDeviceSubClass是USB\\_CLASS\\_CDC,也就是0x02,最后一个实测没什么影响。

修改config信息。这个config信息其实用一个大的数组来存放会更加灵活

这个dual\\_cdc\\_acm\\_config\\_desc的信息按照那篇基于STM32F7的多个USB
CDC-ACM复合设备的文档改就行。这些都是标准的。

4、改回调函数,其实重点改后两个,也就是数据收发的就行。GD的是只有一个cdc设备,要改成支持两个,就要判断一下数据是哪个端点来的,要发往哪个端点。

5、分配endpoint,对应两组CDC设备。

6、包装收发函数各一个给应用层调用。如果是在rtos下面使用,发送函数建议加个锁,以免并行的时候多个线程同时写endpoint里面的数据

完成这些步骤之后,可以写一回环的demo验证一下

编译,下载到开发板之后,插电脑,可以看到两个USB设备

然后可以用串口工具测试下收发。

可以看到回环测试成功,PC端发出去的数据跟收到的一样。

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

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

相关文章

SSM之前回顾

1、技术栈总览 学习要搞清楚你的目标;先学C/JAVA;搞程序不要太浮躁; java基础:计算机基础、写博客、java基础语法、流程控制和方法、数组、面向对象、异常、常用类、集合框架、IO、多线程、GUI、网络编程、注解与反射、JUC编程、…

操作符详解(上篇)

前言小伙伴们大家好,随着对c的不断学习今天我们将来学习操作符。在初始c语言中也介绍过操作符但也只是点到即可,今天我们将详细了解操作符。操作符分类:算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号…

不用自己排版设计的海报设计工具!在线海量模板!

人才招聘旺季,如何再众多的招聘海报中脱颖而出,招聘到心意人才呢?HR要如何排版设计招聘海报呢?只需跟着小编下面的乔拓云工具使用教程,不仅能帮你解决海报设计文案灵感和排版灵感,还不需要任何设计基础就能…

15.面向对象程序设计

文章目录面向对象程序设计15.1OOP:概述继承动态绑定15.2定义基类和派生类15.2.1定义基类成员函数与继承访问控制与继承15.2.2定义派生类派生类对象及派生类向基类的类型转换派生类构造函数派生类使用基类的成员继承与静态成员派生类的声明被用作基类的类防止继承的发…

【虹科公告】好消息!云展厅开放时间长达1年,2023年不限次云观展

云展厅开放通知 2023年,【虹科赋能汽车智能化云展厅】将持续开放,开放时间长达一年,开放期内,均可进入观展,没有次数及观看时长限制,欢迎大家随时进入云展厅观展。 虹科赋能汽车智能化云展厅 聚焦前沿技…

【手撕面试题】HTML+CSS(高频知识点五)

目录 面试官:css 如何实现左侧固定 300px,右侧自适应的布局? 面试官:flex 布局中 align-content 与 align-items 有何区别? 面试官:Grid 布局的优势在哪里? 面试官:Flex 布局中的…

【1797. 设计一个验证系统】

来源:力扣(LeetCode) 描述: 你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在 currentTime 时刻之后 timeToLive 秒过期。如果验证码被更新了,那么它…

游戏多开的分析与实现

大部分游戏为了防止工作室通过多开游戏牟利,都会采取各种手段来防止游戏被多次打开。检测窗口标题,创建互斥体,创建内存映射这些都是防止游戏多开的常用手段。 主要内容 游戏运行后,无非执行两步操作 若已经存在,退出…

【问题代码】顺序点的深入理解(汇编剖析+手画图解)

这好像是一个哲学问题。 目录 前言 一、顺序点是什么? 二、发生有关顺序点的问题代码 vs中: gcc中: 三、细读汇编 1.vs汇编如下(示例): 2.gcc汇编如下(示例): 四…

R语言raster包遍历多个文件夹并批量计算每一个文件夹下全部遥感影像的平均值

本文介绍基于R语言中的raster包,遍历读取多个文件夹下的多张栅格遥感影像,分别批量对每一个文件夹中的多个栅格图像计算平均值,并将所得各个结果栅格分别加以保存的方法。 其中,本文是用R语言来进行操作的;如果希望基于…

每天10个前端小知识 【Day 9】

前端面试基础知识题 1. bind、call、apply 有什么区别?如何实现一个bind? apply、call、bind三者的区别在于: 三者都可以改变函数的this对象指向三者第一个参数都是this要指向的对象,如果如果没有这个参数或参数为undefined或null&#x…

智能硬件的工作原理与发展定位

一、硬件概述 智能硬件是以平台性底层软硬件为基础,以智能传感互联、人机交互、新型显示及大数据处理等新一代信息技术为特征,以新设计、新材料、新工艺硬件为载体的新型智能终端产品及服务。 与传统硬件相比,智能硬件相比传统硬件&#xf…

【LeetCode每日一题】【2023/2/9】1797. 设计一个验证系统

文章目录1797. 设计一个验证系统方法1:哈希表代码总体1797. 设计一个验证系统 LeetCode: 1797. 设计一个验证系统 中等\color{#FFB800}{中等}中等 你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在…

java 线程池

线程池概念 线程池可以看做是一个池子,在这个池子中存储了很多线程,线程池也可以说是一个复用线程的技术。 线程池存在的意义 系统创建一个线程的成本是比较高的,因为它涉及到与操作系统交互,当程序中需要创建大量生存期很短暂的线…

ChatGPT edge/chrome浏览器离线安装

最近chatgpt又热了起来,数据显示很多朋友过来下载浏览器插件,由于大家无法直接访问谷歌应用市场,因此提供一个离线安装的方式。 火热程度 对于大多资本与巨头来说,入局ChatGPT赛道,看中的无疑是ChatGPT概念背后的…

【自学Docker】Docker push命令

大纲 Docker push命令 docker push命令教程 docker push 命令用于将本地的 Docker镜像 上传到 Docker镜像仓库。 docker push命令使用之前需要要先登陆到镜像仓库。docker push命令推送镜像的规范是:注册用户名/镜像名。 docker push命令语法 haicoder(www.hai…

矩阵理论复习(十一)

正交投影矩阵的应用 值域与零空间 证明向量二范数 如何由已知范数构造新的范数 椭圆范数 向量范数的分析性质 向量范数的等价性 在无限维线性空间中,两个向量范数可以是不等价的。 等价性的重要意义:处理向量问题时,可以基于一种范…

ASO优化之如何进行榜单优化

ASO优化有:搜索优化,榜单优化,转化率优化。今天我们主要来讲讲苹果应用商店的榜单优化。 榜单优化的核心内容就是提高应用商城的排名,把我们的APP提升到显眼的位置,增加曝光率,提升APP的下载量。 那我们具…

easyx的基本使用(万字解析)

easyx的基本使用一.基本框架1.创建文件2.创建窗体-initgraph,closegraph,getchar二.简单的绘制1.圆形-circle2.坐标系统-setorigin,setaspectratio三.简单图形1.绘制点-putpixel2.简单的直线-line3.矩形-rectangle4.椭圆-ellipse5.圆角矩形-roundrect6.扇形-pie7.圆弧-arc四.多…

目标检测回归损失函数 IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU损失函数分析

目标检测回归损失函数 IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU损失函数分析 一、IOU Loss 2016文章《UnitBox: An Advanced Object Detection Network》中提出了IOU Loss将4个点构成的box看成一个整体做回归。 函数特性 IOU Loss的定义是先求出预测框和真实框…