STM32 USB 之从0开始移植笔记

2023-05-16

STM32 USB 之从0开始移植笔记

 

 

        -----------------------------------动机-----------------------------------

写在前面的话:最近逛淘宝无意间发现RC522居然只要10元左右就可以包邮买到,真是太便宜了,就忍不住买了个回来玩玩。到货移植到我的板子上OK 后突然发现我的USB口紧张了,一个用来给板子供电一个插jlink 一个插入usb转串口给RC522下命令。就想着将板子供电和RC522传输用一个USB接口来实现。这就是这次折腾USB的来由~-~

       ----------------------------------开始折腾USB-----------------------------

  首先我想拿来主义,百度一个完整的USB范例就完事。以上就百度了下STM32 USB HID

那就一个多啊,已是我就下一个看一个看是否适合我用。很快我就发现了两个问题不能说所有至少我百度到到都是这样:

1.      这些范例大都是在官方USB范例上修改得来,工程名都没做修改。

2.      这些范例大都是用的3.xUSB FW,官网上我搜到的已是4.0

3.      这些范例中STM中为了兼容他的N个板子做了很多通用性的处理。这些对于初学者来说不够清晰明了。

所以我决定从0开始构建一个方便移植的模块,移植他的JoyStickMouse。在我的项目中用到时加入这个模块即可。

首先从官网下载最新的USB得到的是一个压缩包stsw-stm32081.zip解压后如图:

       

Projects 是官方的范例,Libraries USB4.0驱动

接下来用MDK建立一个工程我用的MDK4.12  STM的固件库是3.5 USB库就是4.0的了,芯片用的是STM32F103VC   建立以下文件夹

 

USBFW 下建立两个文件夹分别存放USB的底层驱动文件和中间层接口文件并把STM32_USB-FS-Device_Lib_V4.0.0\Libraries\STM32_USB-FS-Device_Driver中的incsrc复制到DRIVER文件夹内,把STM32_USB-FS-Device_Lib_V4.0.0\Projects\JoyStickMouse中的incsrc复制到MID文件夹内。一般我们只要修改MID层的文件而DRIVER是不用修改的。

 

  建好后的工程截图:

     

这个时候编译下可能出来一大堆的错误。这个USB的源码分析百度有很多很好的文章讲解的非常详细大家可以自行百度。

  接下来说说我的修改----------------------------------------

首先在usb_conf中定义了Buffer Description Table 

     

 这个0x18意味着24字节给table  只用到3个端点了,一般我们用端点0枚举,端点1输入,端点2输出这个定义是够用了,如果你的端点应用大于3 就要修改这个表的大小了。

-------------------------------------------修改硬件抽象---------------------------------------------------------

在有3个文件相关:

1.      platform_config.h  STM官方板子的资源平台配置文件。

2.      hw_config.c   hw_config.h  USB的硬件相关配置

首先我用的不是官方板子,把#include "platform_config.h"注释掉只保留其中的IDUSB接入检测机制的上拉控制IO宏定义(我的板子是PC6,这个根据实际情况修改即可)

  

  官方范例中在main

Set_System();

 

 USB_Interrupts_Config();

 

 Set_USBClock();

 

USB_Init();

完成了USB的初始化工作,

Set_System();

这个名字太大了,很显然用在我的项目中太大好听,修改hw_config.c

    voidUSB_Configurage(void)

{

         GPIO_InitTypeDefGPIO_InitStructure;

        

         /*enable the PWR clock */

         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);

         //USB用的IO

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

         //USB时钟

         Set_USBClock();

 

        

        

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

         GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6;

         GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

         GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_OD;

         GPIO_Init(GPIOC,&GPIO_InitStructure);

 

        /*C6-USB接入控制口 */

           /* Enable the USB disconnect GPIO clock */

           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT,ENABLE);

           /* USB_DISCONNECT used as USB pull-up */

           GPIO_InitStructure.GPIO_Pin =USB_DISCONNECT_PIN;

           GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;

           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

           GPIO_Init(USB_DISCONNECT,&GPIO_InitStructure); 

 

         USB_Cable_Config(DISABLE);

         USB_Cable_Config(ENABLE);

 

         USB_Interrupts_Config();

         USB_Init();

}

最后在usb_pwr.c 做些小改动,因为不知道他那个板子是怎么唤醒的,所以把那些都屏蔽掉了。具体见代码咯

 

这样在main.c只要USB_Configurage(); 就搞定USB初始化了,当然还要在h文件中做些接口声明和去掉一些和我的板子硬件关系不大的函数,目的只有一个简单明了。

 

编译一下,通过。这样以后在任何一个项目中要用到USB时只要复制USBFW中的文件,然后小改下MID层的文件就可以用上USB了,在main.c中只要

#include"usb_lib.h"

#include"hw_config.h"

#include"usb_pwr.h"

 在任何需要发送数据的地方将数据写入buff就完成了,当然不同的应用可能还要修改端点初始化和描述符等等,但这些应该都是大把的例子可以参照复制的了。具体看代码咯个人觉得stc应用还是很好的特别是指针函数数组这块 ~-~

我的板子用了4个按键(PD3:6)来控制PC的光标4个方向的移动,将代码下到板子上的结果就是按下相应的按键光标就移动咯

