STM32 USB HS管脚实现USB FS

最近在使用STM32F207的芯片调试USB读写U盘的功能,花费了好多天,总算是调试通过了。现在回头去看,还是走了很多的弯路的,下面将正确的思路总结如下,对自己是个经验的记录,当然也希望对后面要用到的朋友有所帮助。

硬件环境:STM32F207的芯片,这款芯片USB接口有FS和HS之分,由于之前对这两个接口的区别不是很了解,所以画原理图的时候,就将USB的接口连接在了HS的接口上(PB14,PB15),                       另外对于USB接口只连接了DP和DM,并没有连接VBUS信号。外部晶振使用的是8M的晶振。 USB部分的电路,如下图所示

说明: OTG_FS为 full speed 全速接口,   OTG_HS为 high speed 高速接口,对于全速接口就是我们一般使用最多的USB接口形式了,而高速的USB接口,一般需要配合USB的外部联合使用,但是在不使用外部PHY的情况下,也可以当做全速接口使用(这是在调试的时候,因为硬件已经连接成这样了,没办法最后百度才知道可以这样使用的,而我最终的使用方式也是用HS的接口,当FS使用)。

软件环境: 调试USB读写U盘的功能是基于ST官方论坛上下下来的例程,在此基础上做修改。

1.首先需要解决的就是,如何在HS的USB接口上使用USB FS,代码需要做这样几处修改。

(1)时钟配置部分,一定要配置正确,时钟是一切系统工作的基础(从ST官网论坛上下载下来的STM32F2的例程有的是12M晶振的,有的是8M晶振的,尽量选择和自己的晶振一致的例程,避免不必要的错误)。

void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;

/* Enable HSE Oscillator and activate PLL with HSE as source */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 240;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 5;
HAL_RCC_OscConfig(&RCC_OscInitStruct);

/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
clocks dividers */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);
}

(2)接下来就是USBH_LL_Init()函数的修改了,这里一定要使用HS的配置。也就是需要对USE_USB_HS进行宏定义

USBH_StatusTypeDef USBH_LL_Init(USBH_HandleTypeDef *phost)
{
/* Set the LL Driver parameters */
// hhcd.Instance = USB_OTG_FS;
hhcd.Instance = USB_OTG_HS;
hhcd.Init.Host_channels = 11;
hhcd.Init.dma_enable = 0;
hhcd.Init.low_power_enable = 0;
hhcd.Init.phy_itface = HCD_PHY_EMBEDDED;   // 需要特别注意这几个标红的地方,这些地方是需要进行修改的
hhcd.Init.Sof_enable = 0;
hhcd.Init.speed = HCD_SPEED_FULL;
hhcd.Init.vbus_sensing_enable = 0;

/* Link the driver to the stack */
hhcd.pData = phost;
phost->pData = &hhcd;

/* Initialize the LL Driver */
HAL_HCD_Init(&hhcd);

USBH_LL_SetTimer(phost, HAL_HCD_GetCurrentFrame(&hhcd));

return USBH_OK;
}

(3)最后就是对硬件管脚的配置了

void HAL_HCD_MspInit(HCD_HandleTypeDef *hhcd)
{
GPIO_InitTypeDef GPIO_InitStruct;

/* Configure USB FS GPIOs */
__HAL_RCC_GPIOB_CLK_ENABLE();
/* Enable USB FS Clocks */
__HAL_RCC_USB_OTG_HS_CLK_ENABLE();

/*USB DM and DP */
GPIO_InitStruct.Pin = (GPIO_PIN_14 | GPIO_PIN_15);     //因为这里没有使用VBUS信号,所以只有DP和DM信号的定义
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_OTG_HS_FS;  //这里一定要选复用,就是靠这个将HS应用于FS的
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/* Set USBFS Interrupt priority */
HAL_NVIC_SetPriority(OTG_HS_IRQn, 6, 0);

/* Enable USBFS Interrupt */
HAL_NVIC_EnableIRQ(OTG_HS_IRQn);
}

(4)还有一个需要注意的地方,就是中断处理函数,用的也是HS的,不能使用FS

void OTG_HS_IRQHandler(void)
{
HAL_HCD_IRQHandler(&hhcd);
}

其他地方就不用再修改了,依照例程原有的方式就好了,到此就可以正常的对U盘进行读写了。

原文地址:https://www.cnblogs.com/kunshao2018/p/8718079.html

时间: 2024-11-05 20:46:33

STM32 USB HS管脚实现USB FS的相关文章

ubuntu8.04 USB转串口问题解决--USB转串口线----HL340

