精华内容
下载资源
问答
  • STM32 USB

    2018-12-31 11:25:23
    STM32 USB HID 自定义设备 bulk 传输   http://blog.csdn.net/chengwenyang/article/details/51039741 STM32 USB应用笔记 http://gashero.iteye.com/blog/2300218

     

    STM32 USB HID 自定义设备 bulk 传输

     

    http://blog.csdn.net/chengwenyang/article/details/51039741

    STM32 USB应用笔记

    http://gashero.iteye.com/blog/2300218

    展开全文
  • stm32 usb

    2019-11-12 16:44:53
    stm32 CDC设备,虚拟串口: ...在端点的发送和接收前,首先需要配置端点的DFIFO,对于stm32 usb device总共支持6个IN/OUT端点(其中包括端点0),RXFIFO是一个共用的RAM段,TXFIFO对于每个端点有单独的RAM配置段...

    stm32 CDC设备,虚拟串口:

             实现将usb口收到的数据通过串口发送出去,串口收到的数据通过usb口发送出去。

     

     

    端点数据接收发送分析:

     在端点的发送和接收前,首先需要配置端点的DFIFO,对于stm32 usb device总共支持6个IN/OUT端点(其中包括端点0),RXFIFO是一个共用的RAM段,TXFIFO对于每个端点有单独的RAM配置段。

    FIFO结构如下图(实际RXFIFO和TXFIFO用了一段连续的RAM区)

    对于RXFIFO,固定地址为“0”, 然后上面是端点0的TXFIFO,依次是其他IN端点的FIFO,这个可以由用户去配置。

    对应stm32官方例程代码如下:

    (1)

    (2)

    (3)

     

    In过程分析:

         对于device而言,in的过程就是一个数据发送的过程,需要将应用层数据发送到DFIFO(IN)上面即可,剩下的由usb硬件完成。

      (1)在上层usbd_cdc_interface.c文件中设置接收/发送 应用buff。

        

       (2) 在usbd_cdc.c中是实际的指向

       (3) 周期性的判断有没有数据需要发送,如果有

         

       因为用户buff做成了一个环形队列,所有调用USBD_CDC_SetTxBuffer指定发送队列的起始地址和长度,

       调用USBD_CDC_TransmitPacket函数将数据发送出去。将USBD_CDC_TransmitPacket函数展开如下:

      

     然后调用到HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)函数

     

     再到USB_EPStartXfer函数,该函数是最底层的端点操作函数,此处只是完成的端点使能,

     端点一使能,即会出发TXFIFO Empty中断,便会在Empty中断中执行将应用层数据放到IN DFIFO中,数据会自动的从usb总线发送出去。这一个In的过程就结束了。

    Out过程分析:

     1) 设置端点fifo大小,其中第二个参数为

      

      2) 配置,并且使能Out端点

      在USBD_LL_OpenEP函数中用于配置端点的控制寄存器DOEPCTL,包含端点的大小,传输类型等,

      在USBD_LL_PrepareReceive函数中用于指定端点上层的接口属性,包括接收的用户buff地址,和其他(packet cnt 和size有些还没完全看懂),然后使能端点。

     

      3) 如果端点收到包数据,会先出发RxQLevel的中断,在该中断中将对应(out)端点中的数据读取的用户buff中,因为RXFIFO是共用的,所以读取fifo前需要先读取寄存器OTG_HS_GRXSTSR/OTG_HS_GRXSTSP,从而知道这个包数据是属于哪个端点的。

         这里面主要就是USB_ReadPacket函数将对应的fifo数据读取到应用层。

        

      4) 包数据接收完成后就会触发传输发成标志,然后在该中断中去处理用户buff中的数据。

          

     

     

     

     

    上面的pdev->pUserData)->Receive函数就是通过DMA将收到的应用层数据发送到串口上去。

     

    差不多就这样的,很多地方还没有理解到,大致的流程应该就是这样的!

    展开全文
  • STM32 USB-HID通信移植步骤STM32 USB HID键盘例程 STM32 USB HID键盘例程 最全USB HID开发资料,悉心整理一个月,亲自测试 通过STM32CUbeMX建立USB HID的双向通讯实验成功 发现很多人对STM32USB通信很感兴趣。要将...

    STM32 USB-HID通信移植步骤STM32 USB HID键盘例程
    STM32 USB HID键盘例程

    最全USB HID开发资料,悉心整理一个月,亲自测试

    通过STM32CUbeMX建立USB HID的双向通讯实验成功

    发现很多人对STM32的USB通信很感兴趣。要将USB的通信协议搞懂确实是一个比较漫长的过程。但是USB的HID通信无论是上位机的设计还是STM32程序的编程都非常的简单。只是我想很多人都不知道而已。这篇文章的目的是让大家以最短的时间将USB加到你的设备中。如果想学得更深就靠大家。

    HID只是适合低速传输,其理论上可以达到64KB/S,但多由于windows系统和硬件的关系一般达不到这个传输数度。但这个速度对于一般系统的控制和数据传输都已经足够了,而且是免驱,省去了很多麻烦。如果您需要高速传输可参考我的另外一篇文章《STM32的USB例程修改步骤》文章在

    一、安装完MDK后请打开C:/Keil/ARM/Examples/ST/STM32F10xUSBLib/Demos路径,将Custom_HID在同一个目录下复制一份,如果你要放到其他路径你需要在MDK Options for target的C/C++中添加USB的头文件路径(MDK下的/INC/ST/STM32F10x/USB)。

    二、打开usb_desc.c文件,该文件主要包含的端点描述符、设备描述符、配置描述符和字符描述符等。具体请大家参考其他资料了,这里主要说几个常用。

    u8 DeviceDescriptor[SIZ_DEVICE_DESC]为USB设备描述符。当中的
    0x83, /idVendor (0x0483)/
    0x04,
    0x50, /idProduct = 0x5750/
    0x57,
    //idVender字段。厂商ID号,我们这里取0x0483,仅供实验用。
    //实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
    //注意小端模式,低字节在先。
    //idProduct字段。产品ID号,我们这里取0x5750。
    //注意小端模式,低字节应该在前。

    const u8 ConfigDescriptor[SIZ_CONFIG_DESC]是配置描述符,注意如下

    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */
    0x81, /* bEndpointAddress: Endpoint Address (IN) */
    0x03, /* bmAttributes: Interrupt endpoint */
    0x02, /* wMaxPacketSize: 2 Bytes max */
    0x00,
    0x20, /* bInterval: Polling Interval (32 ms) */
    /* 34 */
    0x07, /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */
    /* Endpoint descriptor type */
    0x01, /* bEndpointAddress: */
    /* Endpoint Address (OUT) */
    0x03, /* bmAttributes: Interrupt endpoint */
    0x02, /* wMaxPacketSize: 2 Bytes max */
    0x00,
    0x20, /* bInterval: Polling Interval (20 ms) */
    

    复制代码

    上面包含了“输入端点描述符”和“输出端点描述符”。
    //wMaxPacketSize字段。该端点的最大包长。
    //bInterval字段。端点查询的时间,

    为了实现更高速的通信我们修改如下:

    /******************** Descriptor of endpoint ********************/
    /* 27 */
    0x07, /*bLength: Endpoint Descriptor size*/
    USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
    0x81, /*bEndpointAddress: Endpoint Address (IN)*/
    0x03, /*bmAttributes: Interrupt endpoint*/
    0x40, /*wMaxPacketSize: 64 Byte max */
    0x00,
    0x0A, /*bInterval: Polling Interval (10 ms)*/
    /* 34 */
    /******************** Descriptor of endpoint ********************/
    /* 27 */
    0x07, /*bLength: Endpoint Descriptor size*/
    USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
    0x01, /*bEndpointAddress: Endpoint Address (OUT)*/
    0x03, /*bmAttributes: Interrupt endpoint*/
    0x40, /*wMaxPacketSize: 64 Byte max */
    0x00,
    0x0A, /*bInterval: Polling Interval (10 ms)*/
    
    const u8 ReportDescriptor[SIZ_REPORT_DESC]为HID专用的报告描述符,具体的大家就参考资料了,这里可以直接复制了。
    const u8 CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
    {
    0x05, 0xFF, // USAGE_PAGE(User define)
    0x09, 0xFF, // USAGE(User define)
    0xa1, 0x01, // COLLECTION (Application)
    0x05, 0x01, // USAGE_PAGE(1)
    0x19, 0x00, // USAGE_MINIMUM(0)
    0x29, 0xFF, // USAGE_MAXIMUM(255)
    0x15, 0x00, // LOGICAL_MINIMUM (0)
    0x25, 0xFF, // LOGICAL_MAXIMUM (255)
    0x75, 0x08, // REPORT_SIZE (8)
    0x95, 0x40, // REPORT_COUNT (64)
    0x81, 0x02, // INPUT (Data,Var,Abs)
    0x05, 0x02, // USAGE_PAGE(2)
    0x19, 0x00, // USAGE_MINIMUM (0)
    0x29, 0xFF, // USAGE_MAXIMUM (255)
    0x15, 0x00, // LOGICAL_MINIMUM (0)
    0x25, 0xFF, // LOGICAL_MAXIMUM (255)
    0x95, 0x08, // REPORT_COUNT (8)
    0x75, 0x40, // REPORT_SIZE (64)
    0x91, 0x02, // OUTPUT (Data,Var,Abs)
    0xc0 // END_COLLECTION
    }; /* ReportDescriptor */
    
    const u8 CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR]
    const u8 StringProduct[SIZ_STRING_PRODUCT]
    const u8 StringSerial[SIZ_STRING_SERIAL]
    

    复制代码

    分别是“厂商字符”、“产品字符”、“产品序列号”,这些将在USB HID设备加载的时候显示。但是这需要这些字符要求为Unicode编码,你需要将你要显示的字符先转为Unicode编码。最好大家还要根据各个数组的长度修改如下定义。

    #define CUSTOMHID_SIZ_REPORT_DESC 39
    #define CUSTOMHID_SIZ_STRING_VENDOR 64
    #define CUSTOMHID_SIZ_STRING_PRODUCT 28
    #define CUSTOMHID_SIZ_STRING_SERIAL 26
    

    复制代码

    三、打开hw_config.c文件,将那些没有的函数删除,只保留如下函数
    a) Set_System(void)
    b) void Set_USBClock(void)
    c) void USB_Interrupts_Config(void)
    d) void USB_Cable_Config (FunctionalState NewState)
    特别要注意最后一个函数,其主要作用是控制USB的上拉电阻,让电脑检测USB设备是否连接的。

    四、打开stm32f10x_it.c文件,把EXTI15_10_IRQHandler等中断内的代码删除。
    打开usb_prop.c文件,修改如下:

    void CustomHID_Reset(void)
    {
    /* Set Joystick_DEVICE as not configured */
    pInformation->Current_Configuration = 0;
    pInformation->Current_Interface = 0;/*the default Interface*/
    SetBTABLE(BTABLE_ADDRESS);
    
    /* Initialize Endpoint 0 */
    SetEPType(ENDP0, EP_CONTROL);
    SetEPTxStatus(ENDP0, EP_TX_STALL);
    SetEPRxAddr(ENDP0, ENDP0_RXADDR);
    SetEPTxAddr(ENDP0, ENDP0_TXADDR);
    Clear_Status_Out(ENDP0);
    SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
    SetEPRxValid(ENDP0);
    
    /* Initialize Endpoint 1 */
    SetEPType(ENDP1, EP_INTERRUPT);
    SetEPTxAddr(ENDP1, ENDP1_TXADDR);
    SetEPTxCount(ENDP1, 64);
    SetEPRxStatus(ENDP1, EP_RX_DIS);
    SetEPTxStatus(ENDP1, EP_TX_NAK);
    
    /* Initialize Endpoint 1 */
    // SetEPType(ENDP1, EP_INTERRUPT);
    SetEPRxAddr(ENDP1, ENDP1_RXADDR);
    SetEPRxCount(ENDP1, 64);
    // SetEPTxStatus(ENDP1, EP_TX_DIS);
    SetEPRxStatus(ENDP1, EP_RX_VALID);
    /* Set this device to response on default address */
    SetDeviceAddress(0);
    }
    

    复制代码

    五、usb_endp.c文件

    void EP1_OUT_Callback(void)
    {
    这些写接收代码
    }
    

    复制代码

    六、数据发送和接收,举例说明
    1、数据接收

    u8 DataLen;
    DataLen = GetEPRxCount(ENDP1);
    PMAToUserBufferCopy(TX1_buffer, ENDP1_RXADDR, DataLen);
    SetEPRxValid(ENDP1);
    USART1_Send(DataLen);
    count_out = 1;
    

    复制代码

    2、数据发送

    UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64);
    SetEPTxCount(ENDP1, 64);
    SetEPTxValid(ENDP1);
    

    复制代码

    如果你发送数据较为频繁,每次发送前应使用GetEPTxStatus(ENDP1)检测上次发送是否完成。如果端点状态处于EP_TX_VALID,说明发送未结束,如果端点状态处于EP_TX_NAK,说明发送结束。

    展开全文
  • stm32usb发送双缓冲

    2017-12-24 13:58:08
    stm32usb发送双缓冲stm32usb发送双缓冲stm32usb发送双缓冲stm32usb发送双缓冲stm32usb发送双缓冲stm32usb发送双缓冲
  • STM32 USB虚拟U盘

    2021-02-03 15:27:04
    STM32 USB虚拟U盘
  • stm32 usb 简单介绍

    2018-05-24 12:18:25
    stm32 USB枚举过程 简单介绍stm32 USB枚举过程 简单介绍
  • stm32_cdc_bootloader:STM32 USB CDC引导程序
  • STM32 USB IAP

    2016-08-05 10:11:29
    STM32 USB IAP(STM32 DFU),STM32F10X usb升级程序的程序,以及测试程序,还包括dfuse安装软件和使用说明。在刚开始进行stm32 usb升级程序的过程中,网络的很多资料都不完整,错误的很多,自己也遇到了一些问题,...
  • STM32 USB 学习资料

    2017-05-12 17:29:43
    STM32 USB学习资料,STM32 USB详解
  • STM32 USB模块讲解

    2018-06-21 13:42:12
    STM32 USB模块讲解,怎样配合 ST提供的库函数理解 STM32F102/103的USB模块,以及怎么调用这些库函数来实现基本的USB通信,供学习STM32 USB的朋友参考。
  • STM32_USB_HID_学习心得:基于STM32USB程序开发笔记、修改STM32USB例程为自己所用、初涉USB,初学者USB入门总结——枚举。 STM32_固件库说明文档:STM32_USB_Demo例子的中文说明文档。 STM32F107 鼠标USB改 HID...
  • STM32 USB 学习资料.zip

    2020-04-26 14:28:45
    含有STM32 USB MASS STORAGE 学习资料,STM32的详解,基于STM32USB程序开发笔记等STM32usb学习资料。
  • stm32 USB学习资料

    2018-07-18 13:03:04
    rar里面有stm32 USB 的培训文档,以及stm32f4xx的usb 官方代码,host,device以及host_device
  • stm32 usbhid通信

    热门讨论 2017-04-24 14:00:55
    stm32 usb hid通信驱动程序
  • STM32 USB虚拟串口驱动

    2020-12-31 20:40:21
    STM32 USB虚拟串口驱动 需要的朋友欢迎下载使用
  • STM32 USB_HID模式

    2018-05-09 17:19:08
    STM32 USB_HID模式,非常稳定,可以直接用 STM32 USB_HID模式,非常稳定,可以直接用
  • STM32 USB_CDC配置

    2021-01-06 09:46:36
    STM32 USB_CDC配置前言:配置思路 前言: 做之前先要有一些准备: 1、PC上装好VCP1.31以上的虚拟串口驱动 2、准备一块带USBSTM32(是要连接好USB接口的,不是串口的USB) 3、安装好STM32CUBEMX,并下载好STM32F1的...
  • stm32 usb-can

    2015-11-10 00:00:29
    stm32 usb-can stm32usb转can的实例代码。非常有用。
  • stm32 USB2.0协议

    2018-02-25 14:33:17
    STM32 USB2.0协议开发者培训 USB技术背景 通用串行总线(USB)协议的设计目标。
  • STM32 USB IP介绍.pdf

    2019-09-12 04:08:02
    STM32 USB IP介绍
  • STM32 usb虚拟串口通信

    2019-04-17 15:31:05
    STM32 usb虚拟串口实验,本例程是使用正点原子STM32F103 MINI板,通过usb虚拟串口实现PC与下位机之间收发数据
  • STM32USB键盘

    2015-07-11 12:39:29
    参考圈圈的USB书,移植STM32USB鼠标例程,实现NumLock键的取反,小键盘1的写入
  • STM32 USB 应用

    2012-03-10 13:16:51
    Cortex M3, ARC 开发板, STM32 USB 实例,通过 STM32 USB 控制电脑鼠标
  • stm32usb测试程序,Stm32 HID测试官方程序。 stm32 官方usb HID测试程序。HIDDemo_v1.0.2安装包,亲测可用。 stm32 Dfu下载程序stsw-stm32080-V3.0.0.zip,stm32 DFU官方程序:DfuSe_Demo_V3.0_Setup。 比新的3.0.5...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,389
精华内容 2,955
热门标签
关键字:

stm32usb