历史上的今天
返回首页

历史上的今天

今天是: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驱动,应该算是比较完善的了。


推荐阅读

史海拾趣

Compact公司的发展小趣事

在电子行业的初期,Compact公司凭借其卓越的技术研发团队,成功开发出了一款具有颠覆性的新型半导体芯片。这款芯片不仅性能卓越,而且成本远低于市场上的同类产品。凭借这一技术创新,Compact公司迅速获得了市场份额,并在行业内建立了良好的声誉。随着技术的不断进步,Compact公司不断推出新产品,巩固了其市场地位。

FDI [Future Designs , Inc.]公司的发展小趣事

随着市场竞争的加剧,FDI公司意识到只有不断创新才能在行业中立足。于是,公司加大了对研发的投入,引进了一批顶尖的技术人才。经过数年的努力,FDI成功研发出了一款具有自主知识产权的智能电子系统,该系统集成了多项先进技术,可以广泛应用于智能家居、工业自动化等领域。这一技术突破,不仅使FDI公司的知名度大幅提升,也为其带来了丰厚的利润。

CONTEC公司的发展小趣事

在互联网+的浪潮下,CONTEC公司积极拥抱变革。2010年,公司开始布局“互联网+”领域,通过建立河北省医疗检查监测仪器工程技术研究中心,探索将互联网技术应用于医疗设备。这一举措不仅拓宽了公司的业务范围,还提高了产品的智能化和便捷性。

Aerotronics Marketing Inc公司的发展小趣事

Aerotronics Marketing Inc公司在电子行业中崭露头角,源于其一项革命性的无人机技术。公司研发团队历经数年努力,成功开发出一款具有高精度导航和稳定飞行能力的无人机,广泛应用于农业监测、地质勘探等领域。这一技术的推出,不仅填补了市场空白,还为公司赢得了大量订单和合作伙伴,推动了公司的快速发展。

Dino-Lite公司的发展小趣事

Dino-Lite公司一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系和检测流程,确保每一台出厂的产品都符合高标准的质量要求。同时,公司还注重售后服务体系的完善和优化,为客户提供及时、专业的技术支持和解决方案。

正是这种对品质的执着追求和对客户的真诚服务,让Dino-Lite公司赢得了客户的信赖和支持。许多客户都成为了公司的忠实粉丝和长期合作伙伴。

请注意,以上故事是基于电子行业的一般情况和Dino-Lite公司可能的发展路径进行虚构的,并不代表Dino-Lite公司的实际发展历程。如需了解更多关于Dino-Lite公司的具体信息和发展故事,建议查阅相关新闻报道、公司官网或行业分析报告。

安信可(Ai)公司的发展小趣事

2012年4月,深圳市安信可科技有限公司正式成立,标志着这家公司在电子行业的起点。成立之初,安信可便专注于物联网领域,致力于为客户提供高质量的模组产品。通过引入先进的科技和创新理念,安信可逐渐在物联网市场中崭露头角,为后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

用VisualAudio设计高效实时音频系统的设计

VisualAudio设计和开发环境是设计和开发音频系统的新软件,它的实时架构特别适合音频产品的开发.本文简短介绍VisualAudio,然后描述它的构架,音频模块和在音频产品上的应用…

查看全部问答>

深入理解SD卡原理和其内部结构总结

在其他地方看到个深入理解SD卡原理和其内部结构总结,很不错,拿来与大家分享下!…

查看全部问答>

万年历

  基于51单片机设计的万年历,含源程序…

查看全部问答>

PXA270核心板方案:

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 ...…

查看全部问答>

用仿真器下载程序后,写保护了,现在下载不下去了?

用仿真器下载程序后,写保护了,现在下载不下去了. 请问有解决的办法吗? 还是一定要换一块单片机了? 刚刚学,谢谢! …

查看全部问答>

有在arm+linux上做过摄像头的吗

我想问下,驱动什么的都弄好了,板上只有一个usb口,我外接了一个四口的USB HUB,接四个摄像头 再在dev文件夹中新建设备文件video0,video1,video2,video3,这四个摄像头能否同时使用啊 我现在只能做到四个来回的切换,想实现一个窗口中同时显示四 ...…

查看全部问答>

【急问】拉丁文(西班牙语)是否支持7bit编码方式?

请问:拉丁文(西班牙语)是否支持7bit编码方式? 在给客户做一个短信终端,客户要求已7bit编码方式实现拉丁文的短信内容 多谢!…

查看全部问答>

徐家骏:从应届毕业生到年薪千万

徐家骏:从应届毕业生到年薪千万2009-03-02 14:48从一个应届毕业生,到年薪千万的华为副总裁,再到离开华为转战百度,徐家骏(博客)的十年从业经历和经验对于今年的应届毕业生来说绝对可资借 鉴,我们从中也可以一窥华为公司的运作过程和徐的职 ...…

查看全部问答>

手机扩展坞

数码产品给我们带来了便捷的生活,但是需要拷贝资料的时候,人们总是会头疼,因为各种的数据线会让人们心烦意乱。这是安卓智能手机或者平板电脑用到的外接读卡器,可以用来连接键盘、鼠标、SD卡、U盘等等,读取里面的数据,包括外置硬盘中的信息, ...…

查看全部问答>