STM32开发笔记21: USB驱动的移植

发布者:csZhou最新更新时间:2019-06-12 来源: eefocus关键字:STM32  开发笔记  USB驱动  移植 手机看文章 扫描二维码
随时随地手机看文章

现在使用的STM32L053R8T6单片机带有USB接口,原先一直使用UART转USB芯片来完成USB功能的支持,现在这款单片机带了就希望使用以下。由于已经建立了自己的工程目录,再重新使用STM32CubeMX生成的工程文件,重新建立是不显示的,所以本文探索将USB驱动文件移植到自己项目中的方法,我使用的是USB的CDCD类,步骤如下:


    1、使用STM32CubeMX使能USB,如下图所示:


    2、设置时钟,USB需要48M时钟,使用内部和外部均可,我这里使用外部时钟。


    3、生成工程文件。


    4、在自己的工程目录中加入如下图所示的2个文件,如果此2个文件不存在,则从新生成的工程目录中复制即可(包含头文件)。



    5、在自己的工程目录中加入以下4个文件,这4个文件需从新生成的工程目录中复制(包含头文件)。



    6、在自己的工程目录中加入或更新以下文件,USB开头的文件需要从新生成的工程目录中复制(包含头文件),其余文件需要更新。



    7、如果使用C++进行程序设计,按照STM32L0开发笔记4: 解决使用--CPP11编译USB驱动报错问题对代码进行调整。


    8、如果希望分层次编译,可按照STM32L0开发笔记3: 使用静态库加快Keil编译速度方法,生成静态库。


    9、更新时钟设置程序,一定要更新。


    10、在main.cpp中,包含usb_device.h文件,并调用MX_USB_DEVICE_Init函数初始化USB,样例程序如下:


#include "include.h"

#include "usb_device.h"

 

CTarget Target;

 

boolean bMilliSecond_1000 = FALSE;

boolean bMilliSecond_100 = FALSE;

 

int main(void)

{

uint8_t temp[3] = {0xC1, 0xC1, 0xC1};

MX_USB_DEVICE_Init();

  while (1)

  {

if (bMilliSecond_1000 == TRUE)

{

bMilliSecond_1000 = FALSE;

Target.HAL.LED.Turn();

Target.HAL.TestUart1.SendData(temp, 3);

}

if (bMilliSecond_100 == TRUE)

{

bMilliSecond_100 = FALSE;

Target.HAL.E0.Turn();

Target.HAL.E1.Turn();

Target.HAL.E2.Turn();

Target.HAL.E3.Turn();

}

if (Target.HAL.TestUart1.IsReceivedData() == TRUE)

{

Target.HAL.TestUart2.SendData(Target.HAL.TestUart1.u8_Buffer, Target.HAL.TestUart1.u16_Number);

}

  }

}

    11、对文件进行编译,下载程序。


    12、硬件USB的USB_DP引脚需要1.5K上拉,务必注意,我就没有上拉,后来在PCB上飞的线。


    13、进入ST的官网,搜索32102,下载CDC驱动。



    14、解压缩后,根据自己的操作系统,选择相应的驱动库进行安装。


    15、如果一切正常,可以将设备通过USB口接入计算机,按照提示安装完驱动程序后,就可以看到相应的虚拟串口了。



    至此,一切完成。


关键字:STM32  开发笔记  USB驱动  移植 引用地址:STM32开发笔记21: USB驱动的移植

上一篇:基于stm32f10x单片机USB流程理解
下一篇:STM32开发笔记34:USB CDC驱动程序的详细移植过程

推荐阅读最新更新时间:2024-11-11 05:36

