0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

STM32 LL庫中斷配置引腳外部中斷的方式

冬至子 ? 來源:ITRelief ? 作者:Sachefgh Xu ? 2023-07-24 14:24 ? 次閱讀

中斷原理圖

圖片

圖片

圖片

圖片

很多情況可以產(chǎn)生中斷,開發(fā)者可以在CubeMx中NVIC選單、通訊模塊選單處配置。請自行探索;部分中斷有關的內(nèi)容在模塊講解時·將會提到。

※啟用中斷后,注意在System Core->NVIC->Code Generation中勾選生成IRQ Handler和 Select for init Sequence Ordering。

※生成的中斷函數(shù)定義在stm32fxxx_it.h和stm32fxxx_it.c中,向函數(shù)中填要執(zhí)行的代碼即可。

對于外部中斷的事件分配,多個引腳將被分配到中斷事件(具體可以參考文檔),若需要區(qū)分則須在中斷程序內(nèi)寫判斷。判斷方式之后給到

配置引腳外部中斷的方式:

①在引腳圖上選中需要配置的引腳,選擇中斷功能(如圖)

圖片

②在NVIC選單中使能中斷

圖片

③在NVIC->Code Generation中勾選生成IRQ Handler和 Select for init Sequence

圖片

勾選Select for init Sequence是個人習慣,這樣可以在main.c中生成獨立初始化函數(shù)

④在GPIO->GPIO配置中斷模式(如圖)

圖片

可以配置上/下拉電阻(上拉、下拉、浮空)和中斷觸發(fā)模式。

⑤生成代碼。(stm32fxxx_it.c中,配置為Interrupt Mode)

void EXTI15_10_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */

  /* USER CODE END EXTI15_10_IRQn 0 */
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */

  /* USER CODE END EXTI15_10_IRQn 1 */
}

外部觸發(fā)類型與中斷處理:

一、觸發(fā)類型

上升沿觸發(fā)、下降沿觸發(fā)、上升/下降沿觸發(fā)(電平變化觸發(fā))

二、中斷處理※

分為中斷模式(Interrupt Mode)事件模式(Event Mode) 兩種

中斷模式即為普通中斷,其概念不多解釋。配置成中斷模式時,stm32fxxx_it庫中會自動生成中斷句柄函數(shù)。

事件模式 。(很少用)

參考本文最前面提供的中斷原理圖。在配置為事件模式時,中斷信號將傳輸給圖中的Pulse Generator而非中斷控制器。

雖然中斷和事件的硬件信號產(chǎn)生源相同,但是配置為事件時將不會發(fā)生掛起,也就是說事件過程不需CPU的參與,可以與主程序并行: 事件機制提供了一個完全由硬件自動完成的觸發(fā)到產(chǎn)生結(jié)果的通道,不要軟件的參與,降低了CPU的負荷,節(jié)省了中斷資源,提高了響應速度(硬件總快于軟件)。

※事件模式雖然有優(yōu)勢,但在實際工程中幾乎不會有人使用。不講了。之后的代碼默認使用中斷模式配置。

配置外部中斷需要三步: 1.配置GPIO與中斷線(Input Line)連接 2.中斷線配置 3.中斷向量配置

結(jié)合代碼:

Pin:PC13
Mode:Interrupt; Rising edge Trigger detection
Pull: Floating

在gpio.c :

/*連接引腳與中斷線(EXTICRn)*/
  LL_GPIO_AF_SetEXTISource(LL_GPIO_AF_EXTI_PORTC, LL_GPIO_AF_EXTI_LINE13);

  /*配置中斷線*/
  EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_13;  //配置觸發(fā)源的連接
  EXTI_InitStruct.LineCommand = ENABLE;
  EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
  LL_EXTI_Init(&EXTI_InitStruct);

  /*引腳GPIO設置*/
  LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_13, LL_GPIO_MODE_FLOATING);
  
  /* EXTI interrupt init*/
  NVIC_SetPriority(EXTI15_10_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),1, 0));
  NVIC_EnableIRQ(EXTI15_10_IRQn);

