免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
STM32的USB例程修改步驟

STM32USB例程修改步驟





以下是將STCustom_HID例程修改為“自定義USB設備”例程時總結出來的,因為剛剛學USB開發(fā)不久,某些方面理解錯誤在所難免,請各位大蝦指正。



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




二、Usb_conf.h文件:
1、修改需要處理那些中斷
CNTR_CTRM


處理數(shù)據(jù)正確傳輸后控制,比如說響應主機
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、根據(jù)需要增加端點緩存地址,要根據(jù)緩存區(qū)的地址修改,防止數(shù)據(jù)重疊
如下為根據(jù)每個緩沖區(qū)的大小為64字節(jié)修改:
#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_CallbackEPX_OUT_Callback。注釋掉需要處理的函數(shù)。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緩沖區(qū)基地址
SetEPTxCount(ENDP1, 64);// 配置Tx 緩沖計數(shù)器
SetEPRxStatus(ENDP1, EP_RX_DIS);// //設置端點接收關閉
SetEPTxStatus(ENDP1, EP_TX_NAK);// //設置端點1發(fā)送不應答
/*
#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)的數(shù)據(jù)類請求處理。
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、刪除不相干的獲得描述符返回函數(shù)
如自定義的USB設備就不需要以下函數(shù):
Joystick_GetReportDescriptor
Joystick_GetHIDDescriptor




四、usb_endp.c文件
1、增加之前定義的中斷數(shù)據(jù)處理函數(shù)
如:
void EP1_OUT_Callback(void)
{

這些寫接收代碼
}


五、數(shù)據(jù)發(fā)送和接收,舉例說明
1、數(shù)據(jù)接收
u8 DataLen;

DataLen = GetEPRxCount(ENDP1);

PMAToUserBufferCopy(TX1_buffer, ENDP1_RXADDR, DataLen);

SetEPRxValid(ENDP1);

USART1_Send(DataLen);

count_out = 1;


2、數(shù)據(jù)發(fā)送
UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64);
SetEPTxCount(ENDP1, 64);


SetEPTxValid(ENDP1);

如果你發(fā)送數(shù)據(jù)較為頻繁,每次發(fā)送前應使用GetEPTxStatus(ENDP1)檢測上次發(fā)送是否完成。如果端點狀態(tài)處于EP_TX_VALID,說明發(fā)送未結束,如果端點狀態(tài)處于EP_TX_NAK,說明發(fā)送結束。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
STM32 USB數(shù)據(jù)接收與數(shù)據(jù)發(fā)送程序流程分析
[圈圈原創(chuàng)]如何修改STM32的USB例程為自己所用
Linux設備驅動程序學習(18)-USB 驅動程序(三)
USB的“JoyStickMouse”工作過程詳細分析 (一)
STM32 USB設計
stm32 usb數(shù)據(jù)緩沖區(qū)疑問
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服