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

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

3天內不再提示

STM32學習筆記一外部中斷

冬至子 ? 來源:TECHTIMES ? 作者:霽風AI ? 2023-10-24 14:12 ? 次閱讀

1. STM32 外部中斷簡介

STM32 的每個 IO 都可以作為外部中斷的中斷輸入口。STM32F103 的中斷控制器支持 19 個外部中斷/事件請求。每個中斷設有狀態位,每個中斷/事件都有獨立的觸發和屏蔽設置。代碼主要分布在固件庫的 stm32f10x_exti.h 和 stm32f10x_exti.c 文件。

STM32F103的 19 個外部中斷為:

1.jpg

觸發方式:STM32 的外部中斷是通過邊沿來觸發的,不支持電平觸發。

2. 外部中斷分組

STM32 的每一個 GPIO 都能配置成一個外部中斷觸發源,STM32 通過根據引腳的序號不同將眾多中斷觸發源分成不同的組。

比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0 為第一組。

依此類推,我們能得出一共有16 組,STM32 規定,每一組中同時只能有一個中斷觸發源工作,那么,最多工作的也就是16個外部中斷。

圖片

3. 使用 IO 口外部中斷的配置步驟

3.1 初始化 IO 口為輸入

設置作為外部中斷輸入的 IO 口的狀態,可以設置為上拉 / 下拉輸入 / 浮空輸入,但浮空的時候外部一定要帶上拉,或者下拉電阻。否則可能導致中斷不停的觸發。在干擾較大的地方,就算使用了內部上拉/下拉,也建議使用外部上拉/下拉電阻,這樣可以一定程度防止外部干擾帶來的影響。

3.2 開啟 IO 口復用時鐘,設置 IO 口與中斷線的映射關系

STM32 的 IO 口與中斷線的對應關系需要配置外部中斷配置寄存器 EXTICR,這樣我們要先開啟復用時鐘,然后配置 IO 口與中斷線的對應關系。才能把外部中斷與中斷線連接起來。

3.3 開啟與該IO口相對的線上中斷/事件,設置觸發條件

配置中斷產生的條件,STM32 可以配置成上升沿觸發,下降沿觸發,或者任意電平變化觸發,但是不能配置成高電平觸發和低電平觸發。同時要開啟中斷線上的中斷。

注意:

如果使用外部中斷,并設置該中斷的 EMR 位的話,會引起軟件仿真不能跳到中斷,而硬件上是可以的。而不設置 EMR,軟件仿真就可以進入中斷服務函數,并且硬件上也是可以的。建議不要配置 EMR 位。

3.4 配置中斷分組NVIC

配置中斷的分組,以及使能,對 STM32 的中斷來說,只有配置了 NVIC 的設置,并開啟才能被執行,否則是不會執行到中斷服務函數里面去的。

3.5 編寫中斷服務函數

這是中斷設置的最后一步,中斷服務函數,是必不可少的,如果在代碼里面開啟了中斷,但是沒編寫中斷服務函數,就可能引起硬件錯誤,從而導致程序崩潰!所以在開啟了某個中斷后,一定要記得為該中斷編寫服務函數。在中斷服務函數里面編寫你要執行的中斷后的操作。

4. 例程分析

4.1 配置外部中斷對應IO

//---------------------------------------------------------------------------------------------------------------------------------------------
//    函 數 名: exti_gpio_config
//    功能說明: 外部中斷GPIO參數配置
//    形    參: 無
//    返 回 值: 無
//    日    期: 2020-04-25
//    備    注: 
//    作    者: by 霽風AI
//---------------------------------------------------------------------------------------------------------------------------------------------
static void exti_gpio_config(void)
{
    GPIO_InitTypeDef gpio_init_config;

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA時鐘

    gpio_init_config.GPIO_Pin       = GPIO_Pin_0;//PA0
    gpio_init_config.GPIO_Mode      = GPIO_Mode_IPD; //PA0設置成輸入,默認下拉      
    GPIO_Init(GPIOA, &gpio_init_config);//初始化GPIOA.0
}

4.2 配置外部中斷參數

//---------------------------------------------------------------------------------------------------------------------------------------------
//    函 數 名: exti_config
//    功能說明: 外部中斷參數配置
//    形    參: 無
//    返 回 值: 無
//    日    期: 2020-04-25
//    備    注: 
//    作    者: by 霽風AI
//---------------------------------------------------------------------------------------------------------------------------------------------
static void exti_config(void)
{
    EXTI_InitTypeDef exti_init_config;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);    //外部中斷,需要使能AFIO時鐘

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //PA0設置為外部中斷

      exti_init_config.EXTI_Line      = EXTI_Line0;
      exti_init_config.EXTI_Mode      = EXTI_Mode_Interrupt;  
      exti_init_config.EXTI_Trigger   = EXTI_Trigger_Rising;//上升沿觸發
      exti_init_config.EXTI_LineCmd   = ENABLE;

    EXTI_Init(&exti_init_config);       //根據EXTI_InitTypeDef中指定的參數初始化外設EXTI寄存器
}

4.3 配置中斷向量

//---------------------------------------------------------------------------------------------------------------------------------------------
//    函 數 名: exit_nvic_config
//    功能說明: 中斷向量參數配置
//    形    參: 無
//    返 回 值: 無
//    日    期: 2020-04-25
//    備    注: 
//    作    者: by 霽風AI
//---------------------------------------------------------------------------------------------------------------------------------------------
static void exti_nvic_config(void)
{
    NVIC_InitTypeDef nvic_init_config;

    nvic_init_config.NVIC_IRQChannel                    = EXTI0_IRQn;//使能按鍵所在的外部中斷通道
    nvic_init_config.NVIC_IRQChannelPreemptionPriority  = 0x02;//搶占優先級2
    nvic_init_config.NVIC_IRQChannelSubPriority         = 0x02;//子優先級1
    nvic_init_config.NVIC_IRQChannelCmd                 = ENABLE;

    NVIC_Init(&nvic_init_config);
}

4.4 統一外部中斷調用接口

//---------------------------------------------------------------------------------------------------------------------------------------------
//    函 數 名: exti_init
//    功能說明: 外部中斷初始化
//    形    參:     exti_no:中斷號
//    返 回 值: 無
//    日    期: 2020-04-25
//    備    注: 外部調用此函數,實現EXTI的初始化配置
//    作    者: by 霽風AI
//---------------------------------------------------------------------------------------------------------------------------------------------
void exti_init(uint8_t exti_no)
{
    if (exti_no == 0)
    {
        exti_gpio_config();
        exti_config();
        exti_nvic_config();
    }
}

4.5 編寫中斷服務函數

//---------------------------------------------------------------------------------------------------------------------------------------------
//    函 數 名: EXTI0_IRQHandler
//    功能說明: 外部中斷0服務函數
//    形    參: 無
//    返 回 值: 無
//    日    期: 2020-04-25
//    備    注: 
//    作    者: by 霽風AI
//---------------------------------------------------------------------------------------------------------------------------------------------
void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)  
    {
        g_exti_cnt++;

        if (g_exti_cnt % 2)
        {
            Bsp_LedOn(0);   //點亮OLED0
        }
        else 
        {
            Bsp_LedOff(0);  //熄滅OLED0
        }

        if (g_exti_cnt > 200)
        {
            g_exti_cnt = 0;
        }

        EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0線路掛起
    }
}

補充:

在編寫中斷服務函數的時候會經常使用到兩個函數。

(1)第一個函數是判斷某個中斷線上的中斷是否發生(標志位是否置位):

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

這個函數一般使用在中斷服務函數的開頭判斷中斷是否發生。

(2)第二個是清除某個中斷線上的中斷標志位:

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

這個函數一般應用在中斷服務函數結束之前,清除中斷標志位。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2247

    文章

    10689

    瀏覽量

    349776
  • RTC
    RTC
    +關注

    關注

    2

    文章

    493

    瀏覽量

    65556
  • GPIO
    +關注

    關注

    16

    文章

    1149

    瀏覽量

    50760
  • 外部中斷
    +關注

    關注

    1

    文章

    131

    瀏覽量

    15691
  • 中斷控制器
    +關注

    關注

    0

    文章

    59

    瀏覽量

    9390