※關于LL_EXTI_LINE_x:

x代表的是中斷線;中斷線(LINEx) 是中斷信號的輸入硬件。

圖片

Line連接GPIO,例如LINE13可接PA13、PB13、PC13....??梢詫⒁_與中斷線理解為短接。中斷線同時只能連接一個引腳(LINEx只能連接PAx,PBx,PCx,PDx...其一)。 來自Input Line的信號輸入觸發(fā)中斷程序的調(diào)用

※中斷程序結(jié)束時別忘清除中斷位掛起位

LL API分析:

Input Line引腳輸入配置

stm32fxxx_ll_gpio.h中:

/**/
__STATIC_INLINE void LL_GPIO_AF_SetEXTISource(uint32_t Port, uint32_t Line);/*
使能中斷引腳 Pnx;通過此函數(shù)將使引腳連接相應的EXTI_LINE_x。
@param Port =LL_GPIO_AF_EXTI_PORTn
@param Line =LL_GPIO_AF_EXTI_LINEx
※每次只能配置一個引腳 Pnx; Pnx 將連接EXTI_LINE_x
*/
__STATIC_INLINE uint32_t LL_GPIO_AF_GetEXTISource(uint32_t Line);/*
  返回連接在EXTI_LINEx上的引腳信息(端口號)。
  @param Line =LL_GPIO_AF_GPIO_LINEx
  @retval:
  LL_GPIO_AF_GPIO_PORTn
*/

EXTI_LINE配置結(jié)構(gòu)體LL_EXTI_InitTypeDef

typedef struct
{
  uint32_t Line_0_31;/*
  EXTI_LINE選擇; Line_0_31= LL_EXTI_LINE_x
  */        
  FunctionalState LineCommand; /*
 使能位。LineCommand= ENABLE
  */
  uint8_t Mode;/*
 模式選擇; Mode= LL_EXTI_MODE_IT           中斷模式
               LL_EXTI_MODE_EVENT        事件模式
               LL_EXTI_MODE_IT_EVENT     中斷&事件模式 
  */
  uint8_t Trigger;/*
  觸發(fā)模式選擇; Trigger = LL_EXTI_TRIGGER_NONE           無觸發(fā)
                        LL_EXTI_TRIGGER_RISING         上升沿觸發(fā)
                        LL_EXTI_TRIGGER_FALLING        下降沿觸發(fā)
                        LL_EXTI_TRIGGER_RISING_FALLING 上升/下降均觸發(fā)
  */
} LL_EXTI_InitTypeDef;

初始化函數(shù)LL_EXTI_Init()

ErrorStatus LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct)/*
  初始化并啟用中斷EXTI_LINEx。操作成功返回SUCCESS
*/

重設中斷結(jié)構(gòu)體

void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct)
{
  EXTI_InitStruct- >Line_0_31      = LL_EXTI_LINE_NONE;
  EXTI_InitStruct- >LineCommand    = DISABLE;
  EXTI_InitStruct- >Mode           = LL_EXTI_MODE_IT;
  EXTI_InitStruct- >Trigger        = LL_EXTI_TRIGGER_FALLING;
}

?

軟件中斷觸發(fā)函數(shù)(模擬外部觸發(fā))

__STATIC_INLINE void LL_EXTI_GenerateSWI_0_31(uint32_t ExtiLine)
{//ExtiLine = LL_EXTI_LINE_x;觸發(fā)Line_x對應的中斷處理函數(shù);效果與外部觸發(fā)相同
  SET_BIT(EXTI- >SWIER, ExtiLine);
}//軟件觸發(fā)寄存器SWIER改變可以通過清零掛起位PR清除

中斷線判斷函數(shù):

