在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

聊聊一個STM32中斷處理問題

茶話MCU ? 來源:茶話MCU ? 作者:茶話MCU ? 2023-03-22 09:06 ? 次閱讀

先看一段代碼:

while(1)

{

if(EXTI_Sign==1)

{

HAL_Delay(Period);

HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);

HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);

EXTI_Sign=0;

。。。。。。

}

}

有人使用STM32G0系列的芯片開發產品,有段功能測試驗證代碼如上所示,相同的函數必須調用2次才能正常運行,調用2次倒也罷了,關鍵是必須!頗為納悶。

這里開啟了PA3的外部中斷功能,上下沿均可觸發。PA3接收外來報警信號,類似于煙感報警器。報警信號是一串脈沖信號,報警信號過來時存在多次抖動問題??蛻粝肓藗€方法消抖,只要報警端口有電平變化就觸發中斷然后把中斷Disable,并設置報警標志再回到主程序。

主程序里識別到報警有效標志后延時幾分鐘再Enable剛才Disable掉的外部中斷。但是,他發現再次使能外部中斷時需要連續兩次調用使能中斷的代碼才可以響應新的報警信號。【此處文字依據反饋者的文字描述組織而成】

下面MX_GPIO_Init(void)是經CubeMx配置后自動生成的,里面有EXTI相關NVIC配置。相關代碼如下:

static void MX_GPIO_Init(void)


{


  GPIO_InitTypeDef GPIO_InitStruct = {0};


/* GPIO Ports Clock Enable */


  __HAL_RCC_GPIOA_CLK_ENABLE();


  __HAL_RCC_GPIOB_CLK_ENABLE();


    。。。。。。


/*Configure GPIO pin : PA3 */


  GPIO_InitStruct.Pin = GPIO_PIN_3;


  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;


  GPIO_InitStruct.Pull = GPIO_PULLUP;


  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* EXTI interrupt init*/


  HAL_NVIC_SetPriority(EXTI2_3_IRQn, 0, 0);


  HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);


}




基于上沿觸發的中斷服務程序如下[基于下沿觸發的此處省略】:
EXTI ISR():
{
__HAL_GPIO_EXTI_CLEAR_RISING_IT(GPIO_PIN_3);//清中斷申請標志;


HAL_NVIC_DisableIRQ(EXTI2_3_IRQn);//關閉中斷響應


EXIT_Sign=1;//表示收到報警信號
}


主循環代碼像下面書寫才能讓程序正常運行:【略去了其它代碼】


while (1)
  {
    if(EXTI_Sign ==1)
    {
    HAL_Delay(Period);


    MX_GPIO_Init();//客戶無意中發現加這句有用


   HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);


   EXTI_Sign =0;
    。。。。。。
    }
}



現在的疑問是在EXTI中斷服務程序運行HAL_NVIC_DisableIRQ(EXTI2_3_IRQn)后,到主循環代碼里再次使能外部中斷時,為何還要額外運行一次MX_GPIO_Init()函數才能讓程序正常運行。最終發現運行該函數的實質就是將HAL_NVIC_EnableIRQ(EXTI2_3_IRQn)多運行一次。

換句話說,上面的主循環代碼要改成下面樣子才可以讓程序正常運行:

while(1)

{

if(EXTI_Sign==1)

{//報警有效,即發生過報警時,代碼進到這里。

HAL_Delay(Period);

HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);//1

HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);//2

EXTI_Sign=0; //清除報警標志,準備監測新的警情

。。。。。。

}

}

說到底,問題就是主循環里為何要兩次重復運行HAL_NVIC_EnableIRQ(EXTI2_3_IRQn)函數后才能響應新的報警信號呢?

可以肯定,理論上講,開啟某個中斷響應無須2次運行相關函數。我們來一起找找原因。為了便于查看代碼,我把中斷服務程序和主程序代碼截圖放在一起。

348cf5ca-c844-11ed-bfe3-dac502259ad0.png

34a6f79a-c844-11ed-bfe3-dac502259ad0.png

在中斷服務程序里就是清除中斷請求標志,關閉PA3的外部中斷響應,并設置警情標志EXTI_Sign為1。

這里有沒有問題呢?