至此就移植完了,接下来继续移植官方的另外几个例子

 代码下载     http://download.csdn.net/detail/gzzxbcxm2005/9513812 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 USB 之从0开始移植笔记 的相关文章

  • 熊迈摄像头SDK二次开发:登录、截屏、录像等功能

    对雄迈摄像头二次开发 xff0c 因为雄迈给的资料比较混乱 xff0c 没有找到可用的sdk手册 xff0c 所以一开始想用OpenCV 43 qt 但是在Windows环境下 xff0c opencv摄像头读取卡顿严重 xff0c 而且o
  • ros学习(2-2):ros节点创建(python)

    参考 Python创建简单的ROS节点 xff1a 用Python实现ROS节点 xff08 这里也说明了用Python写ROS功能包也是需要CMakelists txt的 xff09 https blog csdn net sinat 1
  • Ubuntu下使用眼动仪Tobii Eye Tracker 4C

    01 安装 amp 使用 安装 使用过程参考 xff1a https github com Eitol tobii eye tracker linux installer 下面过程主要是github中自述文件的翻译 下载 在新终端 xff0
  • 深度学习之卷积

    01 卷积 卷积是指在滑动中提取特征的过程 xff0c 可以形象地理解为用放大镜把每步都放大并且拍下来 xff0c 再把拍下来的图片拼接成一个新的大图片的过程 2D卷积是一个相当简单的操作 xff1a 我们先从一个小小的权重矩阵 xff0c
  • Ubuntu 18.04 安装网卡驱动(有线连接)

    之前一直用小米的驱动 xff0c 但是感觉太慢了 xff0c 所以还是决定使用有线连接 但是之前进入Linux系统后 xff0c 有线连接没有 xff0c 所以需要安装驱动 01 查询网卡类型 xff08 Windows xff09 进入w
  • realsense d435i获取某像素点三维坐标(计算深度和点云两种方法)

    这篇写的比较详细但也比较乱 xff0c 另一篇思路更清晰和简介一点 xff0c 可供参考 xff1a Ubutntu下使用realsense d435i xff08 二 xff09 xff1a 获取某二维像素点的三维坐标 00 说明 代码1
  • Ubuntu18配置与ROS兼容的深度学习环境(Anaconda3+PyTorch1.10+python3.8+cuda10.2)

    之前在Window下安装了Anaconda xff0c 熟悉了一下安装过程 xff0c Ubuntu下最难的应该就是和ROS的兼容问题 ROS是基于Python2 7的 xff0c 而Anaconda3则是python3 看有的博文说需要先
  • Ubutntu下使用realsense d435i(三):使用yolo v5测量目标物中心点三维坐标

    01 参考 本文下述使用参考的的工程均来自于下面的两个github yolo v5参考的代码 xff1a https github com ultralytics yolov5本文参考的代码 xff08 仅获得深度 xff09 xff1a
  • 使用IAR embedded workbench for MCS-51编写的一个示例程序

    新下了一个IAR xff0c 不知道该IDE是否好用 xff0c 使用了一个程序测试了一下 xff0c 并烧到89c51上 include 34 ioAT89C51 h 34 void delayms unsigned int number
  • 如何查看ROS话题的频率

    可以使用rqt工具查看 rosrun rqt topic rqt topic 在话题名称前面选中就可以查看话题的type 频率以及发布的信息 感觉这个要比直接在命令行rostopic查看方便一点
  • UR+RealSense手眼标定(eye-to-hand)

    01 手眼标定的原理 基坐标系 xff08 base tree xff09 和相机 xff08 camera tree xff09 两个坐标系属于不同的tree xff0c 通过将标签贴到手上 xff0c 相机识别出标签的position和
  • Ubuntu18.04安装手控器

    参考 xff1a 官网教程 xff1a https s3 amazonaws com dl 3dsystems com binaries Sensable Linux Touch Device Drivers 2019 2 15 Linux
  • ros tf坐标

    参考 xff1a 讲解 xff1a https www bilibili com video BV1zt411G7Vn p 61 18 amp vd source 61 3a1ad336af3eaae4fcced56c75d309d1ROS
  • 使用代理时网页访问正常,git无法clone

    明明已经使用了vpn xff0c 命令行还git clone一直被拒绝 fatal unable to access span class token string 39 https github com pytorch vision 39
  • rosbag修复

    span class token comment 等待修复 xff0c 按照录制包的大小时间可能长也可能短 span rosbag reindex xxx bag active xff1b span class token comment
  • 【HNU-CSEE jetson nano 番外篇】jetson nano与显示器的连接

    前言 首先需要搞清楚VGA信号和HDMI信号的大致区别 二者都是主机与显示器之间传输图像的协议 xff0c 但HDMI传输的是图像数字信号 xff0c VGA传输的是图像模拟信号 xff0c 因而两者之间 xff0c 如果要进行切换的话 x
  • 【教程】简单5步教你手机制作寸照、证件照、照片回执

    我们日常生活中需要用到证件照的地方有很多 xff0c 求职入学 考试报名 办理证件 出国旅行等场合 xff0c 都离不开要用到电子证件照或纸质证件照 不想一遍遍跑照相馆的 xff0c 那就来学一学如何用手机直接生成证件照吧 xff0c 操作
  • Android5.0+ Camera专栏终结

    本文均属自己阅读源码的点滴总结 xff0c 转账请注明出处谢谢 欢迎和大家交流 qq 1037701636 email gzzaigcn2009 64 163 com Software xff1a 系统源码Android5 1 寥寥几笔写在
  • 写给我的2013

    前沿 xff1a 代码看的累了 xff0c 在新的一年终于可以找点时间来回忆我的2013 想着要写点什么 xff0c 可是又没有什么可以写 因为回忆无非就是夹杂着些许痛苦与欢乐 写给我的2013 家 生活 xff1a 2013年 xff0c
  • 自动控制原理(4)——传递函数、典型环节的传递函数

    自动控制原理 xff08 4 xff09 传递函数 典型环节的传递函数 微分方程模型 优点 xff1a 是时间域的数学模型 xff0c 比较直观 xff0c 它用时间域的方式 xff0c 描述系统输入和输出变量之间的关系 在给定初始条件和输

随机推荐