www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導讀][cpp] view plaincopyprint?#include #include #include "usbreg.h" #include "usbuser.h" #include "usbcore.h" #include "usb_hw.h" #define _DEBUG_ #include "debug.h" #define USB_EP_NUM 4 /*端點緩沖區(qū)的開

[cpp] view plaincopyprint?

#include

#include

#include "usbreg.h"

#include "usbuser.h"

#include "usbcore.h"

#include "usb_hw.h"

#define _DEBUG_

#include "debug.h"

#define USB_EP_NUM 4

/*端點緩沖區(qū)的開始地址

*因為每個緩沖塊都需要一個端點描術表

*而所有的端點描述表放在,USB緩沖區(qū)的首部

*此地址是相對于USB緩沖區(qū)的地址,我認為加上Offset更好些

*這里使用2個端點

*端點0與端點1

*此時EP_BUF_ADDR指向緩沖區(qū)的內容

*/

#define EP_BUF_ADDR (sizeof(EP_BUF_DSCR)*USB_EP_NUM)

/*USB緩沖區(qū)首地址包括緩沖區(qū)描述表,絕對地址*/

EP_BUF_DSCR * pBUF_DSCR = (EP_BUF_DSCR *) USB_PMA_ADDR;

/*端點空閑緩沖區(qū)地址

*用于指示目前為止USB緩沖區(qū)中還沒有分配的空閑地址的首地址*/

WORD FreeBufAddr;

/*功能:用于初始化USB的時鐘等部分

*參數(shù):無

*返回值:無

*/

void USB_Init(void)

{

printf("進入USB_Init,進行初始化rn");

//使能USB時鐘

RCC->APB1ENR |= (1<<23);

//使能USB中斷

/*因為USB低優(yōu)先級中斷的中斷號為20,而NVIC——IPRX

*寄存器用四位來存儲中斷優(yōu)先級,所以20/4=5 ,

*然后使能第20位中斷*/

NVIC->IPR[5] |=0x10;

NVIC->ISER[0]|=(1<<20);

}

/*功能:用于復位USB模塊

*參數(shù):無

*返回值:無

*/

/*現(xiàn)在以我的水平還搞不懂雙緩沖為何物,所以先不搞^-^*/

/*一些資料:

*USB低優(yōu)先級中斷(通道20):可由所有USB事件觸發(fā)(正確傳輸,USB復位等).

*USB高優(yōu)先級中斷(通道19):僅能由同步和雙緩沖批量傳輸事件觸發(fā),目的是保證最大的傳輸速率.

*USB喚醒中斷(通道42):由USB掛起模式的喚醒事件觸發(fā). OTG_FS_WKUP喚醒

*

*復位要執(zhí)行的內容可以參見rm0008 21.4.2節(jié)

*/

void USB_Reset(void)

{

PrintS("USB_Resetrn");

/*復位了嘛,那所有以前產生的中斷都沒有用了,清了完事!*/

ISTR=0;

/*通過設置CNTR來控制stm32的USB模塊的工作方式

*所有的USB事件中斷都是在低優(yōu)先級中斷(通道20)上處理的

*好吧就先使能這么多吧,先跑起來再說!

*/

CNTR= CNTR_CTRM | // 使能正確傳輸中斷

CNTR_RESETM | //使能復位中斷

CNTR_SUSPM | //使能掛起中斷

CNTR_WKUPM ; //使能喚醒中斷

FreeBufAddr = EP_BUF_ADDR; //此時FreeBuff指向第一個緩沖區(qū)首地址(不包括描述符表),相對地址

BTABLE = 0x00; //設置緩沖區(qū)描述表的位置仍是相對地址

/*為端點0設置緩沖區(qū)及各種控制位*/

pBUF_DSCR->ADDR_TX = FreeBufAddr;

FreeBufAddr+=8; //端點0設置為8個字節(jié),一般控制數(shù)據為8個字節(jié)

pBUF_DSCR->ADDR_RX = FreeBufAddr;

FreeBufAddr+=8;

/*在count_Rx字段中10~14bit用來表示緩沖區(qū)字節(jié)的快數(shù)

*而15bit用來表示塊的大小

*0---2byte

*1---1byte

*我們這里使用了8個字節(jié),bit15為0,所以應該((8<<10)>>1)即8<<9;

*至于count_Rx我們在發(fā)送時再來賦值

*/

pBUF_DSCR->COUNT_RX= 8 << 9;

/*設置端點0為控制端點,接收緩沖區(qū)有效

*低四位代表端點地址

*/

EPxREG(0) = EP_CONTROL | EP_RX_VALID;

/*使能USB模塊,并設置USB地址為0,以響應枚舉*/

DADDR = DADDR_EF | 0;

}