他使用的HAL_NVIC_EnableIRQ(EXTI2_3_IRQn)函數,關閉的是內核對該中斷請求的響應,盡管他剛才在進中斷時做外部中斷請求標志的清零,但并不能保證他這個清零操作之后不會再產生外部中斷請求。事實上,結合目前的使用場景,由于報警信號是一串跳變脈沖,即使一進中斷就先做了個中斷請求標志的清零,在中斷退出甚至還未完全退出時大概率還會產生新的中斷請求,但又由于他在中斷服務程序里把中斷響應關閉了,中斷不能得到及時響應,請求只能懸著【Pending】跟隨程序來到主循環。

主循環代碼首先檢查報警標志是否生效,生效則進入循環體,先靜靜地歇會兒【HAL_Delay(Period)】,讓剛才的報警信號完全消停下來,然后再調用第一個HAL_NVIC_EnableIRQ(EXTI2_3_IRQn)函數打開中斷響應。這下可好,剛才候著的中斷請求得到響應機會了,則馬上去執行中斷服務程序。這次在中斷服務程序里的操作跟上次完全一樣,即在中斷服務程序里,又調用中斷響應關閉函數,做了跟剛才主循環里第一個HAL_NVIC_EnableIRQ(EXTI2_3_IRQn)函數完全相反的功能。即到這個點的時候,中斷響應被關閉了。

如果中斷返回后沒有使用第2句HAL_NVIC_EnableIRQ(EXTI2_3_IRQn)函數打開中斷響應,而只是執行那句清零報警標志然后退出循環體。由于中斷響應已經關閉,不管外部怎么報警都不會得到響應,報警標志也就永遠不會被置1,這樣主循環體也進不了內循環來開啟中斷響應。

如果有了第2句HAL_NVIC_EnableIRQ(EXTI2_3_IRQn)函數在循環體內,它就可以扭轉剛才在中斷服務程序里關閉外部中斷響應的局面,即把它扳回來。這樣的話功能上至少能正常運轉了。

原因基本就大致這么回事?;诂F有代碼寫法,如何破除這個連寫2次的搞法呢。其實,我們只需要在主循環體內開啟外部中斷響應的函數前,延時等待函數之后加上對相關中斷請求標志位的清零即可解決當前困惑。

比如像下面這樣【其中DSB是個數據同步隔離指令,保障它前面的指令執行完畢后才執行它后面的】,在主循環內開啟中斷響應前,先做中斷請求標志的清零。

while(1)

{

if(EXTI_Sign==1)

{

HAL_Delay(Period);

__HAL_GPIO_EXTI_CLEAR_RISING_IT(GPIO_PIN_3); __HAL_GPIO_EXTI_CLEAR_FALLING_IT(GPIO_PIN_3);

__DSB();

HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);

EXTI_Sign=0;

。。。。。。

}

}

OK,本話題就聊到這里,愿君有所獲。類似問題不論STM32新手還是老手都可能不期而遇,祝君好運!

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

    關注

    2270

    文章

    10915

    瀏覽量

    356754
  • 中斷
    +關注

    關注

    5

    文章

    900

    瀏覽量

    41590
  • 程序
    +關注

    關注

    117

    文章

    3793

    瀏覽量

    81220
  • 函數
    +關注

    關注

    3

    文章

    4341

    瀏覽量

    62806
  • 代碼
    +關注

    關注

    30

    文章

    4808

    瀏覽量

    68813

原文標題:聊聊一個STM32中斷處理問題

