女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]匯總1:STM32的USB例程修改步驟,來自http://blog.csdn.net/cy757/archive/2010/01/01/5117610.aspx 以下是筆者將ST的Custom_HID例程修改為“自定義USB設(shè)備”例程時(shí)總結(jié)出來的,因?yàn)楣P者也是剛剛學(xué)USB開發(fā)不久,某些

匯總1:STM32的USB例程修改步驟,來自http://blog.csdn.net/cy757/archive/2010/01/01/5117610.aspx 以下是筆者將ST的Custom_HID例程修改為“自定義USB設(shè)備”例程時(shí)總結(jié)出來的,因?yàn)楣P者也是剛剛學(xué)USB開發(fā)不久,某些方面理解錯(cuò)誤在所難免,請各位大蝦指正。

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

二、Usb_conf.h文件: 1、修改需要處理那些中斷 CNTR_CTRM 處理數(shù)據(jù)正確傳輸后控制,比如說響應(yīng)主機(jī) CNTR_DOVRM /* DMA OVeR/underrun Mask */ CNTR_ERRM /* ERRor Mask */ CNTR_WKUPM 0 /* WaKe UP Mask */ CNTR_SUSPM /* SUSPend Mask */ CNTR_RESETM 主要處理USB復(fù)位后進(jìn)行一些初始化任務(wù) 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寄存器中的那個(gè)USB相關(guān)中斷啟動(dòng)還是屏蔽。

2、根據(jù)需要增加端點(diǎn)緩存地址,要根據(jù)緩存區(qū)的地址修改,防止數(shù)據(jù)重疊 如下為根據(jù)每個(gè)緩沖區(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_Callback和EPX_OUT_Callback。注釋掉需要處理的函數(shù)。NOP_Process表示不處理。

三usb_prop.c文件 1、修改void XX_Reset(void)(如:void Joystick_Reset(void)) 一般/* Initialize Endpoint 0 */的不用修改,如下為舉例說明端點(diǎn)1的初始化,其他端口原理一樣。 SetEPType(ENDP1, EP_INTERRUPT);//設(shè)置端點(diǎn)1類型 /*EP_BULK 批量端點(diǎn) EP_CONTROL 控制端點(diǎn) EP_ISOCHRNOUS 同步端點(diǎn) EP_INTERRUPT 中斷端點(diǎn)*/ SetEPTxAddr(ENDP1, ENDP1_TXADDR); //設(shè)置端點(diǎn)1緩沖區(qū)基地址 SetEPTxCount(ENDP1, 64);// 配置Tx 緩沖計(jì)數(shù)器 SetEPRxStatus(ENDP1, EP_RX_DIS);// //設(shè)置端點(diǎn)接收關(guān)閉 SetEPTxStatus(ENDP1, EP_TX_NAK);// //設(shè)置端點(diǎn)1發(fā)送不應(yīng)答 /* #define EP_RX_DIS (0x0000) // EndPoint RX DISabled 端點(diǎn)接收關(guān)閉 #define EP_RX_STALL (0x1000) // EndPoint RX STALLed 端點(diǎn)接收延遲 #define EP_RX_NAK (0x2000) // EndPoint RX NAKed 端點(diǎn)接收不應(yīng)答 #define EP_RX_VALID (0x3000) // EndPoint RX VALID端點(diǎn)接收有效 #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設(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è)備”例程時(shí)可以將以下代碼刪除 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è)備就不需要以下函數(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);

=========================================================================== 匯總2:STM32 USB 程序?qū)ULK EP改成雙緩沖機(jī)制后,一直狂飚到了1MB/S!來自:http://www.powermcu.com/bbs/viewthread.php?tid=693 前天測試自己編寫的USB驅(qū)動(dòng)程序時(shí)候發(fā)現(xiàn)從主機(jī)到STM32的OUT傳輸(主機(jī)到設(shè)備)速率竟然只有最高33KB/S,實(shí)在是暈死了。經(jīng)過研究后發(fā)現(xiàn)是驅(qū)動(dòng)程序中設(shè)置的PIPE MaxTransferSize參數(shù)的關(guān)系,原先設(shè)置64只能33KB/S,后參考其他USB設(shè)備驅(qū)動(dòng)程序的值,設(shè)置成了65535,再測試USB OUT的速度,達(dá)到了500KB/S,終于解決了驅(qū)動(dòng)程序的瓶頸。不過算下USB 2.0全速的通訊速率是12Mb/S,排除掉CRC、令牌、SOF等等開銷怎么也應(yīng)該不止最大500KB/S啊。到網(wǎng)上看了看,基本上應(yīng)該能達(dá)到600KB/S~700KB/S以上,我現(xiàn)在的速度應(yīng)該還有很大的提升才是。 看看程序,發(fā)現(xiàn) void EP3_OUT_Callback(void)//EP3 OUT的回調(diào)函數(shù),當(dāng)EP3接收到數(shù)據(jù)時(shí)候中斷調(diào)用該函數(shù) { count_out = GetEPRxCount(ENDP3);//獲得接收到的數(shù)據(jù)長度 PMAToUserBufferCopy(buffer_out, ENDP3_RXADDR, count_out);//將數(shù)據(jù)從USB EP3 RX的緩沖區(qū)拷貝到用戶指定的數(shù)組中 SetEPRxValid(ENDP3); //完成拷貝后置有效狀態(tài),從而EP3發(fā)送ACK主機(jī)可以進(jìn)行下一個(gè)數(shù)據(jù)包的發(fā)送 } 試著將PMAToUserBufferCopy這句注釋掉(這樣STM32就不處理接收到的數(shù)據(jù)了)后再測試速度,驚奇地發(fā)現(xiàn)速度竟然達(dá)到了997KB/S!晚上仔細(xì)想了想,數(shù)據(jù)肯定是要使用的,這個(gè)數(shù)據(jù)拷貝的過程的時(shí)間消費(fèi)總是少不了的;由于通常情況下USB設(shè)備BULK數(shù)據(jù)接收的步驟就是:接收到數(shù)據(jù),置NAK->將緩沖區(qū)數(shù)據(jù)拷貝到用戶區(qū)(用戶處理過程)->發(fā)ACK通知主機(jī)完成了完整的接收可以發(fā)送下一個(gè)->主機(jī)發(fā)送下一個(gè),按照以上的步驟USB接收一步步的進(jìn)行,只要STM32不完成數(shù)據(jù)處理,狀態(tài)就一直是NAK,主機(jī)就會(huì)不停地發(fā)送該數(shù)據(jù)包,浪費(fèi)了帶寬,因此就會(huì)導(dǎo)致我上面最大速度500KB/S難以再增加的情況!不甘心啊~~

