女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

STM32速成筆記(3)—中斷

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

一、什么是中斷

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

中斷也就是這種流程。看電視的行為就類似于程序中main函數的while,輪詢執行業務。忽然有人敲門,對應程序運行過程中忽然產生了一個中斷請求。此時暫停電視,對應于此時程序中斷當前的業務,轉而去處理中斷業務(開門)。最后,中斷業務處理完成后,再繼續執行main函數while輪詢中的業務。簡單用一個圖來表示一下

圖片

中斷概念示意圖

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

二、中斷的相關概念

2.1 中斷優先級

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

如果新來的中斷優先級比當前中斷的優先級高,則會停止對當前中斷的處理,轉而處理新的中斷。反之,如果新來的中斷優先級比當前中斷的優先級低,則需要等到當前中斷處理完成后,再去處理新來的中斷。

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

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

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

2.2 中斷嵌套

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

2.3 中斷服務函數

中斷服務函數就是在進入中斷后需要執行的內容。

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

圖片

中斷服務函數名

2.4 中斷標志位

不同的中斷會有對應的中斷標志位,通常標志位默認值為0。當產生中斷請求時,標志位被置1。比如設置一個串口接收完成中斷,串口接收完成標志位初始值為0。當串口接收完成后對應的串口接收完成標志位會被置1。

在中斷服務函數中檢測該標志位的值,來確定是否是串口接收完成中斷產生了。每次中斷服務函數執行結束后,需要清除一下對應的中斷標志位。

三、外部中斷EXIT

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

圖片

外部中斷IO對應

其他詳細的介紹這里就不再說明。

四、中斷程序配置

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

想要實現的效果是,利用外部中斷實現按下WK UP,LED1點亮。

4.1 設置中斷分組并使能中斷

這里使用外部中斷,需要開啟AFIO時鐘,設置IO與外部中斷線的映射關系。

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;   //搶占優先級
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;   //子優先級
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根據指定的參數初始化VIC寄存器

需要注意的是,配置優先級時,數值越大,優先級越低。

4.2 初始化EXIT

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

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

整體配置函數如下

/*
 *==============================================================================
 *函數名稱:Exit_Init
 *函數功能:初始化外部中斷
 *輸入參數:無
 *返回值:無
 *備  注:無
 *==============================================================================
 */
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;   //搶占優先級
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;   //子優先級
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根據指定的參數初始化VIC寄存器
    
    EXTI_InitStructure.EXTI_Line=EXTI_Line0;   // EXIT0
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;   // 中斷
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;   // 上升沿觸發
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;   // 使能
    EXTI_Init(&EXTI_InitStructure);
}

4.3 編寫中斷服務函數

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

/*
 *==============================================================================
 *函數名稱:EXTI0_IRQHandler
 *函數功能:外部中斷0中斷服務函數
 *輸入參數:無
 *返回值:無
 *備  注:無
 *==============================================================================
 */
void EXTI0_IRQHandler(void)
{
    // 如果EXIT0中斷標志位被置1
    if(EXTI_GetITStatus (EXTI_Line0)==1)
    {
        Med_Led_StateCtrl (LED1,LED_ON);   // 點亮LED1
    }
    EXTI_ClearITPendingBit (EXTI_Line0);   // 清除中斷標志位
}

至此,按下WK UP后,LED1會點亮。這種方法與之前的按鍵點亮LED有什么區別?之前的按鍵點亮LED是在main函數的while中實現的,而利用外部中斷的方法,是在外部中斷的中斷服務函數中實現的。即使main函數的while輪詢業務中沒有按鍵業務,按鍵依舊可以起作用。

五、注意事項

  • ? 中斷服務函數無需在.h文件中聲明
  • ? 中斷服務函數中不要有過長的業務
  • ? 中斷服務函數最后需要清除中斷標志位
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • GPIO
    +關注

    關注

    16

    文章

    1271

    瀏覽量

    53570
  • 中斷控制器
    +關注

    關注

    0

    文章

    61

    瀏覽量

    9633
  • 串口中斷
    +關注

    關注

    0

    文章

    67

    瀏覽量

    14239
  • STM32F103ZET6
    +關注

    關注

    9

    文章

    67

    瀏覽量

    21598
  • AFIO
    +關注

    關注

    0

    文章

    6

    瀏覽量

    3113
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    STM32各模塊學習筆記

    中斷......................................................3 STM32筆記之三 時鐘系統
    發表于 11-30 03:32 ?3229次閱讀

    stm32中斷與外部中斷

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

    STM32F103學習筆記-中斷中斷的控制

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

    STM32學習筆記(4)——NVIC中斷優先級管理和外部中斷EXTI

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

    STM32核心筆記

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

    STM32學習筆記--中斷系統

    目錄:一、STM32中斷系統二、NVIC中斷管理三、中斷配置相關函數一、STM32中斷系統
    發表于 12-04 18:36 ?4次下載
    <b class='flag-5'>STM32</b>學習<b class='flag-5'>筆記</b>--<b class='flag-5'>中斷</b>系統

    stm32學習筆記-中斷系統

    文章目錄問題引入1、中斷系統概述。1.1 為什么要中斷中斷意義)中斷應用場合:1.2 中斷處理過程i.保護現場ii.執行
    發表于 01-13 10:19 ?0次下載
    <b class='flag-5'>stm32</b>學習<b class='flag-5'>筆記</b>-<b class='flag-5'>中斷</b>系統

    STM32自學筆記(二)中斷

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

    stm32的NVIC中斷

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

    STM32筆記中斷優先級和開關總中斷

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

    stm32軟硬件學習筆記3中斷系統

    中斷類型與優先級中斷分為兩個類型:內核異常和外部中斷。上圖是stm32中斷向量表的部分內容和優先級。上圖-
    發表于 01-14 16:05 ?3次下載
    <b class='flag-5'>stm32</b>軟硬件學習<b class='flag-5'>筆記</b><b class='flag-5'>3</b>、<b class='flag-5'>中斷</b>系統

    STM32G0開發筆記:串口中斷的使用

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

    STM32入門學習筆記中斷架構(下)

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

    STM32入門學習筆記中斷架構(上)

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

    STM32學習筆記一外部中斷

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