STM32的USB例程修改步驟

2021-06-18 10:11:18 字數 3543 閱讀 6566

我修改過的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中設定...