STM32 ST-LINK Utility的使用
STM32 ST-LINK Utility软件主要的功能就是量产(批量下载代码的工具)。 它也是比较实用的一个工具,当我们需要查看芯片FLASH数据时,可以很快定位查找到想要的数据(前提是没有添加保护)。 需要配和STLink使用。 接线,SWD接口。 VCC GND SCLK SDIO和单片机分别相对即可! keil在线使用 选择ST-Linker Debugger 这里务必检查,又没出出现DeviceName,没有出现的话就得,重新检查接线!! 擦除整片扇区,然后选择相应的Flash大小编程算法,比如我用C8T6,那就选对应128K的F10X算法! 最后load
[单片机]
<font color='red'>STM32</font> ST-LINK Utility的使用
基于STM32的Uart2串口问题
买了一块1元的活动板子,移植了RTT(RT-THREAD)的国人嵌入式操作系统。系统能够正常跑起来,接着就按照RTT的官网教程,写了一个串口驱动。 原来定义的是UART1的端口,但是没有找到板子的USART1的引脚,虽然STM32可以映射,但是仍然没有看到有甩出来的引脚。初略看了一下官网的使用手册,发现图上有USART2引出来。 上图看一下, 好家伙,那就直接接地,接TX与RX到PC端的USB转串口吧。 杯具来了,发现无论如何自己的程序都没有输出打印,怀疑自己的代码有问题。用mbed的示例BIN文件试试,也发现不行。难道是电平问题?换了别人使用的开发板与PC的USB转串口,oh mygod!!还是不行。 心灰意冷,
[单片机]
基于<font color='red'>STM32</font>的Uart2串口问题
STM32在线升级IAP-IAP的介绍
IAP(In Application Programming)即在应用编程,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。 通常实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作: 1)检查是否需要对第二部分代码进行更新
[单片机]
STM32学习之路-SysTick的应用(时间延迟)
前面已经说了SysTick的工作原理什么的了,这里就不说了.. 先来做第一个实验: 盗自奋斗的例子,嘿嘿, 用SysTick产生1ms的基准时间,产生中断,每秒闪烁一次(LED1 V6) (1)外围时钟初始化(系统时钟初始化这里就不写了,上次说了) (2)LED初始化 (3)SysTick配置 (4)中断优先级 (5)中断处理函数 (6)延迟函数 OK,上代码: (1)外围时钟初始化 void RCC_Config(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_A
[单片机]
<font color='red'>STM32</font>学习之路-SysTick的应用(时间延迟)
三种串口接收不定长数据方法详解
方法1:串口接受数据,定时器来判断超时是否接受数据完成。 方法2:DMA接受+IDLE中断 实现思路:采用STM32F103的串口1,并配置成空闲中断IDLE模式且使能DMA接收,并同时设置接收缓冲区和初始化DMA。那么初始化完成之后,当外部给单片机发送数据的时候,假设这帧数据长度是200个字节,那么在单片机接收到一个字节的时候并不会产生串口中断,而是DMA在后台把数据默默地搬运到你指定的缓冲区里面。当整帧数据发送完毕之后串口才会产生一次中断,此时可以利用DMA_GetCurrDataCounter();函数计算出本次的数据接受长度,从而进行数据处理。 应用对象:适用于各种串口相关的通信协议,如:MODBUS,PPI ;还有
[单片机]
STM32库内程序一些好的编程思路、方法及好的程序
下面这些是在STM32的库文件中摘抄的,可以在以后的编程中利用这些方法。 以下为把IO口转化为一个结构体指针的步骤: 首先是GPIO的定义,把其转化为了一个结构体,然后定义一个该结构体的对象,并把该端口的基地址赋给它即可操作该IO口了。然后给该结构体内的变量赋值即是向对应的IO口的对应寄存器内赋值。 一、GPIO的定义 按各寄存器的顺序定义变量(定义32位的是因为寄存器的大小是32位的)(按寄存器顺序排放是因为结构体内的变量是按定义的顺序来顺序排放的,因此正好与IO口内的寄存器的排放相对应): 二、确定IO口的地址 以上为各外设的起始地址,以下为各GPIO的首地址(GPIO是挂载在APB2上的) (故下面的写
[单片机]
stm32 串口通讯不成功的解决办法
首先要注意所用到的USART是否用到了复用功能 千万别忘了打开复用时钟!!!!!!!!! 代码如下:Hello! everyone,welcome to class! #include void delay_ms(u16 x) { u8 t; while(x--){for(t=0;t 120;t++);} } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitS
[单片机]
<font color='red'>stm32</font> 串口通讯不成功的解决办法
STM32学习笔记—SysTick定时器
简介:Q:什么是SYSTick定时器? SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。 Q:什么是SYSTick定时器? SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。 Q:为什么要设置SysTick定时器? (1)产生操作系统的时钟节拍 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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