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

发布者:王岚枫最新更新时间:2019-07-16 来源: eefocus关键字:STM32  USB驱动  移植 手机看文章 扫描二维码
随时随地手机看文章

单片机型号:STM32L053R8T6


    现在使用的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驱动的移植

上一篇:STM32开发笔记22: 手动添加驱动文件
下一篇:STM32开发笔记20: STM32L053R8T6的keil配置

推荐阅读最新更新时间:2024-11-08 11:07

STM32+W5500+MQTT+Android实现远程数据采集及控制
0 前言 最近在学习MQTT,发现MQTT还是挺好用的,于是花了点时间做了一个简单的应用示例,希望能给需要做这方面的人一些参考。 相关背景知识: http://www.embed-net.com/thread-224-1-1.html 具体功能为: 1,STM32F405为主控芯片,它通过传感器采集环境数据,比如温度,湿度,光照度,大气压强等; 2,主控芯片通过W5500模块将测量的数据通过MQTT协议方式发布到MQTT服务器(服务器域名和IP见固件程序); 3,主控订阅LED灯控制的消息,当接收到对应的控制指令后点亮或者熄灭对应的LED灯; 4,安卓手机端订阅传感器数据的消息,当接收到消息后将传感器数据在界面显示; 5,安卓手机
[单片机]
STM32+W5500+MQTT+Android实现远程数据采集及控制
STM32 DMA详细说明
DMA部分我用到的相对简单,当然,可能这是新东西,我暂时还用不到它的复杂功能吧。下面用问答的形式表达我的思路。 DMA有什么用? 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。 有多少个DMA资源? 有两个DMA控制器,DMA1有7个通道,DMA2有5个通道。 数据从什么地方送到什么地方? 外设到SRAM(I2C/UART等获取数据并送入SRAM); SRAM的两个区域之间; 外设到外设(ADC读取数据后送到TIM1控制其产生不同的PWM占空比); SRAM到外设(SRAM中预先保存的数据送入DAC产生各种波形);
[单片机]
<font color='red'>STM32</font> DMA详细说明
基于STM32的电池管理系统触摸屏设计
0 引 言 电动车一直以清洁环保而备受关注,加上能源危机加剧、油价不断上涨,电动车也越来越受到用户的青睐。电动车一般采用锂电池供电,由多个单体电池串联成电池组作为动力电源。但由于各个串联单体电池特性不能保证完全一致,因此相同的电流下充电放电速度也会不同,如果不进行均衡干预,电池寿命会大大缩短,因此需要实时监控各个单体电池的状态、总电压、总电流,根据状态适时进行电池充放电均衡,并且充放电均衡时,均衡状态也要实时进行检测,所以就有了电动车电池能量管理系统(EMS)。实践证明EMS可以有效延长电动车电池使用寿命,是电动车中十分重要的管理系统。 EMS主要包括:信息采集模块、充放电均衡模块、信息集中处理模块以及显示模块。图1为自
[汽车电子]
基于<font color='red'>STM32</font>的电池管理系统触摸屏设计
STM32 SYSTICK
void SysTick_Config(void);//SysTick定时器配置 void Delay_Ms(u32);//定时时间配置 void void SysTickHandler(void);//中断定时时间处理函数 static vu32 TimingDelay;//中断处理函数 //SysTick设置 void SysTick_Config(void) { SysTick_CounterCmd(SysTick_Counter_Disable); SysTick_ITConfig(DISABLE); SysTick_
[单片机]
STM32学习之路:I2C的基本读写
宏定义: /*I2C传输速度,最高为400kHz*/ #define I2C_SPEED 400000 /* STM32 自身的 I2C 地址, 这个地址只要与 STM32 外挂的 I2C 器件地址不一样即可 */ #define I2C_OWN_ADDR 0x77 /*EEPROM地址*/ #define EEPROM_ADDR (0x50 1) //0xA0 #define EEPROM_SCL_GPIO_CLK RCC_AHB1Periph_GPIOB #define EEPROM_SCL_PIN GPIO_Pin_6 #define EEPROM_SCL_GPIO_PORT GPIOB #de
[单片机]
STM32固件库中assert_param的作用
在学习stm32库函数过程中,笔者遇到大量的assert_param语句。经查明,assert_param的作用就是用来判断传递给函数的参数是否是有效值。 以下是从固件库中复制粘贴的: void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) { assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RCC- APB2ENR |
[单片机]
STM32 输入捕获模式的滤波器设置
一.设置TIMx_CR1的CKD 位,设置时钟分频因子得到fDTS。如下图: 二设置TIMx_CCMR1寄存器的IC1F 位。滤波采样频率和采样次数。如下图 举例:定时器输入时钟频率fCK_INT=72M。CKD =10(B)。IC1F =1111(B)。定时器设置为1通道捕获 fDTS=fCK_IN/4=72M/4=18M 采样频率fSAMPLING = fDTS/32=18M/32=0.5625M 所以滤波的长度=1/fSAMPLING *N=1/0.5625M*8=14.2US。这样捕获通道的滤波器就会滤掉低于14.2us的脉冲干扰 也就是说滤波器会以fSAMPLING的频率采样8次,如果8次都为高电平则确定为上
[单片机]
Stm32空指令使用
1.使用 不需要添加任何头文件 写法: __NOP(); __nop(); __asm( nop ); 以上3种任一写法都可以,注意是2个下划线。 2.时间计算 一个nop约等于1/SYSCLK us,SYSCLK指的是系统时钟频率,MHz单位。 例如,使用了8M晶振,9倍频,因此SYSCLK是72MHz,所以一个nop约等于1/72us,
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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