昨天晚上又仔細(xì)研究了STM32的技術(shù)參考手冊的USB章節(jié)內(nèi)容,里面提到BULK可以采用雙緩沖機(jī)制(PING-PONG)進(jìn)行處理,正好可以解決上面的情況。雙緩沖機(jī)制的原理就是分配2塊接收緩沖,STM32的用戶處理和USB接口可以分別交替占用2個(gè)緩沖區(qū),當(dāng)USB端點(diǎn)接收數(shù)據(jù)寫其中一個(gè)緩沖區(qū)的時(shí)候,用戶的應(yīng)用程序可以同時(shí)處理另一個(gè)緩沖區(qū),這樣緩沖區(qū)依次交換占有者,只要用戶處理程序在USB端點(diǎn)接收的時(shí)間片段內(nèi)完成處理,就能夠完全不影響USB的通訊速度! 程序部分修改

一、EP3_OUT的設(shè)置修改, //ZYP:修改EP3為BULK雙緩沖方式------------------------- SetEPType(ENDP3, EP_BULK); SetEPDoubleBuff(ENDP3); SetEPDblBuffAddr(ENDP3, ENDP3_BUF0Addr, ENDP3_BUF1Addr); SetEPDblBuffCount(ENDP3, EP_DBUF_OUT, VIRTUAL_COM_PORT_DATA_SIZE); ClearDTOG_RX(ENDP3); ClearDTOG_TX(ENDP3); ToggleDTOG_TX(ENDP3); SetEPRxStatus(ENDP3, EP_RX_VALID); SetEPTxStatus(ENDP3, EP_TX_DIS); //------------------------------------------------------

