历史上的今天
今天是:2024年09月12日(星期四)
2018年09月12日 | STM32F4 开发笔记9:USB CDC驱动程序的详细移植过程
2018-09-12 来源:eefocus
本文详细介绍USB CDC驱动程序的移植过程。
1、按照STM32F4 开发笔记8:解决USB CDC “该设备无法启动”问题介绍的过程生成驱动程序后,找到如下图所示的文件加入到自己的项目工程中。
2、打开usbd_cdc_if.c文件,可以看到其中有,如下4个函数,其中Init、DeInit和Control函数都不需要改变,关键是Receive函数。
static int8_t CDC_Init_FS(void);
static int8_t CDC_DeInit_FS(void);
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length);
static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);
3、查看CDC_Receive_FS函数,可以清楚的看到其是希望将接收逻辑写到这个函数中。不过我们一般希望接收逻辑写在我们自己的函数中,所以需要将函数移动到自己的文件中去。
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
/* USER CODE END 6 */
}
4、屏蔽掉CDC_Receive_FS函数及其原型声明。
5、在usbd_cdc_if.h文件中,重新加入函数声明,如下所示。
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);
int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);
6、建立自己的USB驱动,如下图所示。
7、usb.h的代码如下:
#ifndef USB_H_
#define USB_H_
#ifdef __cplusplus
extern "C"{
class CUSB
{
public:
uint8_t Buffer[64];
uint32_t Length;
boolean bFlag;
public:
CUSB(void);
void SendData(uint8_t* pData, uint32_t u32_Size);
void ReceiveData(uint8_t* pData, uint32_t u32_Size);
boolean IsReceivedData(void);
uint8_t CalCheckSum(uint8_t* pData, uint8_t Length);
};
void USB_InterruptFunction(uint8_t* pBuffer, uint32_t* pLength);
}
#endif
#endif
8、usb.cpp的代码如下,里面调用了驱动服务程序。
#include "include.h"
extern PCD_HandleTypeDef hpcd_USB_OTG_FS;
CUSB::CUSB(void)
{
MX_USB_DEVICE_Init();
}
void CUSB::SendData(uint8_t* pData, uint32_t u32_Size)
{
CDC_Transmit_FS(pData, u32_Size);
}
void CUSB::ReceiveData(uint8_t* pData, uint32_t u32_Size)
{
uint32_t i;
for (i = 0; i < u32_Size; i++)
{
this->Buffer[i] = *pData++;
}
this->Length = u32_Size;
if (this->Length > 0)
{
this->bFlag = TRUE;
}
}
boolean CUSB::IsReceivedData(void)
{
if (this->bFlag == TRUE)
{
this->bFlag = FALSE;
return TRUE;
}
else
{
return FALSE;
}
}
uint8_t CUSB::CalCheckSum(uint8_t* pData, uint8_t Length)
{
uint8_t u8_CheckSum, i;
u8_CheckSum = 0x00;
for (i = 0; i < Length; i++)
{
u8_CheckSum = u8_CheckSum + pData[i];
}
return u8_CheckSum;
}
void OTG_FS_IRQHandler(void)
{
HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS);
}
int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len)
{
USB_InterruptFunction(pbuf, Len);
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &pbuf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
}
9、千万别忘记更改stm32f4xx_it.h文件,这个已经在前面的日志中提到。
void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void TIM3_IRQHandler(void);
void OTG_FS_IRQHandler(void);
10、最后完成main函数逻辑,写个简单的。
int main(void)
{
MX_ADC1_Init();
MX_SPI1_Init();
MX_USB_DEVICE_Init();
while (1)
{
if (Target.IsbMilliSecond_1000() == TRUE)
{
//¹¤×÷ָʾµÆ
Target.HAL.LED.Turn();
//Target.HAL.UsbCommunication.SendData(data, 10);
}
if (Target.HAL.UsbCommunication.IsReceivedData() == TRUE)
{
Target.HAL.UsbCommunication.SendData(Target.HAL.UsbCommunication.Buffer, Target.HAL.UsbCommunication.Length);
}
}
}
11、看一下效果,发什么,回什么。
这样的USB驱动,应该算是比较完善的了。
史海拾趣
|
VisualAudio设计和开发环境是设计和开发音频系统的新软件,它的实时架构特别适合音频产品的开发.本文简短介绍VisualAudio,然后描述它的构架,音频模块和在音频产品上的应用… 查看全部问答> |
|
PXA270核心板方案: CPU:PXA270 SDRAM:128M FLASH:32M 接口:USB、SDCARD、SERIAL等 LCD+TOUCH:3.5‘ 支持WIFI 方案可提供:SCH + PCB + BOOM + WINCE ...… 查看全部问答> |
|
CoCreateInstance返回:没有注册类别(wince6.0 emulator sdk 中使用msxml) 大家好!我想在Wince的模拟器上使用msxml发送xml文件,代码如下: MSXML2::IXMLHTTPRequest* pIXMLHTTPRequest = NULL; CoInitialize(NULL); HRESULT hr; hr = CoCreateInstance (__uuidof(MSXML2::XMLHTTPRequest), NU ...… 查看全部问答> |
|
我想问下,驱动什么的都弄好了,板上只有一个usb口,我外接了一个四口的USB HUB,接四个摄像头 再在dev文件夹中新建设备文件video0,video1,video2,video3,这四个摄像头能否同时使用啊 我现在只能做到四个来回的切换,想实现一个窗口中同时显示四 ...… 查看全部问答> |
|
请问:拉丁文(西班牙语)是否支持7bit编码方式? 在给客户做一个短信终端,客户要求已7bit编码方式实现拉丁文的短信内容 多谢!… 查看全部问答> |
|
徐家骏:从应届毕业生到年薪千万2009-03-02 14:48从一个应届毕业生,到年薪千万的华为副总裁,再到离开华为转战百度,徐家骏(博客)的十年从业经历和经验对于今年的应届毕业生来说绝对可资借 鉴,我们从中也可以一窥华为公司的运作过程和徐的职 ...… 查看全部问答> |




