有時候總在想,怎么樣的學習才是最好的?就像學習USB,到底只要學到會應用就可以了,還是要深入到協議內容和驅動底層呢?經常對別人說自己會某某東西,其實自己也只是一知半解的,只會些應用去糊弄別人。于是總在安慰自己:我只要會做些應用就可以了!!!
下面介紹STM32 USB工程的usb_endp.c文件和usb_istr.c兩個文件。
首先是usb_endp.c,這個文件很簡單,就是定義了結果幾個端點輸入輸出函數,我的工程只有。
uint8_t USB_Receive_Buffer[REPORT_COUNT]; //端點接收數據的緩存 REPORT_COUNT=64
uint8_t USB_Send_Buffer[REPORT_COUNT]; //端點發送數據的緩存
volatile uint8_t USB_Received_Flag=0; //USB接收到數據的標志
/*******************************************************************************
* Function Name : EP1_IN_Callback.
* Description : 端點1輸入的回調函數
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
void EP1_IN_Callback(void)
{
}
/*******************************************************************************
* Function Name : EP1_OUT_Callback.
* Description : 端點1輸出回調函數
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
void EP1_OUT_Callback(void)
{
USB_SIL_Read(EP1_OUT,USB_Receive_Buffer);//讀取輸出端點的數據
USB_Received_Flag=1; //收到數據的標志
}
/*******************************************************************************
* Function Name : EP2_IN_Callback.
* Description : 端點輸入的回調函數.
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
void EP2_IN_Callback(void)
{
}
接下去分下usb_istr.c,這個c文件,主要是注冊一些端點響應函數,如上面的端點輸入輸出回電函數,還有就是ISTR中斷狀態狀態寄存器的中斷處理,如下:
__IO uint16_t wIstr; /* 用來保存ISRT寄存器讀出的數值 */
__IO uint8_t bIntPackSOF = 0; /* 連續兩個數據包之間收到的幀起始包數量(SOFs) */
/*定義指向指針的函數指針數組,函數指針分別指向7個端點輸入服務程序*/
void (*pEpInt_IN[7])(void) =
{
EP1_IN_Callback,
EP2_IN_Callback,
EP3_IN_Callback,
EP4_IN_Callback,
EP5_IN_Callback,
EP6_IN_Callback,
EP7_IN_Callback,
};
/*定義指向指針的函數指針數組,函數指針分別指向7個端點輸出服務程序*/
void (*pEpInt_OUT[7])(void) =
{
EP1_OUT_Callback,
EP2_OUT_Callback,
EP3_OUT_Callback,
EP4_OUT_Callback,
EP5_OUT_Callback,
EP6_OUT_Callback,
EP7_OUT_Callback,
};
#ifndef STM32F10X_CL
/*******************************************************************************
* Function Name : USB_Istr
* Description : ISTR中斷事件的中斷服務程序
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
void USB_Istr(void)
{
wIstr = _GetISTR(); //讀取中斷狀態寄存器(ISTR)的值
#if (IMR_MSK & ISTR_CTR) //正確傳輸中斷CTR標志
if (wIstr & ISTR_CTR &wInterrupt_Mask)
{
/* servicing of the endpoint correct transfer interrupt */
/* clear of the CTR flag into the sub */
CTR_LP(); //調用正確傳輸中斷服務程序
#ifdef CTR_CALLBACK
CTR_Callback(); //當定義了CTR_CALLBACK,則調用CTR_Callback,像鉤子函數一樣,在發生CRT中斷時做點什么
#endif
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_RESET) //復位(RESET)中斷標志
if (wIstr & ISTR_RESET &wInterrupt_Mask) //讀出的中斷標志是RESET中斷標志,且RESET中斷使能了
{
_SetISTR((uint16_t)CLR_RESET);//清除RESET中斷標志
Device_Property.Reset();//調用復位函數
#ifdef RESET_CALLBACK
RESET_CALLBACK(); //當定義了RESET_CALLBACK,則調用RESET_CALLBACK,像鉤子函數一樣,在發生RESET中斷時做點什么
#endif
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_DOVR) //分組緩沖區溢出(DOVR)中斷標志
if (wIstr & ISTR_DOVR &wInterrupt_Mask)//讀出的中斷標志是DOVR中斷標志,且DOVR中斷使能了
{
_SetISTR((uint16_t)CLR_DOVR);//清除DOVR中斷標志
#ifdef DOVR_CALLBACK
DOVR_Callback(); //當定義了DOVR_CALLBACK,則調用DOVR_Callback,像鉤子函數一樣,在發生DOVR中斷時做點什么
#endif
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_ERR) //錯誤(ERR)中斷標志
if (wIstr & ISTR_ERR &wInterrupt_Mask)//讀出的中斷標志是ERR中斷標志,且ERR中斷使能了
{
_SetISTR((uint16_t)CLR_ERR);//清除ERR中斷標志
#ifdef ERR_CALLBACK
ERR_Callback(); //當定義了ERR_CALLBACK,則調用ERR_Callback,像鉤子函數一樣,在發生ERR中斷時做點什么
#endif
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_WKUP) //喚醒(WKUP)中斷標志
if (wIstr & ISTR_WKUP &wInterrupt_Mask)//讀出的中斷標志是WKUP中斷標志,且WKUP中斷使能了
{
_SetISTR((uint16_t)CLR_WKUP);//清除ERR中斷標志
Resume(RESUME_EXTERNAL);//調用喚醒函數
#ifdef WKUP_CALLBACK
WKUP_Callback(); //當定義了WKUP_CALLBACK,則調用WKUP_Callback,像鉤子函數一樣,在發生WKUP中斷時做點什么
#endif
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_SUSP) //掛起(SUSP)中斷標志
if (wIstr & ISTR_SUSP &wInterrupt_Mask)//讀出的中斷標志是SUSP中斷標志,且SUSP中斷使能了
{
/* check if SUSPEND is possible */
if (fSuspendEnabled) //檢查是否可以可以掛起
{
Suspend(); //如果可以掛起,則調用掛起函數
}
else
{
/* if not possible then resume after xx ms */
Resume(RESUME_LATER); //如果不可以掛起,則在xx ms后恢復
}
/* clear of the ISTR bit must be done after setting ofCNTR_FSUSP */
_SetISTR((uint16_t)CLR_SUSP);//清除SUSP中斷標志
#ifdef SUSP_CALLBACK
SUSP_Callback(); //當定義了SUSP_CALLBACK,則調用SUSP_Callback,像鉤子函數一樣,在發生SUSP中斷時做點什么
#endif
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_SOF) //幀首(SOF)中斷標志
if (wIstr & ISTR_SOF &wInterrupt_Mask)//讀出的中斷標志是SOF中斷標志,且SOF中斷使能了
{
_SetISTR((uint16_t)CLR_SOF);//清除SOF中斷標志
bIntPackSOF++; //統計共接收到多少SOF
#ifdef SOF_CALLBACK
SOF_Callback(); //當定義了SOF_CALLBACK,則調用SOF_Callback,像鉤子函數一樣,在發生SOF中斷時做點什么
#endif
}
#endif
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_ESOF) //期望幀首(ESOF)中斷標志,當沒有收到期望的SOF幀首是觸發中斷
if (wIstr & ISTR_ESOF &wInterrupt_Mask)//讀出的中斷標志是SOF中斷標志,且ESOF中斷使能了
{
_SetISTR((uint16_t)CLR_ESOF);//清除ESOF中斷標志
/* resume handling timing is made with ESOFs */
/* request without change of the machine state */
Resume(RESUME_ESOF); //恢復ESOF的處理時間
#ifdef ESOF_CALLBACK
ESOF_Callback(); //當定義了ESOF_CALLBACK,則調用ESOF_Callback像鉤子函數一樣,在發生ESOF中斷時做點什么
#endif
}
#endif
} /* USB_Istr */
上一篇:stm32NVIC與外部中斷
下一篇:STM32 中斷初識
推薦閱讀
史海拾趣
為了進一步擴大市場份額,Excelight開始積極拓展國際市場。公司參加各類國際展會和論壇,與全球各地的客戶和合作伙伴建立聯系。同時,Excelight還加強了與國際知名企業的合作,共同開發新產品和新技術。
在市場拓展的過程中,Excelight始終堅持“質量第一、客戶至上”的原則。公司不斷提升產品質量和服務水平,贏得了客戶的信任和口碑。如今,Excelight的產品已經遠銷歐美、亞非拉等多個國家和地區。
在全球節能意識日益增強的背景下,DIALIGHT致力于推動綠色照明的發展。公司的LED產品具有高效節能、長壽命和環保等優點,有助于減少能源消耗和環境污染。此外,DIALIGHT還積極參與各種綠色照明項目,為推動可持續發展貢獻自己的力量。
面對電子行業供應鏈日益復雜的挑戰,Flamar公司高度重視供應鏈管理和優化工作。公司通過引入先進的供應鏈管理系統,實現了對原材料采購、生產制造、物流配送等各個環節的精準控制。同時,公司還積極與上下游企業建立長期穩定的合作關系,共同構建高效的供應鏈生態體系。這些措施有效降低了公司的運營成本,提高了生產效率和產品質量,進一步增強了公司的市場競爭力。
面對激烈的市場競爭和行業變革,達利凱普積極推進數字化轉型和產業升級。公司引入了先進的生產設備和管理系統,實現了生產過程的自動化和智能化。同時,公司還加大了對新材料、新工藝的研發力度,不斷提升產品的性能和品質。這些舉措使達利凱普在激烈的市場競爭中保持了領先地位,也為公司的持續發展奠定了堅實基礎。
全鵬公司一直重視研發和創新。為了不斷滿足市場需求,公司投入大量資源用于新技術和新產品的研發。通過引進高素質、高學歷的研發人員,建立先進的研發實驗室和測試中心,全鵬公司在產品研發方面取得了顯著成果。這些新技術和新產品的推出不僅提升了全鵬公司的市場競爭力,也為客戶帶來了更好的使用體驗。
目前使用的是EP2C8,但處理數據的速度有些不能令人滿意,有什么辦法可以提高處理速度呢?C8的片子換成C6的? 還是換EP3C的片子還是改其他芯片??有什么比較好的辦法嗎? 答案: 從以下方面考慮: 1。不考慮成本,可 ...… 查看全部問答∨ |
|
我手上有一塊SST89E564RD系列的單片機,在網上下載了一個SSTEasyIAP11F.exe按照網上提供的方法,我試過n次了就只成功過一次,后來再也沒成功過。網上提供的方法如下: 首先板子最好有復位電路,即有按鍵能使單片機立即復位 接下來打 ...… 查看全部問答∨ |
建立socket失敗,系統資源用完,這個是什么原因啊,如何處理? FtpConnect SUCC! FTPLIB: socket fail, errno=55 FATAL ERROR! FAIL TO CREATE SOCKET, SYS SOURCE MAY BE NOT ENOUGH! FtpConnect SUC C! 這個信息應該是FTP已經建立成功了,但是socket失敗,而且占用資源沒有釋放的緣故,要強行釋放嗎?… 查看全部問答∨ |
老婆要生孩子,剖出來的,是個兒子。!!! 公司只給2天假,NND,我啥都沒管就回家呆了半個月。今天剛回來,老板找了個新人讓我交接! 交接完準備回家陪老婆過月子,,然后再找工作!!! 真爽!!!! 兒子,我有兒子了!這個破公司又是哪個單 ...… 查看全部問答∨ |
在AT89C51中,P0的地址是0x80 , sfr P0 = 0x80 我通過以下方式訪問寄存器,為什么0x80這個地址的值不變呢?? *(char *)0x80 = 0x22; … 查看全部問答∨ |
求助!!!!!!我要考研,關于嵌入式的。請問哪幾個大學比較好,哪幾個大學比較好考的 我對嵌入式比較感興趣,想考個研,繼續學習,但不知道哪幾個大學在嵌入式方面比較強,希望大家幫我參考一下,謝謝… 查看全部問答∨ |
今天教學實習,自制收音機,很普通那種,AM的,做好后感覺收的臺不是太多,還有就是內置線繞天線的引線太長是不是也會產生干擾?敬請各位大蝦指教,謝謝… 查看全部問答∨ |
問題:F28027的程序燒寫問題!! 如下:以前有個計劃想用做個F28027程序升級的例程,但是后來發現F28027的RAM空間比較小,放不下我的"CKFA",于是乎有了“CKFA1”和“CKFA2”分兩次發送,這樣的話RAM空間基本足夠,這就涉及到程序的反復跳轉等一系 ...… 查看全部問答∨ |
FPGA與SJA1000用SN74ALVC164245電平轉換的問題 FPGA與SJA1000用SN74ALVC164245進行電平轉換,SJA1000的AD0-AD7連接SN74ALVC164245的1B1-1B8,1DIR控制方向;SJA1000的ALE,CS,WR,RD,MODE接 SN74ALVC164245的2B1-2B5,方向應該是FPGA控制SJA1000的這5個信號,即從A到B,DIR接VCC,手冊上說SN74ALVC ...… 查看全部問答∨ |