__STATIC_INLINE uint32_t LL_EXTI_IsActiveFlag_0_31(uint32_t ExtiLine);/*
@param ExtiLine =LL_EXTI_LINE_x
當ExtiLine是引發(fā)中斷函數(shù)的中斷線時,返回值為!RESET ;反之返回值RESET (=0)*/

掛起位清除函數(shù):

清除函數(shù)掛起位,使能下一次中斷喚起

__STATIC_INLINE void LL_EXTI_ClearFlag_0_31(uint32_t ExtiLine);/*
@param ExtiLine =LL_EXTI_LINE_x
清除中斷掛起位;若中斷是由軟件模擬外部觸發(fā)實現(xiàn)的,清除時一并將SWIER位清除
*/

使用案例

void EXTI15_10_IRQHandler(void)
{

 LL_mDelay(10);//按鍵消抖,防止多次觸發(fā)(一置位PR即可能再次觸發(fā))
 if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_13) != RESET)//當中斷由EXTI_LINE_13引起
 {
  /* USER CODE BEGIN LL_EXTI_LINE_13 */
    LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_13); //清除標志位
    
    LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_15); //翻轉(zhuǎn)LED
    /* USER CODE END LL_EXTI_LINE_13 */
 }
 if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_15) != RESET)//當中斷由EXTI_LINE_15引起
 {
  LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_15);  //清除標志位
 }
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 下拉電阻
    +關注

    關注

    4

    文章

    146

    瀏覽量

    20470
  • GPIO
    +關注

    關注

    16

    文章

    1184

    瀏覽量

    51768
  • 中斷控制器
    +關注

    關注

    0

    文章

    59

    瀏覽量

    9426
  • 串口中斷
    +關注

    關注

    0

    文章

    64

    瀏覽量

    13830
  • stm32f1
    +關注

    關注

    1

    文章

    56

    瀏覽量

    12152
