STM32中斷入口有兩個,分別是USB_HP_CAN1_TX_IRQHandler和USB_LP_CAN1_RX0_IRQHandler。
其中USB_Istr函數調用了CTR_LP函數,代碼如下。
/*******************************************************************************
* Function Name : USB_HP_CAN1_TX_IRQHandler
* Description : This function handles USB High Priority or CAN TX interrupts
* requests.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USB_HP_CAN1_TX_IRQHandler(void)
{
CTR_HP();
}
/*******************************************************************************
* Function Name : USB_LP_CAN1_RX0_IRQHandler
* Description : This function handles USB Low Priority or CAN RX0 interrupts
* requests.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USB_LP_CAN1_RX0_IRQHandler(void)
{
USB_Istr();
}
2 CTR_LP
CTR_LP為低優先級端點傳輸正常時的中斷服務函數,控制傳輸只能在CTR_LP里面處理,代碼如下。
/*******************************************************************************
* Function Name : CTR_LP.
* Description : Low priority Endpoint Correct Transfer interrupt's service
* routine.
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
void CTR_LP(void)
{
uint32_t wEPVal = 0;
/* stay in loop while pending ints */
while (((wIstr = _GetISTR()) & ISTR_CTR) != 0)
{
_SetISTR((uint16_t)CLR_CTR); /* clear CTR flag */
/* extract highest priority endpoint number */
EPindex = (uint8_t)(wIstr & ISTR_EP_ID);
if (EPindex == 0)
{
/* Decode and service control endpoint interrupt */
/* calling related service routine */
/* (Setup0_Process, In0_Process, Out0_Process) */
/* save RX & TX status */
/* and set both to NAK */
SaveRState = _GetEPRxStatus(ENDP0);
SaveTState = _GetEPTxStatus(ENDP0);
_SetEPRxStatus(ENDP0, EP_RX_NAK);
_SetEPTxStatus(ENDP0, EP_TX_NAK);
/* DIR bit = origin of the interrupt */
if ((wIstr & ISTR_DIR) == 0)
{
/* DIR = 0 */
/* DIR = 0 = > IN int */
/* DIR = 0 implies that (EP_CTR_TX = 1) always */
_ClearEP_CTR_TX(ENDP0);
In0_Process();
/* before terminate set Tx & Rx status */
_SetEPRxStatus(ENDP0, SaveRState);
_SetEPTxStatus(ENDP0, SaveTState);
return;
}
else
{
/* DIR = 1 */
/* DIR = 1 & CTR_RX = > SETUP or OUT int */
/* DIR = 1 & (CTR_TX | CTR_RX) = > 2 int pending */
wEPVal = _GetENDPOINT(ENDP0);
if ((wEPVal & EP_CTR_TX) != 0)
{
_ClearEP_CTR_TX(ENDP0);
In0_Process();
/* before terminate set Tx & Rx status */
_SetEPRxStatus(ENDP0, SaveRState);
_SetEPTxStatus(ENDP0, SaveTState);
return;
}
else if ((wEPVal &EP_SETUP) != 0)
{
_ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */
Setup0_Process();
/* before terminate set Tx & Rx status */
_SetEPRxStatus(ENDP0, SaveRState);
_SetEPTxStatus(ENDP0, SaveTState);
return;
}
else if ((wEPVal & EP_CTR_RX) != 0)
{
_ClearEP_CTR_RX(ENDP0);
Out0_Process();
/* before terminate set Tx & Rx status */
_SetEPRxStatus(ENDP0, SaveRState);
_SetEPTxStatus(ENDP0, SaveTState);
return;
}
}
}/* if(EPindex == 0) */
else
{
/* Decode and service non control endpoints interrupt */
/* process related endpoint register */
wEPVal = _GetENDPOINT(EPindex);
if ((wEPVal & EP_CTR_RX) != 0)
{
/* clear int flag */
_ClearEP_CTR_RX(EPindex);
/* call OUT service function */
(*pEpInt_OUT[EPindex-1])();
} /* if((wEPVal & EP_CTR_RX) */
if ((wEPVal & EP_CTR_TX) != 0)
{
/* clear int flag */
_ClearEP_CTR_TX(EPindex);
/* call IN service function */
(*pEpInt_IN[EPindex-1])();
} /* if((wEPVal & EP_CTR_TX) != 0) */
}/* if(EPindex == 0) else */
}/* while(...) */
}
3 CTR_HP
CTR_HP為高優先級端點傳輸正常時的中斷服務函數,代碼如下。
/*******************************************************************************
* Function Name : CTR_HP.
* Description : High Priority Endpoint Correct Transfer interrupt's service
* routine.
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
void CTR_HP(void)
{
uint32_t wEPVal = 0;
while (((wIstr = _GetISTR()) & ISTR_CTR) != 0)
{
_SetISTR((uint16_t)CLR_CTR); /* clear CTR flag */
/* extract highest priority endpoint number */
EPindex = (uint8_t)(wIstr & ISTR_EP_ID);
/* process related endpoint register */
wEPVal = _GetENDPOINT(EPindex);
if ((wEPVal & EP_CTR_RX) != 0)
{
/* clear int flag */
_ClearEP_CTR_RX(EPindex);
/* call OUT service function */
(*pEpInt_OUT[EPindex-1])();
} /* if((wEPVal & EP_CTR_RX) */
else if ((wEPVal & EP_CTR_TX) != 0)
{
/* clear int flag */
_ClearEP_CTR_TX(EPindex);
/* call IN service function */
(*pEpInt_IN[EPindex-1])();
} /* if((wEPVal & EP_CTR_TX) != 0) */
}/* while(...) */
}
4 CTR_LP和CTR_HP各自處理的事務類型
這兩個函數定義在usb_int.c中,用法如下。
CTR_LP(低優先級中斷Low-priority interrupt),用于控制傳輸、中斷傳輸、批量傳輸( 單緩沖模式)。
CTR_HP(高優先級中斷 High-priority interrupt),用于快速大數據量傳輸處理,比如同步傳輸、批量傳輸,但是都是處理雙緩沖模式。
5 核心注意要點
如果把只初始化了USB_LP_CAN1_RX0_IRQn中斷向量,則所有的正確傳輸中斷只會進入USB_LP_CAN1_RX0_IRQHandler->CTR_LP,所以要想進入CTR_HP必須對其中斷向量進行初始化,否則會使用默認的CTR_LP路徑進行處理。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
usb
+關注
關注
60文章
8438瀏覽量
284454 -
STM32
+關注
關注
2309文章
11162瀏覽量
373415 -
中斷
+關注
關注
5文章
917瀏覽量
43754 -
stm32f1
+關注
關注
1文章
60瀏覽量
12935
發布評論請先 登錄
相關推薦
熱點推薦
STM32f1庫函數開發
” 的學習STM32,實際操作過程中知識盲區比想象中要多很多!只做了兩個GPIO口項目。實戰一 · I/O口1. 文件夾結構USERsystem_stm32f10x.c系統時鐘初始化函
發表于 08-17 06:29
stm32F1輸入捕獲詳解
stm32F1輸入捕獲詳解1、問題:什么叫輸入捕獲回答:舉個例子,比如一個信號由低電平變成高電平時,cpu保存定時器的值,信號再由高電平變成低電平時,cpu又保存一次定時器的值,那么通
發表于 12-06 06:12
STM32F1外部中斷簡介
開啟了學習機器學習,本文就介紹了機器學習的基礎內容。提示:以下是本篇文章正文內容,下面案例可供參考一、 STM32F1 外部中斷簡介我們首先講解 STM32F1 IO 口中斷的一些基礎
發表于 12-09 07:26
stm32f1如何將外部中斷關掉hal庫
引入相關的頭文件。在HAL庫中,與外部中斷相關的頭文件是stm32f1xx_hal_exti.h和stm32f1xx_hal_gpio.h。這兩個頭文件提供了對外部
STM32F1兩個USB中斷入口詳解
評論