STM32移植USB驱动总结

//=========================By xiaowei
/*

*/
//=========================

1、硬件介绍

1、SGM7227,USB高速切换开关,OE是芯片使能,低电平才能使总线导通;
S脚是切换控制;
在这里插入图片描述


USB协议

https://segmentfault.com/a/1190000015995506

2、软件移植

移植文件分析

stm32自带USB接口,OTG-FS(全速)和OTG-HS(高速),因为stm32f4只带有高速PHY,想使用高速模式,就需要外扩高速PHY,在此为USB3300。
系统配置一个Device端口,一个Host端口;

Device端口连接主机,在此处为POS机,外接USB3300作为高速PHY;
Host端口连接打印进,使用了STM32内置的全速PHY;

移植时,我们重点要修改的就是 USB_APP 文件夹下面的代码。其他代码(USB_OTG 和USB_DEVICE 文件夹下的代码)一般不用修改。
需要修改的文件:

usb_bsp.c 提供了几个 USB 库需要用到的底层初始化函数,包括: IO 设置、中断设置、VBUS配置以及延时函数等,需要我们自己实现。 USB Device(Slave)和 USB Host 共用这个.c 文件。

usbd_desc.c 提供了 USB 设备类的描述符,直接决定了 USB 设备的类型、断点、接口、字符串、制造商等重要信息。这个里面的内容,我们一般不用修改,直接用官方的即可。注意,这里: usbd_desc.c 里面的: usbd 即 device 类,同样: usbh 即 host 类,所以通过文件名我们可以很容易区分该文件是用在 device 还是 host,而只有 usb 字样的那就是 device 和 host 可以共用的。

usbd_usr.c 提供用户应用层接口函数,即 USB 设备类的一些回调函数,当 USB 状态机处理完不同事务的时候,会调用这些回调函数,我们通过这些回调函数,就可以知道 USB 当前状态,比如:是否枚举成功了?是否连接上了?是否断开了?等,根据这些状态,用户应用程序可以执行不同操作,完成特定功能。

usbd_storage_msd.c 提供一些磁盘操作函数,包括支持的磁盘个数,以及每个磁盘的初始化和读写等函数。本章我们设置了 2 个磁盘: SD 卡和 SPI FLASH。

这些文件都是以回调函数的方式被内核调用,需要用户编写具体的应用程序;

使用时,需要定义 USB_OTG_CORE_HANDLE ,是一个全局结构体类型,用于存储 USB 通信中 USB 内核需要使用的的各种变量、状态和缓存等,任何 USB 通信(不论主机,还是从机),我们都必须定义这么一个结构体以实现 USB 通信。
USB 初始化非常简单,只需要调用 USBD_Init 函数即可,本章的 USB 读卡器属于 USB 设备类,所以使用该函数。该函数初始化了USB 设备类处理的各种回调函数,以便 USB 驱动库调用。执行完该函数以后, USB 就启动了,所有 USB 事务,都是通过 USB 中断触发,并由 USB 驱动库自动处理。

USB设备需要存储介质,需要用户定义存储介质驱动。
USB驱动会自己调用处理函数进行处理,用户需要改动的是底层的驱动,即磁盘的读写;具体在usbd_storage_msd.c里面,
磁盘回调函数结构体:

USBD_STORAGE_cb_TypeDef USBD_MICRO_SDIO_fops =
{
   
  STORAGE_Init,
  STORAGE_GetCapacity,
  STORAGE_IsReady,
  STORAGE_IsWriteProtected,
  STORAGE_Read,
  STORAGE_Write,
  STORAGE_GetMaxLun,
  (int8_t *)STORAGE_Inquirydata,
};

读操作:

int8_t STORAGE_Read (uint8_t lun, 
                 uint8_t *buf, 
                 uint32_t blk_addr,                       
                 uint16_t blk_len)
{
   

	buf=&U_DISK[blk_addr*512];
  return 0;
}

USB启动阶段请求

这个博客分析的挺好:
https://www.cnblogs.com/Daniel-G/p/3993883.html

USB内核处理

