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

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

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

STM32速成筆記(3)—中斷

冬至子 ? 來源:二土電子 ? 作者:二土電子 ? 2023-10-24 09:09 ? 次閱讀

一、什么是中斷

首先介紹一下什么是中斷。在實(shí)際開發(fā)過程中,中斷是很有必要的。比如需要針對某種特殊情況進(jìn)行快速響應(yīng),單純的使用一個while輪詢似乎并不能滿足。中斷的概念非常好理解,舉個經(jīng)典例子。比如你在家里看電視,忽然有人敲門,你臨時把電視暫停了,轉(zhuǎn)去開門。開完門之后再次回來繼續(xù)看電視。

中斷也就是這種流程??措娨暤男袨榫皖愃朴诔绦蛑衜ain函數(shù)的while,輪詢執(zhí)行業(yè)務(wù)。忽然有人敲門,對應(yīng)程序運(yùn)行過程中忽然產(chǎn)生了一個中斷請求。此時暫停電視,對應(yīng)于此時程序中斷當(dāng)前的業(yè)務(wù),轉(zhuǎn)而去處理中斷業(yè)務(wù)(開門)。最后,中斷業(yè)務(wù)處理完成后,再繼續(xù)執(zhí)行main函數(shù)while輪詢中的業(yè)務(wù)。簡單用一個圖來表示一下

圖片

中斷概念示意圖

根據(jù)中文參考手冊的介紹,STM32F103ZET6除了一些特殊的中斷外,常用的中斷有60個,這些中斷是通過中斷控制器來有條不紊地分配執(zhí)行的。

二、中斷的相關(guān)概念

2.1 中斷優(yōu)先級

從字面意思來講,優(yōu)先級用來區(qū)分中斷的響應(yīng)順序。當(dāng)同時接收到多個中斷請求時,中斷控制器會根據(jù)中斷優(yōu)先級來決定中斷處理的順序,優(yōu)先級高的會先被處理。如果在處理某個中斷請求時又來了一個中斷,這時會根據(jù)兩個中斷的中斷優(yōu)先級來確定處理方式。

如果新來的中斷優(yōu)先級比當(dāng)前中斷的優(yōu)先級高,則會停止對當(dāng)前中斷的處理,轉(zhuǎn)而處理新的中斷。反之,如果新來的中斷優(yōu)先級比當(dāng)前中斷的優(yōu)先級低,則需要等到當(dāng)前中斷處理完成后,再去處理新來的中斷。

中斷優(yōu)先級有兩種,一種是搶占優(yōu)先級,一種是響應(yīng)優(yōu)先級。響應(yīng)優(yōu)先級通常又被稱為“亞優(yōu)先級”或者“副優(yōu)先級”。當(dāng)兩個中斷的搶占優(yōu)先級相同時,用相應(yīng)優(yōu)先級來決定中斷的處理順序。

如果兩個中斷的搶占優(yōu)先級和相應(yīng)優(yōu)先級相同,則根據(jù)芯片手冊中的中斷向量號來決定中斷的處理順序。比如同時來了兩個中斷請求,在搶占優(yōu)先級和響應(yīng)優(yōu)先級均相同時,中斷向量號為41的中斷會比中斷向量號為42的中斷先被處理。

STM32提供了16個可編程的優(yōu)先等級(使用了4位中斷優(yōu)先級),優(yōu)先級分組可以使用庫函數(shù)提供的NVIC_PriorityGroupConfig()設(shè)置。

2.2 中斷嵌套

一些低優(yōu)先級的中斷可以被高優(yōu)先級中斷打斷,這種情況叫做中斷嵌套。

2.3 中斷服務(wù)函數(shù)

中斷服務(wù)函數(shù)就是在進(jìn)入中斷后需要執(zhí)行的內(nèi)容。

中斷服務(wù)函數(shù)有特定的函數(shù)名,可以在下圖文件中搜索“IRQ”找到。

圖片

中斷服務(wù)函數(shù)名

2.4 中斷標(biāo)志位

