STM32的USB例程修改步驟
一、usb_desc.c文件
根據(jù)你程序使用的通信方式修改。usb_desc.h文件中定義要根據(jù)usb_desc.c文件中的數(shù)組的大??;ConfigDescriptor[SIZ_CONFIG_DESC]下添加需要處理的端點;根據(jù)需要添加或刪除報告描述符(主要用于HID)和CDC接口描述符(主要用于實現(xiàn)USB轉(zhuǎn)串口)等。具體方法可以下載個“電腦圈圈”使用D12編寫的例子。
二、Usb_conf.h文件:
1、修改需要處理那些中斷
CNTR_CTRM
CNTR_DOVRM
CNTR_ERRM
CNTR_WKUPM 0
CNTR_SUSPM
CNTR_RESETM
CNTR_SOFM
CNTR_ESOFM
如:
usb_conf.h中的#define IMR_MSK (CNTR_CTRM | CNTR_SOFM | CNTR_RESETM )是決定USB_CNTR寄存器中的那個USB相關(guān)中斷啟動還是屏蔽。
2、根據(jù)需要增加端點緩存地址,要根據(jù)緩存區(qū)的地址修改,防止數(shù)據(jù)重疊
如下為根據(jù)每個緩沖區(qū)的大小為64字節(jié)修改:
#define ENDP1_TXADDR
#define ENDP1_RXADDR
#define ENDP2_TXADDR
#define ENDP2_RXADDR
#define ENDP3_TXADDR
#define ENDP3_RXADDR
3、修改下的EPX_IN_Callback和EPX_OUT_Callback。注釋掉需要處理的函數(shù)。NOP_Process表示不處理。
三usb_prop.c文件
1、修改void XX_Reset(void)(如:void Joystick_Reset(void))
一般的不用修改,如下為舉例說明端點1的初始化,其他端口原理一樣。
SetEPType(ENDP1, EP_INTERRUPT);//設(shè)置端點1類型
SetEPTxAddr(ENDP1, ENDP1_TXADDR); //設(shè)置端點1緩沖區(qū)基地址
SetEPTxCount(ENDP1, 64);// 配置Tx 緩沖計數(shù)器
SetEPRxStatus(ENDP1, EP_RX_DIS);// //設(shè)置端點接收關(guān)閉
SetEPTxStatus(ENDP1, EP_TX_NAK);// //設(shè)置端點1發(fā)送不應(yīng)答
2、刪除不相干的描述符等。
如自定義的USB設(shè)備就不需要以下結(jié)構(gòu)體初始化:
ONE_DESCRIPTOR Joystick_Report_Descriptor
ONE_DESCRIPTOR Mouse_Hid_Descriptor
3、修改RESULT XX_Data_Setup(u8 RequestNo)的數(shù)據(jù)類請求處理。
如Custom_HID例程修改為“自定義USB設(shè)備”例程時可以將以下代碼刪除
if ((RequestNo == GET_DESCRIPTOR)
4、刪除不相干的獲得描述符返回函數(shù)
如自定義的USB設(shè)備就不需要以下函數(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;
2、數(shù)據(jù)發(fā)送
UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);
如果你發(fā)送數(shù)據(jù)較為頻繁,每次發(fā)送前應(yīng)使用GetEPTxStatus(ENDP1)檢測上次發(fā)送是否完成。如果端點狀態(tài)處于EP_TX_VALID,說明發(fā)送未結(jié)束,如果端點狀態(tài)處于EP_TX_NAK,說明發(fā)送結(jié)束。
評論