收藏 人收藏

    評論

    相關推薦

    STM32單片機學習筆記(8):外部中斷

    利用CubMX生成基于32單片機的HAl庫工程,然后編寫程序在proteus上仿真驗證。本項目最適合沒有開發板的同學學習,零成本利用仿真軟件率先入門STM32單片機。本項目需要實現的功能就是利用CubMX配置外部
    發表于 07-20 15:32 ?579次閱讀
    <b class='flag-5'>STM32</b>單片機<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>(8):<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>

    STM32學習筆記外部中斷EXTI學習

    本帖最后由 飄落的葉 于 2013-4-10 10:46 編輯 STM32學習筆記外部中斷EXTI
    發表于 04-10 10:46

    STM32學習外部中斷粗略了解 精選資料分享

    *STM32學習外部中斷實驗粗略了解剛開始粗略的學習STM32,寫博客就當是
    發表于 08-17 07:07

    STM32_外部中斷程序

    STM32 外部中斷程序,很好的學習資料,快來下載吧
    發表于 02-15 17:09 ?30次下載

    STM32學習筆記——外部中斷的初步了解

    STM32F103有76個中斷,包括16個內核中斷和60個可屏蔽中斷,具有16級16級可編程的中斷優先級。 理解
    發表于 11-30 01:47 ?779次閱讀
     <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個模塊學習筆記 目錄 STM32筆記之一 中斷優先級.................
    發表于 11-30 03:32 ?3032次閱讀

    STM32f10x 外部中斷中斷分組

    利用外部中斷來實現按鍵控制LED燈的亮滅。實驗工具:MDK5,STM32F103ZET6開發板使用固件庫編程LED燈引腳PD13,按鍵PE0首先了解一下32的外部
    發表于 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學習筆記(4)——NVIC中斷優先級管理和外部中斷EXTI

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

    STM32F407學習記錄---外部中斷實驗

    STM32F407學習記錄---外部中斷概述STM32F4外部
    發表于 11-29 16:06 ?4次下載
    <b class='flag-5'>STM32</b>F407<b class='flag-5'>學習</b>記錄---<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>實驗

    STM32學習筆記外部中斷/事件

    中斷基礎知識異常就是中斷,中斷就是異常。但是習慣上稱系統產生的為異常,外部產生的為中斷,即系統異常和外部
    發表于 12-04 17:06 ?7次下載
    【<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中斷應用中斷知識介紹STM32 中斷應用概覽異常NVIC優先級定義中斷知識介紹
    發表于 12-04 17:21 ?9次下載
    <b class='flag-5'>STM32</b>(六)-------<b class='flag-5'>中斷</b>(<b class='flag-5'>外部</b><b class='flag-5'>中斷</b>)

    第二節: 外部中斷學習(用CubeMX學習STM32)

    STM32CubeMX配置, 使用HAL庫,學習STM32外部中斷,hal和CubeMX學習分享
    發表于 12-05 13:06 ?4次下載
    第二節: <b class='flag-5'>外部</b><b class='flag-5'>中斷</b><b class='flag-5'>學習</b>(用CubeMX<b class='flag-5'>學習</b><b class='flag-5'>STM32</b>)

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

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

    STM32_EXTI外部中斷學習筆記

    參考資料:《STM32F4xx中文參考手冊》系統配置控制器以及中斷和事件章節。EXTI( External interrupt /evet controller)之前接觸過51單片機的都了解到51
    發表于 01-14 15:21 ?3次下載
    <b class='flag-5'>STM32</b>_EXTI<b class='flag-5'>外部</b><b class='flag-5'>中斷</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>

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

    STM32如何配置外部中斷?STM32外部中斷配置步驟? 作為一款現代化的微控制器,
    的頭像 發表于 10-26 17:47 ?2391次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>