USB学习笔记(5)STM32 USB库移植步骤
USB学习笔记(5)STM32 USB库移植步骤
本文是将官网的USB驱动库文件移植到自己的工程里面,实现USB功能的具体移植步骤说明,实现Custom_HID功能。
1.先准备一个工程模板
获取工程:STM32F1-V1-工程模版 提取码:p6rg
2.在STM32下载USB Driver工程
官网USB驱动固件库下载
百度云下载地址 提取码:osk1
3.获取相关的USB driver文件
在下载的工程包里面,我们可以看到很多个相关工程,我们选取其中一个工程Custom_HID,然后获取和USB相关的文件出来:
获取文件: USB库文件整理提取码:62p2
4.导入工程并修改相关文件
- 先把获取到的USB文件导入工程模板,编译一遍,会发现很多报错,报错的大部分原因是因为从官网获取的USB文件里面由很多配置是根据官方的开发板写的代码,我们只需要把我们不需要的代码删除就好了。
USB的通讯是靠中断完成的,所以需要加入两个中断函数,我将它放在stm32f10x_it.c文件里面
void USB_LP_CAN1_RX0_IRQHandler(void){USB_Istr();}void USBWakeUp_IRQHandler(void){}
修改文件hw_config.c/hw_config.h/platform_config.h,这三个文件基本都是官方开发板的硬件配置。
//hw_config.c
/********************************************************************************* @file hw_config.c* @author MCD Application Team* @version V4.1.0* @date 26-May-2017* @brief Hardware Configuration & Setup******************************************************************************* @attention** <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2>** Redistribution and use in source and binary forms, with or without modification,* are permitted provided that the following conditions are met:* 1. Redistributions of source code must retain the above copyright notice,* this list of conditions and the following disclaimer.* 2. Redistributions in binary form must reproduce the above copyright notice,* this list of conditions and the following disclaimer in the documentation* and/or other materials provided with the distribution.* 3. Neither the name of STMicroelectronics nor the names of its contributors* may be used to endorse or promote products derived from this software* without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.********************************************************************************//* Includes ------------------------------------------------------------------*/#include "hw_config.h"#include "usb_lib.h"#include "usb_desc.h"#include "usb_pwr.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*//* Extern variables ----------------------------------------------------------*//* Private function prototypes -----------------------------------------------*/static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len);/* Private functions ---------------------------------------------------------*//******************************************************************************** Function Name : Set_System* Description : Configures Main system clocks & power.* Input : None.* Return : None.*******************************************************************************/void Set_System(void){}/******************************************************************************** Function Name : Set_USBClock* Description : Configures USB Clock input (48MHz).* Input : None.* Output : None.* Return : None.*******************************************************************************/void Set_USBClock(void){/* Select USBCLK source */RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);/* Enable the USB clock */RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);}/******************************************************************************** Function Name : Leave_LowPowerMode.* Description : Restores system clocks and power while exiting suspend mode.* Input : None.* Output : None.* Return : None.*******************************************************************************/void Leave_LowPowerMode(void){DEVICE_INFO *pInfo = &Device_Info;/* Set the device state to the correct state */if (pInfo->Current_Configuration != 0){/* Device configured */bDeviceState = CONFIGURED;}else {bDeviceState = ATTACHED;}/*Enable SystemCoreClock*/SystemInit();}/******************************************************************************** Function Name : USB_Interrupts_Config.* Description : Configures the USB interrupts.* Input : None.* Output : None.* Return : None.*******************************************************************************/void USB_Interrupts_Config(void){NVIC_InitTypeDef NVIC_InitStructure; /* 2 bit for pre-emption priority, 2 bits for subpriority */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* Enable the USB interrupt */NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* Enable the USB Wake-up interrupt */NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); }/******************************************************************************** Function Name : Get_SerialNum.* Description : Create the serial number string descriptor.* Input : None.* Output : None.* Return : None.*******************************************************************************/void Get_SerialNum(void){uint32_t Device_Serial0, Device_Serial1, Device_Serial2;Device_Serial0 = *(uint32_t*)ID1;Device_Serial1 = *(uint32_t*)ID2;Device_Serial2 = *(uint32_t*)ID3;Device_Serial0 += Device_Serial2;if (Device_Serial0 != 0){IntToUnicode (Device_Serial0, &CustomHID_StringSerial[2] , 8);IntToUnicode (Device_Serial1, &CustomHID_StringSerial[18], 4);}}/******************************************************************************** Function Name : HexToChar.* Description : Convert Hex 32Bits value into char.* Input : None.* Output : None.* Return : None.*******************************************************************************/static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len){uint8_t idx = 0;for( idx = 0 ; idx < len ; idx ++){if( ((value >> 28)) < 0xA ){pbuf[ 2* idx] = (value >> 28) + '0';}else{pbuf[2* idx] = (value >> 28) + 'A' - 10; }value = value << 4;pbuf[ 2* idx + 1] = 0;}}/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
//platform_config.h
/********************************************************************************* @file platform_config.h* @author MCD Application Team* @version V4.1.0* @date 26-May-2017* @brief Evaluation board specific configuration file.******************************************************************************* @attention** <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2>** Redistribution and use in source and binary forms, with or without modification,* are permitted provided that the following conditions are met:* 1. Redistributions of source code must retain the above copyright notice,* this list of conditions and the following disclaimer.* 2. Redistributions in binary form must reproduce the above copyright notice,* this list of conditions and the following disclaimer in the documentation* and/or other materials provided with the distribution.* 3. Neither the name of STMicroelectronics nor the names of its contributors* may be used to endorse or promote products derived from this software* without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.********************************************************************************//* Define to prevent recursive inclusion -------------------------------------*/#ifndef __PLATFORM_CONFIG_H#define __PLATFORM_CONFIG_H#include "stm32f10x.h"/* Exported types ------------------------------------------------------------*//* Exported constants --------------------------------------------------------*//* Define if Low power mode is enabled; it allows entering the device into STOP mode following USB Suspend event, and wakes up after the USB wakeupevent is received. *///#define USB_LOW_PWR_MGMT_SUPPORT/*Unique Devices IDs register set*/#define ID1 (0x1FFFF7E8)#define ID2 (0x1FFFF7EC)#define ID3 (0x1FFFF7F0)#endif/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
修改usb_pwr.c 这个文件是电源管理部分,我们只需要屏蔽函数
USB_Cable_Config(DISABLE);
USB_Cable_Config(ENABLE);
USB_Cable_Config()这函数硬件上下拉配置usb的通讯脚位,起到usb插入断开的作用,我的板子上没有这个,所以屏蔽就好了,大家根据自己的情况来配置。修改usb_prop.c 这个文件有两个函数是对开发板硬件的配置处理函数,删掉相关代码。
void CustomHID_SetConfiguration(void){if (pInformation->Current_Configuration != 0){/* Device configured */bDeviceState = CONFIGURED;}}void CustomHID_Status_In(void){ }
修改usb_endp.c 这文件是对应的端点处理函数,同样将关于开发板的代码删除。
__IO uint8_t PrevXferComplete;void EP1_OUT_Callback(void){BitAction Led_State;/* Read received data (2 bytes) */ USB_SIL_Read(EP1_OUT, Receive_Buffer);SetEPRxStatus(ENDP1, EP_RX_VALID); }
再次编译文件,发现没有报错了,然后下载到开发板,连接电脑,发现usb找到了相关的驱动,这个说明我们已经移植成功了。
然后我们再观察Custom_HID这个原工程,发现它是一个用户自定义HID设备,可以设备(STM32)与主机(电脑)通讯的,主机可以向设备发送两个字节的数据,STM32可以收到,我们可以通过串口打印是否收到了数据,进一步证实我们的移值时OK的。
修改usb_endp.c
void EP1_OUT_Callback(void){BitAction Led_State;/* Read received data (2 bytes) */ USB_SIL_Read(EP1_OUT, Receive_Buffer);SetEPRxStatus(ENDP1, EP_RX_VALID); printf("HID收到数据:%d %d\r\n",Receive_Buffer[0],Receive_Buffer[1]);}
可以下载Bus Hound工具下发数据,或者其他工具都行。这里我们发现通讯是正常,那么我们的移植是Ok的,后面我们可以通过这个工程修改部分代码,实现对应的功能:比分说USB鼠标,USB键盘,多媒体控制器等。
5. 最后的工程
获取工程:STM32F1-V2-导入USB文件 提取码:hjk0
我的个人博客网址:一个点的频率 希望大家关注一下,谢谢!!!
USB学习笔记(5)STM32 USB库移植步骤相关推荐
- USB学习笔记(4)STM32关于USB库的解读
USB学习笔记(4)STM32关于USB库的解读 为了方便在STM32上实现USB功能,本文对USB库的文件进行解读. USB-FS_Device peripheral interface(外围接口) ...
- USB学习笔记(3)HID应用分析
USB学习笔记(3)HID应用分析 本文根据前面对USB系统的了解,和USB协议的学习,列出鼠标,键盘,多媒体控制器,自定义HID设备等HID设备的各种描述符. 前景提要:每个设备有且仅有一个设备描述 ...
- USB学习笔记(2)USB协议
USB学习笔记(2)USB协议 本文对前面提到的USB枚举过程中的标准请求以及各种描述符做出大致解释,方便后面的实操. 1. USB标准请求 USB协议定义了一个8字节的标准设备请求,主要用在设备的枚 ...
- STM32固件库移植(开发环境的搭建)
STM32固件库移植(开发环境的搭建) 以下过程是手动移植,过程繁琐,不感兴趣的可以绕路学习CubeMX. 下文阐述两种基本开发环境的搭建方法,HAL库的添加将放在下期 1.基本开发环境的搭建 先创一 ...
- python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件? 当我们点开下载页时, 一 ...
- STM32CUBEMX入门学习笔记3:HAL库以及STM32CUBE相关资料
STM32CUBEMX入门学习笔记3:HAL库以及STM32CUBE相关资料 微雪课堂:http://www.waveshare.net/study/article-629-1.html 之前的正点原 ...
- python3第三方库手册_python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑...
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件? 当我们点开下载页时, 一 ...
- Makefile学习笔记07|编译静态库并通过ifeq语句
Makefile学习笔记07|编译静态库并通过ifeq语句 希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢. 这里是目录 本篇与上一篇有较多联系,有兴趣的可以先看上一 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
最新文章
- AJPFX关于单例设计模式
- windows7下GithubDesktop和极域学生客户端冲突导致无法正常打开解决方案
- 推荐系统炼丹笔记:用户评论在推荐中的应用
- 不用面部识别?亚马逊准备推出人手支付,0.3秒刷手支付
- 小师妹学JavaIO之:NIO中那些奇怪的Buffer
- mysql 5.6.34 二进制下载_linux下安装mysql二进制版本(5.6.34)
- opencv 读取CV_16U图像 c++
- mysql null 查询条件_MySql当查询条件为空时不作为条件查询
- TZOJ 4813 机器翻译(模拟数组头和尾)
- oracle增量和全量的区别,ORACLE全备份和0级增量备份的区别
- 用popen函数操作其它程序的输入和输出
- FRR BGP协议分析8 -- BGP 层3隧道 (2)
- 苏州旅游网站的设计与实现 毕业论文+Html静态源码
- 一路走来之“华为网络技术大赛”(新含2018年资料)
- Linux rpm命令
- 【数据结构】以不完整拼音搜索通讯录算法设计
- 独立服务器和云服务器的分类以及是如何区分的?
- 汉诺塔问题模拟实现代码
- echart x轴 倾斜,Echarts x轴字体倾斜
- 给你一碗孟婆汤,你会选择遗忘什么?
热门文章
- Selector多路复用器原理
- 【20保研】兰州大学信息科学与工程学院2019年优秀大学生暑期夏令营活动通知...
- Tinkpad x13 突然检测不到外接显示屏
- ISP PIPLINE (一) BLC 以及 线性化
- string转double java_Java String转double
- JAVA-LocalDateTime时间格式化,转换时间戳和源码分析
- 扑克牌小游戏,寻找 ♠A(来一场和赌王的争霸)
- 中医,较为严谨的定义
- python TCP套接字服务器v1.1-新增服务端命令功能及修改bug(socket+PyQt5)
- [面试] 没礼貌比没专业更可怕(转的和大家一起分享)