娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月30日(星期五)

2018年05月30日 | STM32F USB中斷分析

發布者:anluran 來源: eefocus關鍵字:STM32F  USB  中斷分析 手機看文章 掃描二維碼
隨時隨地手機看文章

有時候總在想,怎么樣的學習才是最好的?就像學習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 */


關鍵字:STM32F  USB  中斷分析 引用地址:STM32F USB中斷分析

上一篇:stm32NVIC與外部中斷
下一篇:STM32 中斷初識

推薦閱讀

中國儲能網訊:在能源變革與發展中,集能源輸送、市場交易、優化配置等功能于一體的電網處于中心環節,正日益發揮著高效輸能平臺、安全配置平臺、經濟運行平臺、友好互動平臺的重要作用,并向能源互聯網漸進,而這一切都離不開大數據的創新應用。同時,電網平臺涉及面廣,其大數據具有量大、分布廣、類型多等特點,逐步衍生出多個新生態圈、產業鏈,不僅...
單片機型號:STM32L051C8T6開發環境MDK5.12庫版本:STM32L0xx_HAL_Driver V1.1.0主機環境:Windows XP之前一直使用的STM32F030C8T6單片機來做開發,因需求更改更換了一個新型號STM32L051C8T6,主要是用到了其低功耗特性,本以為直接把代碼拷貝一下就可以使用了,結果是太天真了,STM32F030C8T6使用的庫是STM32F0_StdPeriph_Lib而STM32L051C8T6使用的庫是STM3...
var videoObject = { container: '.video', variable: 'player', autoplay: true, ...

史海拾趣

問答坊 | AI 解惑

SST89系列資料

SST89系列資料,pdf格式,內容全面! …

查看全部問答∨

如何提高FPGA速度方法分析

目前使用的是EP2C8,但處理數據的速度有些不能令人滿意,有什么辦法可以提高處理速度呢?C8的片子換成C6的?  還是換EP3C的片子還是改其他芯片??有什么比較好的辦法嗎?   答案:   從以下方面考慮: 1。不考慮成本,可 ...…

查看全部問答∨

SST89X5XX系列的單片機的成IAP下載問題!

我手上有一塊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程序升級的例程,但是后來發現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 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 大连市| 西安市| 焦作市| 保亭| 囊谦县| 万宁市| 祥云县| 偏关县| 中超| 宁远县| 鄂温| 阳东县| 中宁县| 彰武县| 郓城县| 朝阳区| 南陵县| 宜阳县| 青神县| 望谟县| 灵台县| 涞源县| 阿拉善盟| 安义县| 永丰县| 上林县| 洪湖市| 江口县| 普定县| 梁山县| 大田县| 东至县| 孙吴县| 正镶白旗| 巧家县| 黄平县| 龙游县| 南木林县| 平安县| 兴仁县| 桐乡市|