STM32 USB 之从0开始移植笔记

发布者:变形金刚最新更新时间:2018-09-14 来源: eefocus关键字:STM32  USB  移植笔记 手机看文章 扫描二维码
随时随地手机看文章

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

写在前面的话:最近逛淘宝无意间发现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 


关键字:STM32  USB  移植笔记 引用地址:STM32 USB 之从0开始移植笔记

上一篇:移植STM32固件库用于HID双向通信
下一篇:STM32 USB学习笔记8

推荐阅读最新更新时间:2024-03-16 16:14

iPhone 15曝光:USB-C和钛合金都来了
爆料大神古尔曼带来了新的关于iPhone 15的消息,苹果计划将灵动岛扩展到iPhone 15的所有四款机型,且将标配USB-C接口,对于用户来说是个好消息。 古尔曼之前曾暗示iPhone 15 Pro Max可能会被命名为iPhone 15 Ultra,新的消息也证实了这个说法,新的4款机型分别为6.1英寸的iPhone 15、6.7英寸的iPhone 15 Plus、6.1英寸的iPhone 15 Pro和6.7英寸的iPhone 15 Ultra。 此外古尔曼还证实了一些传言,即iPhone 15 Pro型号将采用钛合金边框,并配备带有触觉反馈的音量按钮。该设备内部的两个新的触觉引擎将模拟按钮被按下的感觉,而不是物理
[手机便携]
STM32生态系统工具和软件介绍
STM32能被这么多开发者认可,它的强大生态系统起了关键作用。本文围绕STM32生态各软件工具进行相关描述,其中包含一些技术细节。 一、STM32生态系统总预览STM32提供了全套开发工具,以及开发所需的软件包,下面看一张图,从全局来了解STM32生态系统工具和软件: 主要分为两大类:1.软件工具:即左边部分的STM32CubeMX、 CubeIDE、 CubeProgrammer、 CubeMontor等。 2.嵌入式软件包:STM32CubeMCU Packages 和 扩展软件包CubeExpansions. STM32Cube生态系统几个特点: 免费自由使用; 接口一致,方便移植 可裁剪、可扩展 易使用和理解 节约
[单片机]
<font color='red'>STM32</font>生态系统工具和软件介绍
STM32时钟配置及相关问题
Ⅰ、写在前面 最近有很多朋友问: 1.我的USART串口打印出来的数据是乱码? 2.我的TIM定时器延时或定时不准确? 常见可能原因: 1.晶振问题:外部晶振不起振、或频率与配置不匹配。 2.软件问题:分频、倍频、时钟源选择等。 总结来说,主要还在于软件的问题。因为即使没有外部晶振,也可以使用内部晶振。 其实,软件的问题是容易得到解决的,只要你了解了STM32时钟配置里面具体内容就知道了。 关于本文的详细内容请看下面章节 Ⅱ、本文要点 要了解时钟的配置,就需要知道它在哪里配置,也就是还需要了解软件执行的流程。 1.软件流程 说软件流程是让大家知道系统时钟配置的位置。不管是使用寄存器开发,还是使用库(标准库、
[单片机]
<font color='red'>STM32</font>时钟配置及相关问题
STM32 上电后的启动过程
微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。相信读者都可以回答这个问题,答案也许大同小异,但肯定都有个关键词,叫“启动文件”,用英文单词来描述是“Bootloader”。 无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。最为常见的51,AVR或MSP430等微控制器当然
[单片机]
【乐拓USB示波器免费试用连载】CAN总线协议分析
CAN总线接口协议分析 通过OSC482L进行CAN总线接口的分析,仪器可选多种测量方式,可以支持单线或双线方式测量。单线测试测量可以支持自动,CAN_H对地,CAN_L对地三种方式,双线差分方式测量支持自动,和A-B通道差分。 本次测试采用单线CAN_H对地的方式。 外部为两个CAN总线设备,将A通道表笔分别和CAN_H和地接好,启动上升沿单次触发方式。 通讯中实际周期性的发送CAN的标准帧ID为0x70A,一个字节长度,D0为0x7F。 实际捕获后,适当调整波形在屏幕上的位置,可以观察到软件对于CAN总线波形的分析结果是完全正确的。 调整内容再次发送,然后启动捕捉功能,可以看到示波器捕捉到CAN数据帧,并正确的分析出
[测试测量]
【乐拓<font color='red'>USB</font>示波器免费试用连载】CAN总线协议分析
STM32 常用GPIO操作函数记录
STM32读具体GPIOx的某一位是1还是0 1 /** 2 * @brief Reads the specified input port pin. 3 * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. 4 * @param GPIO_Pin: specifies the port bit to read. 5 * This parameter can be GPIO_Pin_x where x can be (0..15). 6 * @retval The input port pin value. 7 */
[单片机]
DSP与STM32区别
关于DSP和普通51 AVR还有STM32的区别 DSP是为运算而生的芯片,他最强大的地方就在与它的数**算性能,那是由它的指令集支持的。那些拿DSP和STM32比较的,省省吧,如果你两者都熟悉你就知道根本没啥好比的, 如果我需要很多高级的接口,比如以太网和USB,那么我自然选STM32,如果我需要实现一些算法,那肯定会选DSP。如果你对运算速度不敏感,反正72M的速度已经比原先单片机快很多了,那当然是看你熟悉哪个,哪个价格比较好,支持比较好。 从51 AVR到DSP最大的障碍   1、应该是编译环境吧,TI的DSP都用的是CCS,CCS界面和原先IAR区别不是一般的大,比如程序导入,比如观察变量,比如烧写FLASH
[单片机]
采用STM32 单片机的太阳能LED街灯解决方案
  随着化石类能源的日益减少,以及温室气体的过度排放导致全球变暖问题越来越受到重视,人们一方面在积极开发各类可再生新能源,另一方面也在倡导节能减排的绿色环保技术。太阳能作为取之不尽、用之不竭的清洁能源,成为众多可再生能源的重要代表;而在照明领域,寿命长、节能、安全、绿色环保、色彩丰富、微型化的LED固态照明也已被公认为世界一种节能环保的重要途径。太阳能-LED街灯同时整合了这两者的优势,利用清洁能源以及高效率的LED实现绿色照明。   本文介绍的太阳能-LED街灯方案,能自动检测环境光以控制路灯的工作状态,最大功率点追踪(MPPT)保证最大太阳能电池板效率,恒电流控制LED,并带有蓄电池状态输出以及用户可设定LED工作时间等功
[电源管理]
采用<font color='red'>STM32</font> 单片机的太阳能LED街灯解决方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved