国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

歷史上的今天

今天是:2025年07月16日(星期三)

2019年07月16日 | STM32開發(fā)筆記34:USB CDC驅(qū)動(dòng)程序的詳細(xì)移植過程

發(fā)布者:RadiantSerenity 來源: eefocus關(guān)鍵字:STM32  USB  CDC  驅(qū)動(dòng)程序  移植過程 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

單片機(jī)型號:STM32F401   


   本文詳細(xì)介紹USB CDC驅(qū)動(dòng)程序的移植過程。


    1、按照STM32F4 開發(fā)筆記8:解決USB CDC “該設(shè)備無法啟動(dòng)”問題介紹的過程生成驅(qū)動(dòng)程序后,找到如下圖所示的文件加入到自己的項(xiàng)目工程中。



    2、打開usbd_cdc_if.c文件,可以看到其中有,如下4個(gè)函數(shù),其中Init、DeInit和Control函數(shù)都不需要改變,關(guān)鍵是Receive函數(shù)。


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函數(shù),可以清楚的看到其是希望將接收邏輯寫到這個(gè)函數(shù)中。不過我們一般希望接收邏輯寫在我們自己的函數(shù)中,所以需要將函數(shù)移動(dòng)到自己的文件中去。


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函數(shù)及其原型聲明。


    5、在usbd_cdc_if.h文件中,重新加入函數(shù)聲明,如下所示。


uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);

int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);

    6、建立自己的USB驅(qū)動(dòng),如下圖所示。




    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的代碼如下,里面調(diào)用了驅(qū)動(dòng)服務(wù)程序。


#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文件,這個(gè)已經(jīng)在前面的日志中提到。


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函數(shù)邏輯,寫個(gè)簡單的。


int main(void)

{

  MX_ADC1_Init();

  MX_SPI1_Init();

  MX_USB_DEVICE_Init();

 

  while (1)

  {

if (Target.IsbMilliSecond_1000() == TRUE)

{

//1¤×÷??ê?μ?

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、看一下效果,發(fā)什么,回什么。


    這樣的USB驅(qū)動(dòng),應(yīng)該算是比較完善的了。


關(guān)鍵字:STM32  USB  CDC  驅(qū)動(dòng)程序  移植過程 引用地址:STM32開發(fā)筆記34:USB CDC驅(qū)動(dòng)程序的詳細(xì)移植過程

上一篇:STM32開發(fā)筆記35:USB FS的枚舉方法
下一篇:STM32開發(fā)筆記33:解決USB CDC “該設(shè)備無法啟動(dòng)”問題

推薦閱讀

2018年7月13日,“2018年人工智能與機(jī)器人產(chǎn)業(yè)生態(tài)高峰暨X劃開營”在深圳龍崗圓滿舉行。本次活動(dòng)由深圳市龍崗區(qū)委組織部(人才辦)指導(dǎo),科沃斯蒲公英加速器、海歸創(chuàng)業(yè)學(xué)院(深港)主辦,·領(lǐng)創(chuàng)天下承辦。來自深圳、上海兩地,入選本期X加速計(jì)劃的24支人工智能、機(jī)器人團(tuán)隊(duì)集體亮相活動(dòng)現(xiàn)場。此次論壇邀請到企業(yè)領(lǐng)袖、專家學(xué)者、創(chuàng)投精英、媒體記者等各...
就在歐司朗宣布支持貝恩資本和凱雷集團(tuán)的公開收購要約沒過幾天,日前又傳出ams有收購歐司朗的計(jì)劃,初期評估的價(jià)值為每股38.5歐元。ams表示,資金來源主要將通過過橋貸及其他融資實(shí)現(xiàn),目前而言,過橋貸或融資并沒有任何承諾,此外ams當(dāng)前市值約為30億歐元,而歐司朗目前的估值為32億歐元,所以歐司朗董事會認(rèn)為可能性非常小。與此同時(shí),ams也表示,盡管并...
沉寂了半年之后,相信很多人都迫不及待的想出去看看,相約一場科技盛宴再適合不過。8K智慧屏、5G芯片、機(jī)器人、新能源汽車,還有會跳舞的機(jī)器人,這些來自世界各地的炫酷黑科技和創(chuàng)新成果都將出現(xiàn)在CITE2020。相比以往,CITE2020不僅更側(cè)重世界科技創(chuàng)新合作浪潮中對中國品牌的機(jī)遇和挑戰(zhàn),聚焦時(shí)代風(fēng)口下的“科技”之爭,也更注重科技與生活的結(jié)合??梢哉f...
一、原理介紹關(guān)于數(shù)碼管的控制電路,在《51單片機(jī)(八)》中有詳細(xì)的介紹,硬件電路如下圖所示。在這個(gè)實(shí)驗(yàn)中,我們用數(shù)碼管的前4位設(shè)計(jì)一個(gè)累加器。在進(jìn)行實(shí)驗(yàn)時(shí),需要將單片機(jī)的P00~P07引腳與J44相連。接口的對應(yīng)關(guān)系是(P00—D0),……,(P07—D7)。將單片機(jī)的P10和P11引腳與J45相連,P10與J45上的DM對應(yīng),P11與WM對應(yīng)。二、實(shí)例介紹這個(gè)實(shí)驗(yàn)的代碼...

史海拾趣

小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved