當前位置:編程學習大全網 - 源碼下載 - 如何使用stm32進行usb應用開發

如何使用stm32進行usb應用開發

主要是分析官方的Custom_HID 例程,強烈建議大家結合USB2.0協議去分析源代碼。特別不錯,分析完之後就可以修改移植了。另外,有個叫源享科技的出了壹套80集的關於STM32的整套視頻,對USB等高級外設講的非常透徹,結合原子的開發板學習,效果也很好的。那視頻在源享科技官網上挺貴的,哈哈,最後我在淘寶上發現那些新開的店最便宜的才10塊錢。老板是個挺厲害的研究生,在學USB的時候幫了我不少。。廢話不說了,關於修改官方例程的步驟::附件USB程序

壹、usb_desc.c文件

根據妳程序使用的通信方式修改。usb_desc.h文件中定義要根據usb_desc.c文件中的數組的大小;ConfigDescriptor[SIZ_CONFIG_DESC]下添加需要處理的端點;根據需要添加或刪除報告描述符(主要用於HID)和CDC接口描述符(主要用於實現USB轉串口)等。具體方法可以下載個“電腦圈圈”使用D12編寫的例子。

二、Usb_conf.h文件:

1、修改需要處理那些中斷

CNTR_CTRM

處理數據正確傳輸後控制,比如說響應主機

CNTR_DOVRM

/* DMA OVeR/underrun Mask */

CNTR_ERRM

/* ERRor Mask */

CNTR_WKUPM 0

/* WaKe UP Mask */

CNTR_SUSPM

/* SUSPend Mask */

CNTR_RESETM

主要處理USB復位後進行壹些初始化任務

CNTR_SOFM

/* Start Of Frame Mask */

CNTR_ESOFM

/* Expected Start Of Frame Mask */

如:

usb_conf.h中的#define IMR_MSK (CNTR_CTRM | CNTR_SOFM | CNTR_RESETM )是決定USB_CNTR寄存器中的那個USB相關中斷啟動還是屏蔽。

2、根據需要增加端點緩存地址,要根據緩存區的地址修改,防止數據重疊

如下為根據每個緩沖區的大小為64字節修改:

#define ENDP1_TXADDR

(0xC0)

#define ENDP1_RXADDR

(0xD0)

#define ENDP2_TXADDR

(0x100)

#define ENDP2_RXADDR

(0x140)

#define ENDP3_TXADDR

(0x180)

#define ENDP3_RXADDR

(0x1C0)

3、修改/* CTR service routines */下的EPX_IN_Callback和EPX_OUT_Callback。註釋掉需要處理的函數。NOP_Process表示不處理。

三usb_prop.c文件

1、修改void XX_Reset(void)(如:void Joystick_Reset(void))

壹般/* Initialize Endpoint 0 */的不用修改,如下為舉例說明端點1的初始化,其他端口原理壹樣。

SetEPType(ENDP1, EP_INTERRUPT);//設置端點1類型

/*EP_BULK

批量端點

EP_CONTROL 控制端點

EP_ISOCHRNOUS 同步端點

EP_INTERRUPT 中斷端點*/

SetEPTxAddr(ENDP1, ENDP1_TXADDR); //設置端點1緩沖區基地址

SetEPTxCount(ENDP1, 64);// 配置Tx 緩沖計數器

SetEPRxStatus(ENDP1, EP_RX_DIS);// //設置端點接收關閉

SetEPTxStatus(ENDP1, EP_TX_NAK);// //設置端點1發送不應答

/*

#define EP_RX_DIS

(0x0000) // EndPoint RX DISabled 端點接收關閉

#define EP_RX_STALL

(0x1000) // EndPoint RX STALLed 端點接收延遲

#define EP_RX_NAK

(0x2000) // EndPoint RX NAKed 端點接收不應答

#define EP_RX_VALID

(0x3000) // EndPoint RX VALID端點接收有效

#define EP_TX_DIS

(0x0000) //EndPoint TX DISabled

#define EP_TX_STALL

(0x0010) // EndPoint TX STALLed

#define EP_TX_NAK

(0x0020) // EndPoint TX NAKed

#define EP_TX_VALID

(0x0030) // EndPoint TX VALID */

2、刪除不相幹的描述符等。

如自定義的USB設備就不需要以下結構體初始化:

ONE_DESCRIPTOR Joystick_Report_Descriptor

ONE_DESCRIPTOR Mouse_Hid_Descriptor

3、修改RESULT XX_Data_Setup(u8 RequestNo)的數據類請求處理。

如Custom_HID例程修改為“自定義USB設備”例程時可以將以下代碼刪除

if ((RequestNo == GET_DESCRIPTOR)

&& (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))

&& (pInformation->USBwIndex0 == 0))

{

if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)

{

CopyRoutine = Joystick_GetReportDescriptor;

}

else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)

{

CopyRoutine = Joystick_GetHIDDescriptor;

4、刪除不相幹的獲得描述符返回函數

如自定義的USB設備就不需要以下函數:

Joystick_GetReportDescriptor

Joystick_GetHIDDescriptor

四、usb_endp.c文件

1、增加之前定義的中斷數據處理函數

如:

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,說明發送結束。

  • 上一篇:Spring整合rabbitmq實踐(壹):基礎
  • 下一篇:妳心目中最好看的法國科幻片是哪部?為什麽?
  • copyright 2024編程學習大全網