STM32F429阿波罗基于rtthread移植USBHID

1.添加文件

从STM32_USB-Host-Device_Lib_V2.2.0库中找到各文件添加
在这里插入图片描述
编译发现好多报错

2.usb_conf.h

只留 #include "stm32f4xx.h"头文件
打开USE_USB_OTG_FS定义

#ifndef USE_USB_OTG_FS
#define USE_USB_OTG_FS
#endif /* USE_USB_OTG_FS */

把所有报错的代码都删除,直到编译不报错,然后开始修改以下文件

3.board.c

修改USB时钟,必须为48M
在这里插入图片描述

4.usb_bsp.c

修改硬件初始化和中断函数

void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
{
	GPIO_InitTypeDef GPIO_InitStruct;
    
	/* USER CODE BEGIN USB_MspInit 0 */
	__HAL_RCC_GPIOA_CLK_ENABLE();
	GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	GPIO_InitStruct.Pin = GPIO_PIN_9;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	/* Peripheral clock enable */
	__HAL_RCC_USB_OTG_FS_CLK_ENABLE();
}
void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev)
{
	HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_1);
	HAL_NVIC_SetPriority(OTG_FS_IRQn, 4, 0);
	HAL_NVIC_EnableIRQ(OTG_FS_IRQn);	 
}
extern USB_OTG_CORE_HANDLE  USB_OTG_dev;

/* Private function prototypes -----------------------------------------------*/
extern uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);


#ifdef USE_USB_OTG_HS  
void OTG_HS_IRQHandler(void)
#else
void OTG_FS_IRQHandler(void)
#endif
{
  USBD_OTG_ISR_Handler (&USB_OTG_dev);
}

5.usb_dcd_int.c

hclk = HAL_RCC_GetHCLKFreq();在这里插入图片描述

6.usbd_usr.c

添加USB初始化

#include "usbd_desc.h"
#include "usbd_customhid_core.h"
volatile uint8_t bDeviceState=0;
__ALIGN_BEGIN USB_OTG_CORE_HANDLE     USB_OTG_dev __ALIGN_END ;
void usbd_Open(void)
{
	USBD_Init(&USB_OTG_dev,       
            USB_OTG_FS_CORE_ID,
            &USR_desc, 
            &USBD_CUSTOMHID_cb, 
            &USR_cb);
}

void usbd_Close(void)
{
	DCD_DevDisconnect(&USB_OTG_dev);

}

在这里插入图片描述

7.usbd_customhid_core.c

缓冲区改为64,uint8_t Report_buf[64];
修改报文CustomHID_ReportDesc

__ALIGN_BEGIN static uint8_t CustomHID_ReportDesc[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
	0x06,0xA0,0xFF,//(FFA0h, vendor defined)

	0x09, 0x01,//(vendor defined)

	0xA1, 0x01,//(Application)

	0x09, 0x02 ,//(vendor defined)

	0xA1, 0x00,//(Physical)

	0x06,0xA1,0xFF,//(vendor defined)

	//14

	0x09, 0x03 ,//(vendor defined)

	0x09, 0x04,//(vendor defined)

	0x15, 0x80,//(0x80 or -128)

	0x25, 0x7F,//(0x7F or 127)

	0x35, 0x00,//(0)

	0x45, 0xFF,//(255)

	0x75, 0x08,//Report size (8?)

	0x95, 64,//(64 fields)

	0x81, 0x02,//(data, variable, absolute)

	//32

	0x09, 0x05,//(vendor defined)

	0x09, 0x06,//(vendor defined)

	0x15, 0x80,//(0x80 or -128)

	0x25, 0x7F,//(0x7F or 127)

	0x35, 0x00,//(0)

	0x45, 0xFF,//(255)

	0x75, 0x08,//(8?)

	0x95, 64,//(64 fields)

	0x91, 0x02,//(data, variable, absolute)

	0xC0,//(Physical)

	0xC0//(Application)
		//52/
}; 

在这里插入图片描述
数据接收函数

extern struct rt_mailbox    usb_rx_mb;   
struct RTT_USB_RX usb_rx;

uint8_t  USBD_CUSTOM_HID_DataOut (void  *pdev, 
                                  uint8_t epnum)
{
	if(epnum == HID_OUT_EP)
	{
		usb_rx.length = USBD_GetRxCount(pdev, epnum);
		usb_rx.epnum = epnum;
		usb_rx.pdev = pdev;
		
		memcpy(usb_rx.data, Report_buf, usb_rx.length);
		rt_mb_send(&usb_rx_mb, (rt_uint32_t)&usb_rx);
	}  
  return USBD_OK;
}
void USB_HID_ReadyRx (USB_OTG_CORE_HANDLE  *pdev)
{
	
	DCD_EP_PrepareRx(pdev,HID_OUT_EP,Report_buf,sizeof(Report_buf));
	
}

8.usbd_customhid_core.h

在这里插入图片描述

struct RTT_USB_RX
{
    char data[64];
    uint16_t length;
    USB_OTG_CORE_HANDLE  *pdev;
    uint8_t epnum;
};

void USB_HID_ReadyRx (USB_OTG_CORE_HANDLE  *pdev);

9.usbd_conf.h

修改发送接收包的大小
在这里插入图片描述

10.thread_usb.c

两个线程,一个线程接收到数据后,另一个线程发送数据

#include <string.h>
#include "usbd_usr.h"
#include "usbd_customhid_core.h"

extern USB_OTG_CORE_HANDLE USB_OTG_dev;

rt_uint8_t usb_send_buf[64];                    /* usb数据发送buf */
struct rt_mailbox    usb_rx_mb;                        /* usb接收数据邮箱控制块 */
static char usb_rx_mbpool[128];						   /* usb接收数据邮件的内存池 */
rt_uint8_t usb_rx_flag = 0;

ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t USB_Communicate_stack[1024];
static struct rt_thread USB_Communicate_thread;
void USB_Communicate_thread_entry(void* parameter)
{
	struct RTT_USB_RX *usb_rx;
	
  while(1)
  {
    rt_mb_recv(&usb_rx_mb,(rt_ubase_t*)&usb_rx, RT_WAITING_FOREVER);
        
		if( (usb_rx->data[00] == 0x00)&&(usb_rx->data[01] == 0x01) )
		{
			  usb_rx_flag = 1;
        USB_HID_ReadyRx(usb_rx->pdev);
    }
		rt_thread_mdelay(100);
	}
}

ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t usb_tx_stack[ 1024 ];
static struct rt_thread usb_tx_thread;
static void usb_tx_thread_entry(void* parameter)
{
    uint8_t usb_sendbuf[64] = {0x00};

    while(1)
    {
       rt_memset(usb_sendbuf,0,sizeof(usb_sendbuf));
       if(usb_rx_flag == 1)
			 {
         usb_sendbuf[0] = 0x88;
         USBD_CUSTOM_HID_SendReport(&USB_OTG_dev,usb_sendbuf,64);
				 usb_rx_flag = 0;
			 }
       rt_thread_mdelay(100);
    }
}

rt_err_t rt_hw_thread_usb_init(rt_uint8_t priority)
{
    rt_err_t result = RT_EOK;

	/* 相关的邮箱初始化 */
    rt_mb_init(&usb_rx_mb, "usb_rx_mb",             /*usb接收邮箱初始化 */
                &usb_rx_mbpool[0],
                sizeof(usb_rx_mbpool)/4,
                RT_IPC_FLAG_FIFO);

    usbd_Open();
  
    result = rt_thread_init(&USB_Communicate_thread, "USB_Communicate",
                             USB_Communicate_thread_entry,
                             RT_NULL,
                             (rt_uint8_t*)&USB_Communicate_stack[0],
                             sizeof(USB_Communicate_stack),
                             priority,
                             10);
  
    if (result == RT_EOK)
        rt_thread_startup(&USB_Communicate_thread);
		
		
		    /* init usb_tx_thread */
    result = rt_thread_init(&usb_tx_thread,
                            "usb_tx",
                            usb_tx_thread_entry,
                            RT_NULL,
                            (rt_uint8_t*)&usb_tx_stack[0],
                            sizeof(usb_tx_stack),
                            priority+1,
                            5);
 
    if (result == RT_EOK)
    {
        rt_thread_startup(&usb_tx_thread);
    }
		
  return result;
}

11.软件测试

在这里插入图片描述

亲测可用,USBLIB库还是有很多函数没有搞懂,目前可以实现初步使用
代码资源链接:https://download.csdn.net/download/u010915068/20040838

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值