我修改過的st的custom_hid例程
本文中修改好的例程
以下是筆者將st的custom_hid例程修改為「自定義usb裝置」例程時總結出來的,因為筆者也是剛剛學usb開發不久,某些方面理解錯誤在所難免,請各位大蝦指正。
一、usb_desc.c檔案
二、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 | inte***ce_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,說明傳送結束。
STM32簡單例程除錯
一 按鍵例程 key.c檔案 如下 按鍵初始化相當於gpio口的配置。步驟 時鐘設定,輸入輸出設定,io口屬性設定 include include key.h include delay.h 修改說明 按鍵初始化 void key init void 按鍵處理函式 返回按鍵值 u8 key scan...
STM32的USB初認知
尤其注意的是stm32的usb一次傳輸最高的位元組資料為64位元組 usb的通訊協議 尤其注意的是 狀態階段 用來表示整個傳輸的過程已完全結束。狀態階段傳輸的方向必須與資料階段的方向相反,即原來是in令牌封包,這個階段應為out令牌封包 反之,原來是out令牌封包,這個階段應為in令牌封包。對於 控...
新建STM32工程步驟
1.新建資料夾 doc資料夾 可以存放readme.txt等專案文件 library資料夾 可以存放st庫原始碼,直接複製st庫的源 到library資料夾,另外startup只需複製和晶元對應的.s檔案即可,一般存放在 listing資料夾 可以存放keil生成的list檔案,需要在keil中設定...