收藏 人收藏

    評論

    相關推薦

    STM32 GPIO的外部中斷設計

    輸入引腳,還可以通過另外一種叫做外部中斷方式來對引腳的輸入信號進行檢測,本篇首先介紹下EXTI的結(jié)構(gòu),接著介紹
    發(fā)表于 04-14 10:51 ?1967次閱讀
    <b class='flag-5'>STM32</b> GPIO的<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>設計

    STM32F407 外部中斷配置步驟

    介紹STM32F407外部中斷配置步驟,以按鍵為例,實現(xiàn)外部中斷
    的頭像 發(fā)表于 07-06 14:31 ?1769次閱讀
    <b class='flag-5'>STM32</b>F407 <b class='flag-5'>外部</b><b class='flag-5'>中斷</b><b class='flag-5'>配置</b>步驟

    STM32基于標準外設外部中斷配置

    本文介紹了STM32基于標準外設外部中斷配置,以及基于參考手冊如何更加寄存器配置
    的頭像 發(fā)表于 11-02 14:13 ?1593次閱讀
    <b class='flag-5'>STM32</b>基于標準外設<b class='flag-5'>庫</b>的<b class='flag-5'>外部</b><b class='flag-5'>中斷</b><b class='flag-5'>配置</b>

    STM32單片機外部中斷配置講解

    STM32單片機外部中斷配置講解01單片機外部中斷簡介所謂
    發(fā)表于 11-22 12:36 ?14次下載
    <b class='flag-5'>STM32</b>單片機<b class='flag-5'>外部</b><b class='flag-5'>中斷</b><b class='flag-5'>配置</b>講解

    Mini STM32 外部中斷實驗

    到RTC鬧鐘事件。線18:連接到USB喚醒事件。每個外部中斷線可以獨立的配置觸發(fā)方式(上升沿,下降沿或者雙邊沿觸發(fā)),觸發(fā)/屏蔽,專用的狀態(tài)位。從上面可以看出,
    發(fā)表于 11-22 15:06 ?10次下載
    Mini <b class='flag-5'>STM32</b> <b class='flag-5'>外部</b><b class='flag-5'>中斷</b>實驗

    STM32f10x 外部中斷中斷分組

    利用外部中斷來實現(xiàn)按鍵控制LED燈的亮滅。實驗工具:MDK5,STM32F103ZET6開發(fā)板使用固件編程LED燈引腳PD13,按鍵PE0
    發(fā)表于 11-23 18:06 ?4次下載
    <b class='flag-5'>STM32</b>f10x <b class='flag-5'>外部</b><b class='flag-5'>中斷</b>及<b class='flag-5'>中斷</b>分組

    STM32 外部中斷詳解(原理+配置代碼)

    本文介紹了STM32基于標準外設外部中斷配置,以及基于參考手冊如何更加寄存器配置
    發(fā)表于 11-24 17:36 ?2次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>外部</b><b class='flag-5'>中斷</b>詳解(原理+<b class='flag-5'>配置</b>代碼)

    STM32F0x HAL學習筆記(8)外部中斷配置

    Package for STM32F0 Series)本文內(nèi)容:STM32CubeMx 配置外部中斷
    發(fā)表于 12-06 11:36 ?14次下載
    <b class='flag-5'>STM32</b>F0x HAL<b class='flag-5'>庫</b>學習筆記(8)<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>的<b class='flag-5'>配置</b>

    STM32f429外部中斷配置解析基于HAL

    STM32f429外部中斷配置解析基于HAL
    發(fā)表于 12-16 16:58 ?9次下載
    <b class='flag-5'>STM32</b>f429<b class='flag-5'>外部</b><b class='flag-5'>中斷</b><b class='flag-5'>配置</b>解析基于HAL<b class='flag-5'>庫</b>

    使用LL開發(fā)STM32:GPIO口與外部中斷

    文章目錄目的輸出與控制輸入與端口值讀取外部中斷總結(jié)目的GPIO口使用是單片機開發(fā)中最簡單的一塊,STM32的GPIO口無論是使用HAL還是LL
    發(fā)表于 01-13 16:13 ?13次下載
    使用<b class='flag-5'>LL</b><b class='flag-5'>庫</b>開發(fā)<b class='flag-5'>STM32</b>:GPIO口與<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>

    STM32外部中斷

    事件(上升沿或下降沿或雙邊沿)并能夠單獨地屏蔽:有一個掛起寄存器維持所有中斷請求的狀態(tài)。EXTI可以檢測到脈沖寬度小于內(nèi)部APB2的時鐘周期。多達80個通用IO口連接到16個外部中斷線。STM
    發(fā)表于 01-14 15:14 ?2次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>外部</b><b class='flag-5'>中斷</b>

    STM32LL系列教程(四)——外部中斷

    本文介紹通過LL,讀取按鍵外部中斷,改變LED亮滅
    發(fā)表于 01-14 15:47 ?10次下載
    <b class='flag-5'>STM32LL</b><b class='flag-5'>庫</b>系列教程(四)——<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>

    STM32的IO外部中斷EXTI的使用

    方式訪問輸入引腳,還可以通過另外一種叫做外部中斷方式來對引腳的輸入信號進行檢測,本篇首先介紹
    的頭像 發(fā)表于 06-22 10:21 ?1855次閱讀
    <b class='flag-5'>STM32</b>的IO<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>EXTI的使用

    STM32單片機外部中斷簡介 STM32單片機外部中斷配置過程

    STM32 單片機是一款高性能、低功耗的 32 位微控制器,具有強大的計算能力、靈活的外設模塊以及優(yōu)秀的擴展性,開發(fā)周期短、成本低。在單片機應用中,外部中斷是一種重要的硬件觸發(fā)方式,本
    發(fā)表于 08-15 18:21 ?2834次閱讀

    STM32如何配置外部中斷STM32外部中斷配置步驟

    STM32如何配置外部中斷?STM32外部中斷
    的頭像 發(fā)表于 10-26 17:47 ?3239次閱讀