/*功能:復位一個端點

*參數(shù): 端點號

* EPNum:bit3~bit0 ----> 端點號

* EPNum:bit7 ----> 端點方向

*

*返回值:無

*/

/*其實就是將下一個要發(fā)送的數(shù)據包變成DATA0*/

void EP_Reset(DWORD EPNum)

{

DWORD num,var;

PrintS("EP_Resetrn");

/*獲得端點號,低四位為端點號*/

num = EPNum & 0x0F;

var = EPxREG(num);

/*如果bit7為1則將此端點的發(fā)送toggle置為0,

*否則將此端點的接收toggle置為0

*因為數(shù)據總是從data0數(shù)據包開始發(fā)送的

*/

if(EPNum & 0x80)

EPxREG(num) = var & (EP_MASK | EP_DTOG_TX);/*輸入端點*/

else

EPxREG(num) = var & (EP_MASK | EP_DTOG_RX);/*輸出端點*/

}

/*功能:連接或斷開USB功能

*參數(shù):true -->連接USB

* false-->關閉USB

*返回值:無

*/

void USB_Connect(BOOL turnon)

{

/*需要注意一點的事,所有的USB寄存器盡量用=而不要用與或非

*在編程手冊上有明確表明,這樣可能會導至出一些問題*/

printf("進入連接USB程序rn");

/*將USB強制復位*/

CNTR = CNTR_FRES;

// printf("test1rn");

/*因為剛連接所以應該跟才啟動一樣,將所有沒有處理的中斷給清理掉*/

ISTR=0;

// printf("test2rn");

if(turnon)

{

// printf("test3rn");

/*使能GPIOA,然后將PA.8置低,使USB

*的D+加1.5K上接電阻,使USB集線器識別了高速設備

*這樣才能讓USB識別

*/

RCC->APB2ENR |= (1 << 2); /* enable clock for GPIOA */

GPIOA->CRH &= ~(0x0f << 0 * 4); /* clear port PA8 */

GPIOA->CRH |= (0x03 << 0 * 4); /* PA6 General purpose output open-drain, max speed 50 MHz */

GPIOA->BRR = ( 1 << 8 ); /* reset PA8 (set to low) */

/*經過調試發(fā)現(xiàn),這個語句的本意是:復位USB模塊

*然后在此使能CNTR_RESETM即復位中斷標志

*至于端點0的初始化留在USB低優(yōu)先級中進行處理

*當然,我們也只開了低優(yōu)先級中斷^_^!*/

CNTR = CNTR_RESETM; /*此處只使能了復位中斷,*/

}

else

CNTR = CNTR_FRES | CNTR_PDWN ;/*復位并關閉*/

}

/*功能:設置端點狀態(tài)

*參數(shù):EPnum --->端點號

* stat --->要設置的狀態(tài)值

*返回值:無

*/

void USB_ConfigEP (USB_ENDPOINT_DESCRIPTOR * pEPD)

{

DWORD num,val;

//取得端點號

num = pEPD->bEndpointAddress & 0xf;

val = pEPD->wMaxPacketSize;

//如果是IN端點

if(pEPD->bEndpointAddress & USB_ENDPOINT_DIRECTION_MASK)

{

//此處我只想說pBUF_DSCR是指針,剩下的就是語法問題了

(pBUF_DSCR + num)->ADDR_TX = FreeBufAddr;

/*取2的倍數(shù),因為緩沖區(qū)都是字對齊的,注意此處如果大于1023會出現(xiàn)浪費現(xiàn)象

*因為USB_COUNTn

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

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