STM32 HAL库之USB
前言
stm32f1xx_hal_msp.c 文件定义了两个函数 HAL_MspInit 和 HAL_MspDeInit。这两个函数分别被文件 stm32f1xx_hal.c 中的 HAL_Init 和 HAL_DeInit 所调用。HAL_MspInit 函数的主要作用是进行 MCU相关的硬件初始化操作。例如我们要初始化某些硬件,我们可以硬件相关的初始化配置 写在HAL_MspDeinit 函数中。这样的话,在系统启动后调用了 HAL_Init 之后,会自动调用硬件初始化函数。
实际上,我们在工程模板中直接删掉 stm32f1xx_hal_msp.c 文件也不会对程序运行产生任何影响。
1.函数组成
main.c里面仅包含一个USB设备函数初始化函数 MX_USB_DEVICE_Init(),在程序开始时调用。
usbd_cdc_interface.c为USB的CDC类应用层文件,里面包含虚拟串口的接收,发送和控制等函数。
usb_desc.c 包含USB的描述符,以及USB枚举处理等函数。
usb_conf.c 为USB管脚配置文件,包含引USB引脚初始化以及参数设置,中断回调函数等。
2.初始化
定义USB结构体句柄
STM32的标准库中,句柄是一种特殊的指针,通常指向结构体!
USBD_HandleTypeDef hUsbDeviceFS
在HAL库中,USBD初始化结构体变量,我们要定义为全局变量。所以说上述代码放在函数外边。句柄用于管理进程例程之间的共享数据资源,查看结构体USBD_HandleTypeDef成员:
typedef struct _USBD_HandleTypeDef
{uint8_t id;uint32_t dev_config;uint32_t dev_default_config;uint32_t dev_config_status; USBD_SpeedTypeDef dev_speed; USBD_EndpointTypeDef ep_in[15];USBD_EndpointTypeDef ep_out[15]; uint32_t ep0_state; uint32_t ep0_data_len; uint8_t dev_state;uint8_t dev_old_state;uint8_t dev_address;uint8_t dev_connection_status; uint8_t dev_test_mode;uint32_t dev_remote_wakeup;USBD_SetupReqTypedef request;USBD_DescriptorsTypeDef *pDesc;USBD_ClassTypeDef *pClass;void *pClassData; void *pUserData; void *pData;
} USBD_HandleTypeDef;
声明用户自定义变量
//usbd_cdc_if.c
#define APP_RX_DATA_SIZE 2048
#define APP_TX_DATA_SIZE 2048
//通过USB接收的数据存储在此缓冲区中
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
//通过USB CDC发送的数据存储在此缓冲区中
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
USB初始化
//usb_device.c
void MX_USB_DEVICE_Init(void)
{if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK){Error_Handler();}if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC) != USBD_OK){Error_Handler();}if (USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS) != USBD_OK){Error_Handler();}if (USBD_Start(&hUsbDeviceFS) != USBD_OK){Error_Handler();}
}
初始化函数第三步如下:
uint8_t USBD_CDC_RegisterInterface (USBD_HandleTypeDef *pdev, USBD_CDC_ItfTypeDef *fops)
{uint8_t ret = USBD_FAIL;if(fops != NULL){pdev->pUserData= fops;ret = USBD_OK; }return ret;
}
USBD_CDC_ItfTypeDef结构体定义如下:
有四个成员,分别是四个函数指针
typedef struct _USBD_CDC_Itf
{int8_t (* Init) (void);int8_t (* DeInit) (void);int8_t (* Control) (uint8_t, uint8_t * , uint16_t); int8_t (* Receive) (uint8_t *, uint32_t *); }USBD_CDC_ItfTypeDef;
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{CDC_Init_FS,CDC_DeInit_FS,CDC_Control_FS, CDC_Receive_FS
};
- int8_t CDC_Init_FS(void)
初始化CDC媒体底层,设置了收发Buffer
static int8_t CDC_Init_FS(void)
{/* Set Application Buffers */USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);return (USBD_OK);
}
- static int8_t CDC_Control_FS (uint8_t cmd, uint8_t* pbuf, uint16_t length)
CDC控制命令处理,列举了主机有可能向设备发送的一些命令。没有具体的处理过程,需要用户自己编写。其中包括串口参数的设置,要做串口转USB通信的话需要修改这里。只是为了用USB与PC通信则不用管这里。每个命令具体的意思需要查询CDC类手册。
static int8_t CDC_Control_FS (uint8_t cmd, uint8_t* pbuf, uint16_t length)
{ switch (cmd){case CDC_SEND_ENCAPSULATED_COMMAND:break;case CDC_GET_ENCAPSULATED_RESPONSE:break;case CDC_SET_COMM_FEATURE:break;case CDC_GET_COMM_FEATURE:break;case CDC_CLEAR_COMM_FEATURE:break;case CDC_SET_LINE_CODING: break;case CDC_GET_LINE_CODING: break;case CDC_SET_CONTROL_LINE_STATE:break;case CDC_SEND_BREAK:break; default:break;}return (USBD_OK);
}
- int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
虚拟串口接收函数,Buf为接收缓存。这个缓存实际上就是CDC_Init_FS()中设置的UserRxBufferFS[]数组。这个全局数组的定义在usbd_cdc_if.c文件中。Len为接收到数据的长度。这个变量不是全局的,需要用户声明变量把这个传出去。
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);USBD_CDC_ReceivePacket(&hUsbDeviceFS);return (USBD_OK);
}
注意:CDC_Receive_FS()是接收函数。这个函数不需要调用。直接在函数中添加代码把接受到的数据和数据长度复制到自己定义的接收缓存。
usbd_cdc_if.c中CDC_Transmit_FS()是发送函数。要发送时调用这个函数,需要传入待发送数据的指针和长度。
//处理数据函数
void HandleReceiveData (uint8_t* Buf, uint32_t *Len)
{CDC_Transmit_FS(Buf,(uint16_t)Len);
}
参考
参考:
https://www.jianshu.com/p/82f277d0fe2b
https://www.stmcu.com.cn/Designresource/design_resource_detail
https://blog.csdn.net/xuzhexing/article/details/90137754
https://blog.csdn.net/king_jie0210/article/details/76713938
STM32 HAL库之USB相关推荐
- STM32CubeMX | 基于STM32使用HAL库实现USB组合设备之多路CDC
STM32CubeMX | 基于STM32使用HAL库实现USB组合设备之多路CDC 本博客完整代码下载地址:https://download.csdn.net/download/qq15347150 ...
- [STM32F1]基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备
序: 其实这样一个设备我们在ch32v103上实现过,但移植到STM32 HAL库上面,还是发现很多问题的,现在就移植过程给大家分享一下在基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备的实现 ...
- STM32 HAL库、标准外设库、LL库(STM32 Embedded Software)
STM32 Embedded Software 工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是常 ...
- 基于STM32 HAL库的遥控小车
目录 前言 一.材料清单 二.系统概述 三.硬件设计 1.HC-SR04超声波模块 2.HC-05/06蓝牙模块 3.L298n电机驱动模块 四.代码 1.引脚设置 2.遥控部分 3.超声波报警部分 ...
- STM32 HAL库学习笔记1-HAL库简介
STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...
- STM32 HAL库组成概述
STM32 HAL库概述 ## (一)HAL库设计思想 什么是HAL(Hardware Abstraction Layer)? from 百度百科: 硬件抽象层是位于操作系统内核与硬件电路之间的接口层 ...
- 【08】STM32·HAL库开发-HAL库介绍 | STM32Cube固件库介绍 | HAL库框架结构 | 如何使用HAL库及使用注意事项
目录 1.初识HAL库(了解) 1.1CMSIS简介 1.2HAL库简介 2.STM32Cube固件包浅析(了解) 2.1如何获取STM32Cube固件包? 2.2STM32Cube固件包文件夹简介 ...
- STM32 HAL库
STM32 HAL库 第三章 MDK5 软件入门 bug解决 关键文件介绍 程序仿真 User Keywords 语法提示 代码编辑/查看技巧 第四章 STM32F1 基础知识入门 MDK 下 C 语 ...
- STM32 HAL库详解 及 手动移植
源: STM32 HAL库详解 及 手动移植
最新文章
- 服务器硬盘坏道修复教程视频,硬盘坏道修复工具 操作教程
- linux vim配置,打造ide
- 接口中的默认方法和静态方法
- spring中需要掌握的25个常用注解
- Navicat 连接 Oracle数据库并,导入数据泵(.dmp)
- 快速排序图解_排序算法
- 遗传算法MATLAB工具箱的下载与安装
- C#笔记12 自定义集合和常用集合
- 排列组合的思考、组合数的推广和拓展
- VISIO—如何打开?及安装教程
- cad一键卸载工具叫什么_CAD专用卸载修复工具,一键完全彻底卸载删除CAD软件的专用卸载工具...
- 配置nginx报错no “ssl_certificate“ is defined in server listening on SSL port while SSL handshaking
- mysql磁盘空间碎片回收
- 3D模型欣赏:《magician》次时代 美女 精灵
- Linux命令之杀掉被占用的端口号
- html注册新浪邮箱代码,新浪博客美化代码:邮箱快速登录
- Jackson多克隆抗体丨艾美捷Jackson纳米二级抗体研究
- iOS运行时Runtime浅析
- 06 - table表格标签+ 行合并+列合并
- 年底了,怎么和领导提加薪?