二、EP3_OUT回調(diào)函數(shù)的修改 void EP3_OUT_Callback(void) { //ZYP:以下是修改成EP3雙緩沖OUT后的處理函數(shù) if (GetENDPOINT(ENDP3) & EP_DTOG_TX)//先判斷本次接收到的數(shù)據(jù)是放在哪塊緩沖區(qū)的 { FreeUserBuffer(ENDP3, EP_DBUF_OUT); //先釋放用戶對緩沖區(qū)的占有,這樣的話USB的下一個(gè)接收過程可以立刻進(jìn)行,同時(shí)用戶并行進(jìn)行下面處理 count_out = GetEPDblBuf0Count(ENDP3);//讀取接收到的字節(jié)數(shù) PMAToUserBufferCopy(buffer_out, ENDP3_BUF0Addr, count_out); } else { FreeUserBuffer(ENDP3, EP_DBUF_OUT); count_out = GetEPDblBuf1Count(ENDP3); PMAToUserBufferCopy(buffer_out, ENDP3_BUF1Addr, count_out); } } 經(jīng)過上面的修改,終于解決了STM32在處理接收數(shù)據(jù)時(shí)導(dǎo)致主機(jī)等待的情況,用BUS HOUND軟件測試了下 哈哈,這下終于爽了。 PS:上面的FreeUserBuffer(ENDP3, EP_DBUF_OUT); 這句話的上下位置是關(guān)鍵,如果放到函數(shù)的后面,則仍舊會(huì)有主機(jī)等待STM32處理數(shù)據(jù)的情況,速度仍然是500KB/S! 把這句話放在拷貝函數(shù)的前面的話就真正把雙緩沖PING-PONG機(jī)制用起來了。大致算了下PMAToUserBufferCopy(buffer_out, ENDP3_BUF1Addr, count_out);這句話當(dāng)count_out為最大值64的時(shí)候STM32執(zhí)行需要302個(gè)周期,72MHZ情況下約4.2微秒執(zhí)行時(shí)間,而USB傳輸按照12Mb/s的線速度傳輸64字節(jié)的數(shù)據(jù)至少也得40微秒,因此只要PMAToUserBufferCopy的時(shí)間不超過40微秒,就不會(huì)導(dǎo)致緩沖區(qū)競爭的情況。

=============================================================================== 匯總3:STM32的USB中斷說明,來自:http://bbs.ednchina.com/BLOG_ARTICLE_238817.HTM STM32的USB模塊可以產(chǎn)生三種中斷:USB喚醒中斷、USB高優(yōu)先級(jí)中斷和USB低優(yōu)先級(jí)中斷,在STM32的參考手冊中沒有詳細(xì)說明這三種中斷對應(yīng)哪些事件,現(xiàn)說明如下: 1)USB喚醒中斷:在中斷向量表中的位置是42。這個(gè)中斷在USB設(shè)備從暫停模式喚醒時(shí)產(chǎn)生,喚醒事件由USB_ISTR寄存器的WKUP位標(biāo)識(shí)。 2)USB高優(yōu)先級(jí)中斷:在中斷向量表中的位置是19。這個(gè)中斷僅由USB同步(Isochronous)模式傳輸或雙緩沖塊(Bulk)傳輸模式下的正確傳輸事件產(chǎn)生,正確傳輸事件由USB_ISTR寄存器的CTR位標(biāo)識(shí)。 3)USB低優(yōu)先級(jí)中斷:在中斷向量表中的位置是20。這個(gè)中斷由所有其它的USB事件產(chǎn)生,例如正確傳輸(不包括同步模

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

在嵌入式開發(fā)中,STM32的時(shí)鐘系統(tǒng)因其靈活性和復(fù)雜性成為開發(fā)者關(guān)注的焦點(diǎn)。然而,看似簡單的時(shí)鐘配置背后,隱藏著諸多易被忽視的陷阱,輕則導(dǎo)致系統(tǒng)不穩(wěn)定,重則引發(fā)硬件損壞。本文從時(shí)鐘源選擇、PLL配置、總線時(shí)鐘分配等關(guān)鍵環(huán)...

關(guān)鍵字: STM32 時(shí)鐘系統(tǒng)

在嵌入式系統(tǒng)開發(fā)中,STM32系列微控制器的內(nèi)部溫度傳感器因其低成本、高集成度特性,廣泛應(yīng)用于設(shè)備自檢、環(huán)境監(jiān)測等場景。然而,受芯片工藝差異和電源噪聲影響,其原始數(shù)據(jù)存在±1.5℃的固有誤差。本文從硬件配置、校準(zhǔn)算法、軟...

關(guān)鍵字: STM32 溫度傳感器

在能源效率與智能化需求雙重驅(qū)動(dòng)下,AC-DC轉(zhuǎn)換器的數(shù)字控制技術(shù)正經(jīng)歷從傳統(tǒng)模擬方案向全數(shù)字架構(gòu)的深刻變革?;赟TM32微控制器的PFM(脈沖頻率調(diào)制)+PWM(脈沖寬度調(diào)制)混合調(diào)制策略,結(jié)合動(dòng)態(tài)電壓調(diào)整(Dynam...

關(guān)鍵字: AC-DC STM32

2025年8月13日 – 提供超豐富半導(dǎo)體和電子元器件?的業(yè)界知名新品引入 (NPI) 代理商貿(mào)澤電子 (Mouser Electronics) 即日起開售Asahi Kasei Microdevices (AKM) 的...

關(guān)鍵字: 數(shù)模轉(zhuǎn)換器 USB 無線揚(yáng)聲器

物聯(lián)網(wǎng)與智能化設(shè)備快速普及,供電方式的選擇直接影響設(shè)備部署的靈活性、成本與可靠性。PoE(以太網(wǎng)供電)與USB供電作為兩大主流技術(shù),分別在工業(yè)網(wǎng)絡(luò)、智能家居、消費(fèi)電子等領(lǐng)域占據(jù)關(guān)鍵地位。本文將從設(shè)備適配性、傳輸距離、功率...

關(guān)鍵字: PoE USB

在無線技術(shù)的發(fā)展歷程中,部署的簡便性往往是成功的關(guān)鍵。像Wi-Fi、藍(lán)牙和早期的蜂窩技術(shù),只有在集成變得簡單、無縫且實(shí)惠時(shí),才能實(shí)現(xiàn)大規(guī)模的應(yīng)用。而如今,Wi-Fi HaLow——一種專為物聯(lián)網(wǎng)(IoT)設(shè)計(jì)的遠(yuǎn)距離、低...

關(guān)鍵字: 物聯(lián)網(wǎng) Wi-Fi USB

2025年8月5日 – 專注于引入新品的全球電子元器件和工業(yè)自動(dòng)化產(chǎn)品授權(quán)代理商貿(mào)澤電子 (Mouser Electronics)即日起開售Microchip Technology的新款A(yù)VR? SD 8位MCU。AVR...

關(guān)鍵字: MCU 工業(yè)自動(dòng)化 USB

隨著高解析度音頻應(yīng)用的不斷發(fā)展和廣泛部署,諸如USB與I2S之間等不同專業(yè)接口之間的高品質(zhì)音頻轉(zhuǎn)換需求日益增長,由此帶來了實(shí)現(xiàn)高性能、高實(shí)時(shí)性與高靈活性的新挑戰(zhàn)。為此,邊緣AI和智能音頻專家XMOS攜手其全球首家增值分銷...

關(guān)鍵字: SoC USB 處理器

【2025年7月24日, 德國慕尼黑訊】全球功率系統(tǒng)和物聯(lián)網(wǎng)領(lǐng)域的半導(dǎo)體領(lǐng)導(dǎo)者英飛凌科技股份公司(FSE代碼:IFX / OTCQX代碼:IFNNY)近日推出新型英飛凌ID Key系列,進(jìn)一步擴(kuò)展其通用串行總線(USB)...

關(guān)鍵字: 控制器 USB 非易失性存儲(chǔ)器

當(dāng)前智能家居產(chǎn)品需求不斷增長 ,在這一背景下 ,對現(xiàn)有澆花裝置缺陷進(jìn)行了改進(jìn) ,設(shè)計(jì)出基于STM32單片機(jī)的全 自動(dòng)家用澆花機(jī)器人。該設(shè)計(jì)主要由機(jī)械結(jié)構(gòu)和控制系統(tǒng)構(gòu)成 ,機(jī)械結(jié)構(gòu)通過麥克納姆輪底盤與噴灑裝置的結(jié)合實(shí)現(xiàn)機(jī)器...

關(guān)鍵字: STM32 麥克納姆輪 安全可靠 通過性強(qiáng)
關(guān)閉