STM32 USB 之从0开始移植笔记

STM32 USB
之从0开始移植笔记

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

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

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

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

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

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

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

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

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

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

Projects 是官方的范例,Libraries
是USB的4.0驱动

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

在USBFW
下建立两个文件夹分别存放USB的底层驱动文件和中间层接口文件并把STM32_USB-FS-Device_Lib_V4.0.0\Libraries\STM32_USB-FS-Device_Driver中的inc和src复制到DRIVER文件夹内,把STM32_USB-FS-Device_Lib_V4.0.0\Projects\JoyStickMouse中的inc和src复制到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"注释掉只保留其中的ID和USB接入检测机制的上拉控制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就完成了,当然不同的应用可能还要修改端点初始化和描述符等等,但这些应该都是大把的例子可以参照复制的了。具体看代码咯个人觉得st的c应用还是很好的特别是指针函数数组这块
~-~

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

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

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

时间: 2024-08-27 09:03:37

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

cocos2d-x 3.0游戏实例学习笔记 《跑酷》移植到android手机

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本重写的,目前我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 好吧,自从上次<跑酷>完结之后,就什么没做什么的,主要是修复了一点点bug ,也在相应的文章里面做出了相应的改动.不过,只能在window上看着玩又有什么太大意思呢!!!于是乎又尝试着弄到手机上试试--OK,初生牛犊不要脸,哦不!不怕喷.这里记录一下我的移植过程.(这里会用到新的大小的资源.待会也会

FreeRTOS STM32移植笔记

FreeRTOS STM32移植笔记

STM32 USB虚拟串口(转)

源:STM32 USB虚拟串口 串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出.很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发.本章节来简单概述STM32低端芯片上的USB虚拟串口的移植.在官方DEMO中已经提供了现成的程序,这里对修改方法做简单说明. 官方demo及驱动程序,我存放在百度盘: http://pan.baidu.com/s/1hq3moE4 首先打开官方demo我们开始进行移植,第一步复制我们可用的文件,操作如下: Projects\Virt

[stm32] MPU6050 HMC5883 Kalman 融合算法移植

一.卡尔曼滤波九轴融合算法stm32尝试 1.Kalman滤波文件[.h已经封装为结构体] 1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics-> All rights reserved-> 2 3 This software may be distributed and modified under the terms of the GNU 4 General Public License version 2 (GPL2) as

STM32 USB Virtual COM

STM32 USB Virtual COM USB转串口的功能实现 这次讲的是如何实现USB转串口功能的实现.首先看看工程的布局吧: 我们主要要介绍的文件的在USB_User这个组文件.从上面的截图可以看到USB_User这个文件由hw_config.c.usb_desc.c.usb_endp.c.usb_istr.c.usb_prop.c.usb_pwr.c几个文件组成.其中usb_istr.c和usb_pwr.c整两个文件不用修改,其他的文件都需要修改.下面接慢慢将来. 首先讲讲hw_con

lwIP移植笔记 - OS篇

lwIP作为RTOS准标配的TCP/IP,在我们编写网络模块时,经常用到. 本移植笔记使用lwIP的版本为V1.4.1. MDK:            V4.0+ RTOS:          μC/OS-II V2.91 Eval-Board: LPC1752 Ethernet:     ENC28J60 移植lwIP到OS其实就是实现sys.h的过程. 移植文档(doc\sys_arch.txt) Since lwIP 1.4.0, semaphore and mailbox functi

STM32 USB 问题汇总(转)

源:STM32 USB 问题汇总 汇总1:STM32的USB例程修改步骤,来自http://blog.csdn.net/cy757/archive/2010/01/01/5117610.aspx 以下是笔者将ST的Custom_HID例程修改为“自定义USB设备”例程时总结出来的,因为笔者也是刚刚学USB开发不久,某些方面理解错误在所难免,请各位大虾指正. 一.usb_desc.c文件 根据你程序使用的通信方式修改.usb_desc.h文件中定义要根据usb_desc.c文件中的数组的大小:Co

STM32 USB应用——VCP

目录: 1.STM32 USB开发工具用户手册 2.STM32 USB固件库 3.实现例程 总结:如果老板给你一个VCP的项目,怎样才能快速的开发呢,其实有两条方法,其中一条是根据USB库文件一步一步的移植,一步一步的修改,这个可以参考参考圈圈叫你玩USB这本书,但是,第二条方法其实更好,ST公司,早就写好了VCP的demo,所以只要直接使用它的程序就可以省下很多的时间成本. 很多东西,其实我们只要会用就可以了,凡事亲力亲为,重头做起那是有多蠢啊,站在巨人的肩膀上,才能看的更高,走的更远, 1.

以太网芯片W3100A到W3150A+的移植笔记(一)

最近很多用户咨询 W3100A,由于W3100A已经停产.在此希望给大家介绍一下,W3100A可移植到其他芯片的方式及途径,供大家更好的拓展您项目的沿用性,期待能对您有所帮助.今天先为大家介绍第一部分的内容. 此移植笔记描述了设计者及程序员应在 W3100A到W3150A+的移植 过程中注意的问题.更多关于W3150A+的信息,请参考W3150A+数据手册. 1 对比 1.1 移植的优势及挑战 这部分强调了W3100A到W3150A+过程中涉及的多方面优势及问题.在维持很多W3100A的特性方面