不同的中斷會有對應(yīng)的中斷標(biāo)志位,通常標(biāo)志位默認(rèn)值為0。當(dāng)產(chǎn)生中斷請求時,標(biāo)志位被置1。比如設(shè)置一個串口接收完成中斷,串口接收完成標(biāo)志位初始值為0。當(dāng)串口接收完成后對應(yīng)的串口接收完成標(biāo)志位會被置1。

在中斷服務(wù)函數(shù)中檢測該標(biāo)志位的值,來確定是否是串口接收完成中斷產(chǎn)生了。每次中斷服務(wù)函數(shù)執(zhí)行結(jié)束后,需要清除一下對應(yīng)的中斷標(biāo)志位。

三、外部中斷EXIT

STM32F103ZET6有一個外部中斷控制器(EXIT),可以支持20個軟件的中斷/事件請求,其中外部中斷的EXIT0~EXIT15同坐IO中斷。

圖片

外部中斷IO對應(yīng)

其他詳細(xì)的介紹這里就不再說明。

四、中斷程序配置

這里以配置PA0(按鍵WK UP)的外部中斷為例,展示一下庫函數(shù)開發(fā)時,外部中斷的配置流程。關(guān)于其他中斷的配置,后續(xù)使用其他外設(shè)時會單獨(dú)介紹。

想要實(shí)現(xiàn)的效果是,利用外部中斷實(shí)現(xiàn)按下WK UP,LED1點(diǎn)亮。

4.1 設(shè)置中斷分組并使能中斷

這里使用外部中斷,需要開啟AFIO時鐘,設(shè)置IO與外部中斷線的映射關(guān)系。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   // 開啟AFIO時鐘

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);   //選擇GPIO管腳用作外部中斷線路

設(shè)置中斷分組并使能中斷時,庫函數(shù)提供了一個結(jié)構(gòu)體,我們直接配置這個結(jié)構(gòu)體就可以了。

//EXTI0 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;   //EXTI0中斷通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;   //搶占優(yōu)先級
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;   //子優(yōu)先級
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根據(jù)指定的參數(shù)初始化VIC寄存器

需要注意的是,配置優(yōu)先級時,數(shù)值越大,優(yōu)先級越低。

4.2 初始化EXIT

初始化EXIT時,庫函數(shù)也提供了一個結(jié)構(gòu)體,其中包括中斷線,EXIT模式,觸發(fā)方式以及EXIT使能或者失能。由按鍵檢測一節(jié)了解到,WK UP按下時,會產(chǎn)生一個上升沿。因此觸發(fā)方式我們選擇上升沿觸發(fā)。

EXTI_InitStructure.EXTI_Line=EXTI_Line0;   // EXIT0
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;   // 中斷
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;   // 上升沿觸發(fā)
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;   // 使能
    EXTI_Init(&EXTI_InitStructure);

整體配置函數(shù)如下

/*
 *==============================================================================
 *函數(shù)名稱:Exit_Init
 *函數(shù)功能:初始化外部中斷
 *輸入?yún)?shù):無
 *返回值:無
 *備  注:無
 *==============================================================================
 */
void Exit_Init (void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef  EXTI_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   // 開啟AFIO時鐘

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);   //選擇GPIO管腳用作外部中斷線路
    
    //EXTI0 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;   //EXTI0中斷通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;   //搶占優(yōu)先級
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;   //子優(yōu)先級
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根據(jù)指定的參數(shù)初始化VIC寄存器
    
    EXTI_InitStructure.EXTI_Line=EXTI_Line0;   // EXIT0
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;   // 中斷
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;   // 上升沿觸發(fā)
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;   // 使能
    EXTI_Init(&EXTI_InitStructure);
}

4.3 編寫中斷服務(wù)函數(shù)

上面介紹了如何找中斷服務(wù)函數(shù)的函數(shù)名,這里直接開始寫中斷服務(wù)函數(shù)。這里的中斷服務(wù)函數(shù)比較簡單,直接點(diǎn)亮LED1即可。

/*
 *==============================================================================
 *函數(shù)名稱:EXTI0_IRQHandler
 *函數(shù)功能:外部中斷0中斷服務(wù)函數(shù)
 *輸入?yún)?shù):無
 *返回值:無
 *備  注:無
 *==============================================================================
 */