USB_OTG_CORE_HANDLE 是全局变量,

  • 用于存储 USB 通信中 USB 内核需要使用的的各种变量、状态和缓存等,任何 USB 通信(不论主机,还是从机),我们都必须定义这么一个结构体以实现 USB 通信,
typedef struct USB_OTG_handle
{
   
  USB_OTG_CORE_CFGS    cfg;
  USB_OTG_CORE_REGS    regs;
#ifdef USE_DEVICE_MODE
  DCD_DEV     dev;
#endif
#ifdef USE_HOST_MODE
  HCD_DEV     host;
#endifdda
#ifdef USE_OTG_MODE
  OTG_DEV     otg;
#endif
}
USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE;

USB_OTG_CORE_HANDLE分析:

这是个全局结构体,内部存储内核处理USB设备,主机的变量;

当USB作为Device设备时,USB_OTG_CORE_HANDLE定义为DCD_DEV ;
其参数如下:

typedef struct _DCD
{
   
  uint8_t        device_config;
  uint8_t        device_state;
  uint8_t        device_status;
  uint8_t        device_old_status;
  uint8_t        device_address;
  uint8_t        connection_status;  
  uint8_t        test_mode;
  uint32_t       DevRemoteWakeup;
  USB_OTG_EP     in_ep   [USB_OTG_MAX_TX_FIFOS];
  USB_OTG_EP     out_ep  [USB_OTG_MAX_TX_FIFOS];
  uint8_t        setup_packet [8*3];
  USBD_Class_cb_TypeDef         *class_cb;
  USBD_Usr_cb_TypeDef           *usr_cb;
  USBD_DEVICE                   *usr_device;  
  uint8_t        *pConfig_descriptor;
 }
DCD_DEV , *DCD_PDEV;

DCD_DEV 结构说明:

DCD_DEV结构包含用于实时保存与设备,控制传输状态机以及端点信息和状态相关的所有信息的所有变量和结构。

中断处理
  • 所有USB的事件都是通过中断触发,并由内核自动处理。
    在此处USB_OTG_CORE_HANDLE USB_OTG_Core;用来作为主机结构;
    __ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END ;用来作为从机设备;

OTG概念

On-The-Go,即OTG技术就是实现在没有Host的情况下,实现设备间的数据传送。例如数码相机直接连接到打印机上,通过OTG技术,连接两台设备间的USB口,将拍出的相片立即打印出来;也可以将数码照相机中的数据,通过OTG发送到USB接口的移动硬盘上,野外操作就没有必要携带价格昂贵的存储卡,或者背一

  • 35
    点赞
  • 252
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
你好!对于STM32 HAL库的USB移植,以下是一些基本的步骤: 1. 确定目标设备:首先确定你要移植STM32系列芯片型号,以及该芯片是否具有USB硬件支持。确保你选择的芯片支持USB功能。 2. 配置引脚:在移植USB前,需要为USB功能配置引脚。查阅芯片的数据手册,找到与USB相关的引脚,并将其配置为正确的功能。 3. 配置时钟:为了使USB正常工作,需要配置正确的时钟源和时钟分频器。这包括使能USB相关的时钟,并设置合适的时钟频率。 4. 初始化USB库:使用HAL库提供的函数初始化USB库。这些函数通常包括配置USB时钟,设置USB模式(设备模式/主机模式),以及配置USB中断等。 5. 实现回调函数:根据你的应用需求,实现必要的USB回调函数。这些回调函数包括处理USB事件、传输数据等。 6. 添加应用逻辑:根据你的应用需求,添加额外的代码来处理USB通信。例如,处理设备连接/断开事件、处理数据传输等。 7. 编译和调试:完成上述步骤后,编译并下载固件到目标设备上。使用调试工具(例如ST-Link)进行调试,以确保USB功能正常工作。 请注意,USB移植是一个复杂的任务,需要仔细阅读芯片手册和HAL库文档,并根据具体芯片型号进行适配。此外,还需要根据你的应用需求进行额外的配置和开发。 希望这些步骤对你有所帮助!如果你有任何进一步的问题,请随时提问。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值