文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    STM32中斷優先級和開關總中斷教程

    STM32中斷優先級和開關總中斷 教程
    發表于 11-23 18:03 ?0次下載

    STM32中斷管理函數

    STM32中斷管理函數,感興趣的小伙伴們可以瞧瞧。
    發表于 11-02 19:13 ?15次下載

    中斷是什么?STM32中斷系統介紹和中斷配置步驟資料免費下載

    本文檔的主要內容詳細介紹的是中斷是什么?STM32中斷系統介紹和中斷配置步驟資料免費下載。
    發表于 10-11 08:00 ?5次下載
    <b class='flag-5'>中斷</b>是什么?<b class='flag-5'>STM32</b><b class='flag-5'>中斷</b>系統介紹和<b class='flag-5'>中斷</b>配置步驟資料免費下載

    STM32的Cortex-M3中斷異常處理

    STM32處理器中有43可屏蔽中斷通道(不包含 16 Cortex?-M3的中斷線)。共設
    發表于 11-16 15:35 ?8308次閱讀
    <b class='flag-5'>STM32</b>的Cortex-M3<b class='flag-5'>中斷</b>異常<b class='flag-5'>處理</b>

    STM32中斷及FreeRTOS中斷優先級配置

    STM32中斷,及FreeRTOS中斷優先級配置
    的頭像 發表于 03-04 11:45 ?8958次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>中斷</b>及FreeRTOS<b class='flag-5'>中斷</b>優先級配置

    STM32關全局中斷的方法 STM32中斷類型

    。 STM32中斷類型: 系統異常:內核水平 10 外部中斷:外設水平 60 STM32關全
    的頭像 發表于 07-22 10:52 ?2.8w次閱讀

    STM32中斷與DMA通信編程

    學習stm32中斷、DMA通信原理和編程方法。使用stm32tubemx和HAL庫分別完成以下編程練習:(1)用stm32F103核心板的GPIOA端
    發表于 11-23 17:51 ?12次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>中斷</b>與DMA通信編程

    stm32f103中斷總結很詳細

    stm32f103中斷總結很詳細
    發表于 11-24 17:06 ?28次下載
    <b class='flag-5'>stm32</b>f103<b class='flag-5'>中斷</b>總結很詳細

    STM32中斷與DMA通信編程

    學習stm32中斷、DMA通信原理和編程方法。使用stm32tubemx和HAL庫分別完成以下編程練習:(1)用stm32F103核心板的GPIOA端
    發表于 11-26 10:21 ?3次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>中斷</b>與DMA通信編程

    STM32中斷與DMA通信編程

    學習stm32中斷、DMA通信原理和編程方法。使用stm32tubemx和HAL庫分別完成以下編程練習:(1)用stm32F103核心板的GPIOA端
    發表于 11-26 19:21 ?11次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>中斷</b>與DMA通信編程

    STM32中斷系統的基本概念

    STM32中斷系統基本概念、日常生活中斷*圖片來源網絡二、處理
    發表于 01-14 14:57 ?0次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>中斷</b>系統的基本概念

    stm32中斷初識與實踐(上)

    stm32中斷的講解我分為兩部分,即兩篇文章,上半部分做一個總結性的概覽,有初步認識,下半部分會通過
    發表于 02-11 15:26 ?4次下載
    <b class='flag-5'>stm32</b><b class='flag-5'>中斷</b>初識與實踐(上)

    STM32中斷系統的工作流程

    管理核心的STM32中斷系統有初步的了解,明白中斷些基本概念以及
    的頭像 發表于 06-22 09:17 ?2665次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>中斷</b>系統的工作流程

    為什么有些STM32中斷沒有子優先級?

    看到交流群在討論關于【關于STM32中斷優先級的話題】,其中就有小伙伴提到:為什么有些STM32中斷
    的頭像 發表于 10-17 15:50 ?909次閱讀
    為什么有些<b class='flag-5'>STM32</b><b class='flag-5'>中斷</b>沒有子優先級?

    stm32中斷怎么處理

    STM32款非常強大的微控制器系列,具有豐富的外設和功能。中斷STM32非常重要的部分,能夠幫助我們提高系統的響應速度和效率。本文將
    的頭像 發表于 01-02 17:35 ?2658次閱讀
    主站蜘蛛池模板: 精品伊人久久大线蕉色首页| 久久婷婷丁香七月色综合| 好色亚洲| bl 高h文| 午夜色图| 色多多网站| 欧美日韩精品一区二区在线线| 男人的天堂在线精品视频| 黄色毛片播放| 综合网天天操天天射| 天天艹天天操| 成人国产一区二区三区| 黄视频网站入口| 操白虎美女| 天堂网最新版www| 欧美a性| 成人丁香婷婷| 人人插人人干| 男人操女人在线观看| 免费久久精品国产片香蕉| 婷婷免费视频| 久久免费国产视频| 永久免费在线播放| 久操青青| 性瘾高h姚蕊全文免费阅读| 尤物黄色| 欧美视频xxxxx| 变态重口极致另类在线| 人人干人人爽| hdhdhd69日本xxx| 亚洲午夜久久久精品影院视色| 色www| 二级黄的全免费视频| 日日操日日爽| 中文字幕亚洲一区二区v@在线| 亚洲最大的成人网| 男人的天堂色偷偷之色偷偷| 2021国内精品久久久久影院| 精品乱码一区二区三区四区| 天天综合网网欲色| 色婷婷久|