void EXTI0_IRQHandler(void)
{
    // 如果EXIT0中斷標(biāo)志位被置1
    if(EXTI_GetITStatus (EXTI_Line0)==1)
    {
        Med_Led_StateCtrl (LED1,LED_ON);   // 點(diǎn)亮LED1
    }
    EXTI_ClearITPendingBit (EXTI_Line0);   // 清除中斷標(biāo)志位
}

至此,按下WK UP后,LED1會點(diǎn)亮。這種方法與之前的按鍵點(diǎn)亮LED有什么區(qū)別?之前的按鍵點(diǎn)亮LED是在main函數(shù)的while中實(shí)現(xiàn)的,而利用外部中斷的方法,是在外部中斷的中斷服務(wù)函數(shù)中實(shí)現(xiàn)的。即使main函數(shù)的while輪詢業(yè)務(wù)中沒有按鍵業(yè)務(wù),按鍵依舊可以起作用。

五、注意事項

  • ? 中斷服務(wù)函數(shù)無需在.h文件中聲明
  • ? 中斷服務(wù)函數(shù)中不要有過長的業(yè)務(wù)
  • ? 中斷服務(wù)函數(shù)最后需要清除中斷標(biāo)志位
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1189

    瀏覽量

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

    關(guān)注

    0

    文章

    59

    瀏覽量

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

    關(guān)注

    0

    文章

    64

    瀏覽量

    13848
  • STM32F103ZET6
    +關(guān)注

    關(guān)注

    9

    文章

    67

    瀏覽量

    21069
  • AFIO
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    2939
收藏 人收藏

    評論

    相關(guān)推薦

    STM32各模塊學(xué)習(xí)筆記

    中斷......................................................3 STM32筆記之三 時鐘系統(tǒng)
    發(fā)表于 11-30 03:32 ?3132次閱讀

    stm32中斷與外部中斷

    前言:1.有51單片機(jī)開發(fā)經(jīng)驗(yàn)會比較容易理解中斷優(yōu)先級;2.本篇博文基于STM32F103RCT6芯片和3.5.0標(biāo)準(zhǔn)庫編寫;3.作為自己學(xué)習(xí)的一些心得,如有不足之處,還請前輩多多指教;一
    發(fā)表于 11-22 13:06 ?26次下載
    <b class='flag-5'>stm32</b>之<b class='flag-5'>中斷</b>與外部<b class='flag-5'>中斷</b>

    STM32F103學(xué)習(xí)筆記-中斷中斷的控制

    筆記中斷的定義入手,對中斷的種類、作用和配置的思路進(jìn)行了大致的闡述。由于水平不高,若有錯誤,還懇請各位批評指正。
    發(fā)表于 11-24 17:21 ?9次下載
    <b class='flag-5'>STM32</b>F103學(xué)習(xí)<b class='flag-5'>筆記</b>-<b class='flag-5'>中斷</b>與<b class='flag-5'>中斷</b>的控制

    STM32學(xué)習(xí)筆記(4)——NVIC中斷優(yōu)先級管理和外部中斷EXTI

    STM32學(xué)習(xí)筆記(4)——NVIC中斷優(yōu)先級管理和外部中斷EXTI一、NVIC中斷優(yōu)先級管理1. 中斷
    發(fā)表于 11-26 11:36 ?0次下載
    <b class='flag-5'>STM32</b>學(xué)習(xí)<b class='flag-5'>筆記</b>(4)——NVIC<b class='flag-5'>中斷</b>優(yōu)先級管理和外部<b class='flag-5'>中斷</b>EXTI

    STM32核心筆記

    STM32核心筆記文章目錄STM32核心筆記1. 下載程序的兩種方式1.1 串口ISP1.2 仿真器2. 認(rèn)識寄存器3. 地址總線與外設(shè)地址
    發(fā)表于 12-04 12:21 ?1次下載
    <b class='flag-5'>STM32</b>核心<b class='flag-5'>筆記</b>

    STM32學(xué)習(xí)筆記--中斷系統(tǒng)

    目錄:一、STM32中斷系統(tǒng)二、NVIC中斷管理三、中斷配置相關(guān)函數(shù)一、STM32中斷系統(tǒng)
    發(fā)表于 12-04 18:36 ?4次下載
    <b class='flag-5'>STM32</b>學(xué)習(xí)<b class='flag-5'>筆記</b>--<b class='flag-5'>中斷</b>系統(tǒng)

    stm32學(xué)習(xí)筆記-中斷系統(tǒng)

    文章目錄問題引入1、中斷系統(tǒng)概述。1.1 為什么要中斷中斷意義)中斷應(yīng)用場合:1.2 中斷處理過程i.保護(hù)現(xiàn)場ii.執(zhí)行
    發(fā)表于 01-13 10:19 ?0次下載
    <b class='flag-5'>stm32</b>學(xué)習(xí)<b class='flag-5'>筆記</b>-<b class='flag-5'>中斷</b>系統(tǒng)

    STM32自學(xué)筆記(二)中斷

    32位寄存器,控制CM3內(nèi)核的256個中斷 由于STM32F103的可屏蔽中斷只有60個,故我們只會用到 ISER[0] 和ISER[1] . ISER[0] 的bit0~bit31.
    發(fā)表于 01-14 15:10 ?0次下載
    <b class='flag-5'>STM32</b>自學(xué)<b class='flag-5'>筆記</b>(二)<b class='flag-5'>中斷</b>

    stm32的NVIC中斷

    NVIC中斷優(yōu)先級分組CM3內(nèi)核支持256個中斷,其中包含了16個內(nèi)核中斷以及240個外部中斷,并且具有256級的可編程
    發(fā)表于 01-14 15:23 ?8次下載
    <b class='flag-5'>stm32</b>的NVIC<b class='flag-5'>中斷</b>

    STM32筆記中斷優(yōu)先級和開關(guān)總中斷

    STM32中斷優(yōu)先級和開關(guān)總中斷一,中斷優(yōu)先級:STM32(Cortex-M3)中的優(yōu)先級概念
    發(fā)表于 01-14 15:24 ?13次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>筆記</b>之<b class='flag-5'>中斷</b>優(yōu)先級和開關(guān)總<b class='flag-5'>中斷</b>

    stm32軟硬件學(xué)習(xí)筆記3中斷系統(tǒng)

    中斷類型與優(yōu)先級中斷分為兩個類型:內(nèi)核異常和外部中斷。上圖是stm32中斷向量表的部分內(nèi)容和優(yōu)先級。上圖-
    發(fā)表于 01-14 16:05 ?3次下載
    <b class='flag-5'>stm32</b>軟硬件學(xué)習(xí)<b class='flag-5'>筆記</b><b class='flag-5'>3</b>、<b class='flag-5'>中斷</b>系統(tǒng)

    STM32G0開發(fā)筆記:串口中斷的使用

    使用Platformio平臺的libopencm3開發(fā)框架來開發(fā)STM32G0,以下為串口中斷的使用。
    的頭像 發(fā)表于 01-17 10:46 ?2259次閱讀

    STM32入門學(xué)習(xí)筆記中斷架構(gòu)(下)

    Cortex-M3內(nèi)核支持256個中斷,其中包含了16個內(nèi)核中斷和240個外部中斷,并且具有256級的可編程中斷設(shè)置。但
    的頭像 發(fā)表于 02-16 09:57 ?854次閱讀
    <b class='flag-5'>STM32</b>入門學(xué)習(xí)<b class='flag-5'>筆記</b>之<b class='flag-5'>中斷</b>架構(gòu)(下)

    STM32入門學(xué)習(xí)筆記中斷架構(gòu)(上)

    Cortex-M3內(nèi)核支持256個中斷,其中包含了16個內(nèi)核中斷和240個外部中斷,并且具有256級的可編程中斷設(shè)置。但
    的頭像 發(fā)表于 02-16 09:57 ?1248次閱讀

    STM32學(xué)習(xí)筆記一外部中斷

    STM32 的每個 IO 都可以作為外部中斷中斷輸入口。STM32F103 的中斷控制器支持 19 個外部
    的頭像 發(fā)表于 10-24 14:12 ?1279次閱讀
    <b class='flag-5'>STM32</b>學(xué)習(xí)<b class='flag-5'>筆記</b>一外部<b class='flag-5'>中斷</b>