RM新时代网站-首页

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

STM32 LL庫(kù)中斷配置引腳外部中斷的方式

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

中斷原理圖

圖片

圖片

圖片

圖片

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

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

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

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

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

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

圖片

②在NVIC選單中使能中斷

圖片

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

圖片

勾選Select for init Sequence是個(gè)人習(xí)慣,這樣可以在main.c中生成獨(dú)立初始化函數(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) 兩種

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

事件模式 。(很少用)

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

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

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

配置外部中斷需要三步: 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設(shè)置*/
  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);

※關(guān)于LL_EXTI_LINE_x:

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

圖片

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

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

LL API分析:

Input Line引腳輸入配置

stm32fxxx_ll_gpio.h中:

/**/
__STATIC_INLINE void LL_GPIO_AF_SetEXTISource(uint32_t Port, uint32_t Line);/*
使能中斷引腳 Pnx;通過(guò)此函數(shù)將使引腳連接相應(yīng)的EXTI_LINE_x。
@param Port =LL_GPIO_AF_EXTI_PORTn
@param Line =LL_GPIO_AF_EXTI_LINEx
※每次只能配置一個(gè)引腳 Pnx; Pnx 將連接EXTI_LINE_x
*/
__STATIC_INLINE uint32_t LL_GPIO_AF_GetEXTISource(uint32_t Line);/*
  返回連接在EXTI_LINEx上的引腳信息(端口號(hào))。
  @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           無(wú)觸發(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
*/

重設(shè)中斷結(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對(duì)應(yīng)的中斷處理函數(shù);效果與外部觸發(fā)相同
  SET_BIT(EXTI- >SWIER, ExtiLine);
}//軟件觸發(fā)寄存器SWIER改變可以通過(guò)清零掛起位PR清除

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

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

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

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

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

使用案例

void EXTI15_10_IRQHandler(void)
{

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

    關(guān)注

    4

    文章

    147

    瀏覽量

    20524
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1204

    瀏覽量

    52051
  • 中斷控制器
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    9452
  • 串口中斷
    +關(guān)注

    關(guān)注

    0

    文章

    64

    瀏覽量

    13882
  • stm32f1
    +關(guān)注

    關(guān)注

    1

    文章

    56

    瀏覽量

    12199
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32 GPIO的外部中斷設(shè)計(jì)

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

    STM32F407 外部中斷配置步驟

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

    STM32基于標(biāo)準(zhǔn)外設(shè)庫(kù)外部中斷配置

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

    STM32單片機(jī)外部中斷配置講解

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

    Mini STM32 外部中斷實(shí)驗(yàn)

    到RTC鬧鐘事件。線18:連接到USB喚醒事件。每個(gè)外部中斷線可以獨(dú)立的配置觸發(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>實(shí)驗(yàn)

    STM32f10x 外部中斷中斷分組

    利用外部中斷來(lái)實(shí)現(xiàn)按鍵控制LED燈的亮滅。實(shí)驗(yàn)工具:MDK5,STM32F103ZET6開發(fā)板使用固件庫(kù)編程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基于標(biāo)準(zhǔn)外設(shè)庫(kù)外部中斷配置,以及基于參考手冊(cè)如何更加寄存器配置
    發(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庫(kù)學(xué)習(xí)筆記(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'>庫(kù)</b>學(xué)習(xí)筆記(8)<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>的<b class='flag-5'>配置</b>

    STM32f429外部中斷配置解析基于HAL庫(kù)

    STM32f429外部中斷配置解析基于HAL庫(kù)
    發(fā)表于 12-16 16:58 ?10次下載
    <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'>庫(kù)</b>

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

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

    STM32外部中斷

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

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

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

    STM32的IO外部中斷EXTI的使用

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

    STM32單片機(jī)外部中斷簡(jiǎn)介 STM32單片機(jī)外部中斷配置過(guò)程

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

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

    STM32如何配置外部中斷STM32外部中斷
    的頭像 發(fā)表于 10-26 17:47 ?3529次閱讀
    RM新时代网站-首页