转自 http://blog.csdn.net/sustzombie/article/details/5035506 最近装了个硬盘版的ubuntu 8.04,准备作为以后的嵌入式开发环境,其他一切基本弄好准备连接开发板启动时,出了问题.串口工具用的是minicom,但是连线开发板 (FS2410)之后没有任何打印信息.因为所有的开发环境可以确认没有问题,所以初步判定为串口配置的问题.在网上查找得知minicom串口设置,需设为 /dev/ttyUSB0, 但是我设只好之后之后,发现找不到/de

Delphi 调试连接 任意Android手机/平板/盒子(要安装Google USB Driver,并且还有USB的相关许多文章)

Delphi有时候无法连接调试一些手机,解决方案: 1.安装Google USB Driver 2.通过设备管理器查看手机或平板USB的VID,PID 3.修改你的电脑上的android_winusb.inf,将第2步找到的VID,PID加到inf中. 例如: ;Samsung Galaxy S3 %SingleAdbInterface% = USB_Install, USB\VID_04E8&PID_6860 %CompositeAdbInterface% = USB_Install, USB

从linux usb设备节点来认识usb linux usb认识

首先从dmesg来认识usb: <6>[   19.610046] msm_hsic_host msm_hsic_host: Qualcomm EHCI Host Controller using HSIC <6>[   19.620391] msm_hsic_host msm_hsic_host: new USB bus registered, assigned bus number 1 <6>[   19.659942] msm_hsic_host msm_hsic

Security arrangements for extended USB protocol stack of a USB host system

Security?arrangements for a universal serial bus (USB) protocol stack of a?USB host system are provided. The?security?arrangements prevent an unauthorized or suspicious?USB?device from communicating with the host system, detect suspicious activity or

USB第1-4章学习——USB结构体系概述

第一章  术语与缩写 一些术语与缩写,没有太多用处 第二章 绪论 无太多用处 第三章 背景 介绍了USB的一些硬件指标 使用场所等 可泛读了解 第四章 结构体系概述 (极其重要 是理解整个USB工作原理的基础,学习者都必须对这一章有深刻的理解才能学习好后面的内容) 4.1 USB系统描述 USB互连:分层星形拓扑结构 最大限制七层(复合设备算两层) USB设备 和USB主机(一个系统只能有一个) 4.2 物理结构 USB的物理特性 做电路可能会用到 但是对程序用处不大 4.3 电源 可以进行功耗

USB虚拟化和虚拟桌面USB重定向

USB:通用串行总线,是一种外部总线的标准,用于规范主机与外设之间的连接与通讯,其数据传输速度快,支持热插拔,并具有兼容性和透明性,已成为当今个人电脑和大量智能设 备必配的接口.随着虚拟化技术的盛行和发展,在虚拟化中引入对USB技术的支持,是必须的必然的结果,同时,由于传统桌面使用USB技术和大量的外设进行交互,因而在使用和实现虚拟桌面的时候,必须引入对USB技术的支持,以达到虚拟桌面对外设的兼容和交互,使得虚拟桌面达到和传统桌面一样的用户体验. 一.USB技术概述 USB(Universal

经亲自实验,一台Windows电脑,同时接入2个USB鼠标和2个USB键盘,均可正常使用。

今天解决了一个键盘的冲突问题,突然想起来一个自己想了很久一直没做的实验,一台Windows电脑,同时接入2个USB鼠标和2个USB键盘,结果如何. 两个键盘可同时打字,均会录入,由于条件限制,不能实验完全同时按两个键盘. 两个鼠标均可使用,共享一个鼠标指针,两个鼠标做相反移动式,鼠标指针移动,向移动更大的鼠标方向移动.

截取usb数据包,控制usb设备----Relay设备

在项目开发当中,我们需要一个usb转继电器的设备当开关控制无线发射设备,采购部采购时并未详细了解Relay设备的运行环境就买了一批设备,之后发现设备厂家只提供了windows库,而我们是要在linux中开发.无语中...... Relay设备虽然是无驱的,可我并不知道它的协议,怎么办呢? I have no choice ,but I have bus hound,LOL. 厂家提供了windows的管理工具,可以实现Relay的开断,因此我通过Bus Hound截取usb数据包,得到通信协议.

虚拟机没有对应usb端口和无法识别usb|加密狗怎么办

虚拟机没有对应端口来时识别加密狗或usb设备,那我们就要采用第三方的设备来实现在虚拟机识别映射加密狗的功能.那我们怎么去选择第三方的设备呢,今天我给你大家说一种设备usb server硬件服务器大家有没听说过,usb server是专门解决虚拟化|虚拟机识别映射usb加密狗和设备,它还可以实现加密狗共享.动态迁移.远程连接.加密狗的集中管理和加密锁的管理方案等功能.支持Vmware.hyper-v等虚拟环境,支持各种Windows平台:支持各种行业专业软件以及各大银行的Ukey.USB SEVE