STM32之中斷

一、提高程序實時性的架構方案

  1. 輪詢式

指的是在程序運行時,首先對所有的硬件進行初始化,然后在主程序中寫一個死循環,需要運行的功能按照順序進行執行,輪詢系統是一種簡單可靠的方式,一般適用于在只需要按照順序執行的并且沒有外部事件的影響的情況下。

    //自定義延時函數    
void Delay();    
int main()   {    
//1.硬件初始化    
LED_Init();    
BEEP_Init();    
KEY_Init();    
//2.進入死循環   for(;;)    
{    
//判斷按鍵狀態,導致程序的實時性較差    
if(KEY0 == 0 )  {
//控制BEEP發聲   GPIO_SetBits();    
Delay(50);   //50ms    
//控制LED點亮GPIO_ResetBits();    
Delay(100);  //100ms   
}     }    }
  1. 前后臺

相比于輪詢系統,前后臺系統增加中斷的概念,如果外部事件發生,則在中斷中進行處理,主程序在輪詢系統中運行,中斷被稱為前臺,主程序中的while(1)就稱為后臺。中斷會終止后臺程序的運行,然后跳轉到對應的中斷服務函數中去處理,處理完成后,在繼續執行后臺的程序。使用前后臺系統可以極大程度的提高程序的實時響應能力,避免造成外部事件的缺失。

//定義信號的回調函數,該函數不需要調用 
void signal_handler(int signum) 
{ 
//定義狀態機 
switch(signum){ 
case SIGUSR1: xxxx;break;case SIGUSR2: xxxx; 
break; ..... 
} } 
int main(){ 
//1.硬件初始化 
LED_Init(); 
BEEP_Init(); 
KEY_Init(); 
//2.注冊信號,進程收到該信號,會觸發信號的回調函數,此時會中斷當前程序 
signal(SIGUSR1, signal_handler); 
//3.進入死循環 
for(;;) 
{ 
//控制BEEP發聲GPIO_SetBits(); 
Delay(50); //50ms 
//控制LED點亮 
GPIO_ResetBits(); 
Delay(100); //100ms } }
  1. 多任務

相比于前后臺系統,多任務系統的外部事件也是在中斷中進行響應,但是外部事件的處理是任務中進行處理。任務具有優先級,優先級高的任務先處理,所以程序就會被分割為一個個的任務,任務是一個獨立的死循環,并且不能返回,可以由操作系統進行任務的調度,程序段的實時響應能力又得到提升。

//定義信號的回調函數,該函數不需要調用 
void signal_handler(int signum) 
{ 
//定義狀態機 
switch(signum) 
{case SIGUSR1: xxxx;break; 
case SIGUSR2: xxxx; 
break; ..... 
} } 
//線程的任務 
void thread_task(void * arg) 
{ 
for(;;){//控制LED點亮 
GPIO_ResetBits();Delay(100); //100ms 
} } 
int main(){ 
//1.硬件初始化LED_Init(); 
BEEP_Init(); 
KEY_Init(); 
//2.注冊信號,進程收到該信號,會觸發信號的回調函數,此時會中斷當前程序 
signal(SIGUSR1, signal_handler); 
//4.創建子線程 
pthread_create(&id,NULL,thread_task,NULL);//3.進入死循環 
for(;;) 
{ 
//控制BEEP發聲 
GPIO_SetBits(); 
Delay(50); //50ms } }

二、MCU中斷的原理與應用

  • 中斷的概念

中斷指的是CPU來處理和響應外部發生的異常,中斷也就意味著打斷,比如打斷正在做的事,然后去處理一個緊急的事,處理完成后在繼續做剛才沒做完的事。

  • 中斷源分析

中斷源指的是異常發生的源頭,中斷源在內核中已經定義好了,中斷源表也稱為中斷向量表,向量表在STM32F4中文參考手冊參考。

上圖中的表格就是STM32F4系列的異常向量表,對于STM32F407xx有82個可屏蔽異常!!!!

  • 中斷的管理

NVIC指的是嵌套向量中斷控制器,屬于內核中的外設,作用是管理所有的中斷,比如中斷的使能或失能、中斷的優先級.....。

不管是Cortex A系列還是Cortex M系列的內核內部均有NVIC,通過NVIC管理內核異常和外部異常。

NVIC管理中斷通道的打開與關閉,可以把NVIC理解為負責管理所有中斷的開關,想要使用中斷發送中斷請求,就必須提前打開中斷的通道。關于NVIC的使用都存儲在一個結構體中,這個結構體和NVIC的函數接口都定義在misc.c和misc.h中。

  • 中斷的順序

NVIC利用4bit的優先級來管理所有的中斷通道,STM32中斷的優先級分為兩種:搶占式優先級(主優先級) + 響應式優先級(子優先級),有16個優先級(0~15),數字越小,優先級越高。

意義:如果同時發生多個中斷請求,但是又不能同時處理,就根據中斷請求的優先級來處理和響應中斷。

搶占優先級(主優先級):搶占優先級高的中斷可以打斷正在執行的搶占優先級低的中斷!!!

響應優先級(子優先級):在同時發生多個中斷的情況下,響應優先級高的中斷可先執行!!!

  1. 搶占優先級高的中斷可以打斷正在執行的搶占優先級低的中斷
  2. 搶占優先級相同的中斷同時發生,響應優先級高的中斷先執行
  3. 搶占優先級相同的多個中斷發生,響應優先級高的中斷不能打算響應優先級低的中斷
  4. 搶占優先級和響應優先級相同的多個中斷同時發生,則按照向量表的中斷編號來執行

為了方便用戶管理和響應中斷,NVIC需要對中斷優先級進行分組,這樣用戶可以方便配置

注意:該函數必須在主程序的入口進行調用,并且整個項目應該只調用一次,因為設置好優先級分組之后就不應該隨意更改分組,否則中斷管理比較混亂,另外用戶在設置中斷優先級的時候應該遵守分組對應的優先級范圍。

三、EXTI外設的基本原理與應用

  • 基本概念

EXTI指的是外部中斷/事件控制器,一共有23個,每個都有一個內部的邊沿檢測器,可以檢測上升沿或者下降沿,每根線都可以產生事件或者中斷。

注意:每個GPIO引腳都可以配置為外部中斷,但是和GPIO相關的外部中斷線一共有16根,分別為EXTI0~EXTI15。

  • 基本原理

思考:STM32F407系列有114個GPIO口,那如何和外部中斷線進行關聯?通過映射的方式

注意:STM32F407所有IO口都可以設置為外部中斷,但是必須把GPIO引腳配置為輸入模式。

  • 程序設計
  1. 把EXTI外設的源文件以及SYSCFG外設的源文件添加到項目工程中,具體操作如下所示:

  1. 參考ST公司提供的外設的源文件的開頭的注釋以及參數ST公司提供的關于外設的例程

  1. 打開GPIOA端口時鐘(因為KEY0按鍵對應的引腳PA0)以及SYSCFG外設時鐘(映射)!

  1. 配置GPIOA端口PA0引腳的模式為輸入模式,因為需要利用該引腳檢測外部事件,如下

  1. 利用SYSCFG外設的寄存器對GPIOA端口的引腳PA0以及EXTI0建立映射關系(自動建立)

  1. 定義EXTI外設的結構體變量,對結構體成員初始化(編號+模式+邊沿+狀態),如下圖

  1. 配置EXTI外設的中斷,需要使用NVIC外設管理中斷的通道以及中斷的優先級,如下圖

  1. 對EXTI中斷通道配置完成后,需要編寫對應的中斷服務函數,中斷服務函數的格式固定

注意:ISR中斷服務函數的名字是已經提前定義在啟動文件中向量表內,啟動文件是在程序運行之前先運行的一個匯編文件(xxx.s結尾的),用戶在選擇使用某個外設的中斷的時候,必須從啟動文件中復制中斷服務函數的名稱,比如EXTI0外部中斷線的中斷服務函數名字是EXTI0_IRQHandler

啟動文件的意思是在程序運行之后第一個被執行的文件,啟動文件是使用匯編語言實現的,啟動文件會對系統的堆棧空間進行初始化、以及會對系統的時鐘進行初始化、以及會設置向量表的ISR地址,最后會跳轉到標準C庫的main函數中。

啟動流程:堆棧空間初始化 ---> 設置中斷向量表 ---> 系統時鐘初始化 ---> 跳轉到主函數

  1. 堆棧空間的初始化

  1. 設置中斷向量表

中斷向量表其實是用于記錄異常的ISR中斷服務程序的地址,向量表的本質就是一個指針數組,數組中的每個成員都是一個地址(ISR的地址),但是數組中每個元素本身也有地址,不要把地址搞混。

STM32F4的中文參考手冊中記錄了向量表中每個元素的地址,然后每個元素的地址下都會存儲對應的異常的ISR的地址。

  1. 系統時鐘的初始化

復位也屬于異常,所以在MCU復位之后,CPU會自動跳轉到復位的ISR函數執行,復位異常的ISR函數已經定義在啟動文件中,ISR中會對系統的時鐘進行初始化,并且會跳轉到main函數。

提示:ISR中斷服務程序的結構是固定,是不允許有返回值,以及不允許有參數,結構如下:

void PPP_IRQHandler(void) {

}

注意:如果需要使用異常,就一定要在匯編文件外部定義異常的ISR程序,并且ISR函數名稱必須和啟動文件的向量表中的異常名稱一致,如果不一致,則會導致程序死循環!!!!!

注意:當異常發生后,CPU會跳轉到異常的ISR程序進行執行,ISR程序應該精簡,執行的越快越好。如果異常確實要使用較多代碼解除,則可以選擇回到后臺對異常進行解決,可以選擇采用狀態機思想實現。

//定義全局變量,作為中斷標志位 
int key_flag = 0; 
int main(void) 
{ 
//1.硬件初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //優先級分組 
BEEP_Init(); //蜂鳴器初始化KEY0_Init(); //機械按鍵初始化 
//屬于后臺 
while(1) 
{ 
//設計狀態機,在后臺對異常的動作進行執行 
if(key_flag == 1) 
{ 
//重置標志,防止多次觸發key_flag = 0; 
//執行動作 
} } } 
/** * @brief This function handles External line 0 interrupt request. * @param None * @retval None * 
@note ISR程序不應該手動調用,ISR程序要精簡 
*/void EXTI0_IRQHandler(void){ 
//判斷中斷是否觸發 
if(EXTI_GetITStatus(EXTI_Line0) != RESET) 
{ //中斷標志成立 
key_flag = 1; 
//清除中斷狀態 
EXTI_ClearITPendingBit(EXTI_Line0); } }

作業:利用中斷機制實現對開發板的4個按鍵的檢測,另外要求了解4*4矩陣鍵盤的原理,并提供狀態機方式實現16個按鍵的檢測。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906326.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LLM應用開發平臺資料

課程和代碼資料 放下面了,自取: https://pan.quark.cn/s/57a9d22d61e9

硬盤健康檢測與性能測試的實踐指南

在日常使用 Windows 系統的過程中,我們常常需要借助各種工具來優化性能、排查問題或管理文件。針對windows工具箱進行實測解析,發現它整合了多種實用功能,能夠幫助用戶更高效地管理計算機。 以下為測試發現的功能特性: 硬件信息查…

正則表達式進階(三):遞歸模式與條件匹配的藝術

在正則表達式的高級應用中,遞歸模式和條件匹配是處理復雜嵌套結構和動態模式的利器。它們突破了傳統正則表達式的線性匹配局限,能夠應對嵌套括號、HTML標簽、上下文依賴等復雜場景。本文將詳細介紹遞歸模式((?>...)、 (?R) 等&#xff0…

從零開始創建React項目及制作頁面

一、React 介紹 React 是一個由 Meta(原Facebook) 開發和維護的 開源JavaScript庫,主要用于構建用戶界面(User Interface, UI)。它是前端開發中最流行的工具之一,廣泛應用于單頁應用程序(SPA&a…

【前端部署】通過 Nginx 讓局域網用戶訪問你的純前端應用

在日常前端開發中,我們常常需要快速將本地的應用展示給局域網內的同事或測試人員,而傳統的共享方式往往效率不高。本文將指導你輕松地將你的純前端應用(無論是 Vue, React, Angular 或原生項目)部署到本地,并配置局域網…

【Python裝飾器深潛】從語法糖到元編程的藝術

目錄 ?? 前言??? 技術背景與價值?? 當前技術痛點??? 解決方案概述?? 目標讀者說明?? 一、技術原理剖析?? 核心概念圖解?? 核心作用講解?? 關鍵技術模塊說明?? 技術選型對比??? 二、實戰演示?? 環境配置要求?? 核心代碼實現案例1:基礎計時裝飾器案…

mbed驅動st7789屏幕-硬件選擇及連接(1)

目錄 1.整體介紹 2. 硬件選擇 2.1 mbed L432KC 2.2 ST7789 240*240 1.3寸 3. mbed與st7789的硬件連接 4. 總結 1.整體介紹 我們在使用單片機做一些項目的時候,交互性是最重要的因素。那么對于使用者而言,交互最直接的體現無非就是視覺感知,那么我們希望將項目通過視覺…

SpringBoot集成Jasypt對數據庫連接密碼進行加密、解密

引入依賴 <!--配置密碼加密--><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version></dependency><plugin><groupId>c…

分類器引導的條件生成模型

分類器引導的條件生成模型 分類器引導的條件生成模型1. **基本概念**2. **核心思想**3. **實現步驟&#xff08;以擴散模型為例&#xff09;**4. **優點**5. **挑戰與注意事項**6. **應用場景**7. **數學推導**總結 分類器引導的條件生成模型 分類器引導的條件生成模型是一種通…

WPF中的ObjectDataProvider:用于數據綁定的數據源之一

ObjectDataProvider是WPF(Windows Presentation Foundation)中一種強大而靈活的數據綁定源&#xff0c;它允許我們將對象實例、方法結果甚至是構造函數的返回值用作數據源。通過本文&#xff0c;我將深入探討ObjectDataProvider的工作原理、使用場景以及如何在實際應用中發揮其…

lasticsearch 報錯 Document contains at least one immense term 的解決方案

一、問題背景 在使用 Elasticsearch 存儲較大字段數據時&#xff0c;出現如下異常&#xff1a; ElasticsearchStatusException: Elasticsearch exception [typeillegal_argument_exception, reasonDocument contains at least one immense term in field"fieldZgbpka"…

[目標檢測] YOLO系列算法講解

前言 目標檢測就是做到給模型輸入一張圖片或者視頻&#xff0c;模型可以迅速判斷出視頻和圖片里面感興趣的目標所有的位置和它 的類別&#xff0c;而當前最熱門的目標檢測的模型也就是YOLO系列了。 YOLO系列的模型的提出&#xff0c;是為了解決當時目標檢測的模型幀率太低而提…

服務器操作系統時間同步失敗的原因及修復

服務器操作系統時間同步失敗可能導致日志記錄不準確、安全證書失效等問題。以下是常見原因及對應的修復方法&#xff1a; ### 一、時間同步失敗的常見原因 1. **網絡連接問題** - NTP服務器無法訪問&#xff08;防火墻阻止、網絡中斷&#xff09; - DNS解析失敗或網…

Cribl 中function 使用過濾的特殊case:Parser + rename

Cribl 利用function 對parser 進行特殊過濾處理: Parser Function – Fields Filter Expression? When you use the Stream Parser Functions Reserialize option, there is a special option that becomes available, called the Fields Filter Expression. This is basica…

inverse-design-of-grating-coupler-3d

一、設計和優化3D光柵耦合器 1.1 代碼講解 通過預定義的環形間距參數(distances數組),在FDTD中生成橢圓光柵結構,并通過用戶交互確認幾何正確性后,可進一步執行參數掃描優化。 # os:用于操作系統相關功能(如文件路徑操作) import os import sys# lumapi:Lumerical 的…

TuyaOpen橫空出世!涂鴉智能如何用開源框架重構AIoT開發范式?

??「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 一、引子:AIoT開發的“不可能三角”被打破 當AI與物理世界深度融合的浪潮席卷全球,開發者們卻始終面臨一個“不可能三角”——開發效率、技術深度與商業化落地難以兼得。 …

智慧賦能光伏運維——無人機巡檢+地面監控雙鏈路覆蓋,打造光伏電站管理新標桿

一、引言&#xff1a;光伏電站運維的挑戰與機遇 在全球能源轉型浪潮下&#xff0c;光伏電站作為清潔能源的重要載體&#xff0c;其高效運維管理成為行業核心命題。然而&#xff0c;傳統光伏電站運維存在覆蓋范圍廣、設備分散、人工巡檢效率低、故障響應慢等痛點。為破解這一難…

前端無感登錄刷新

前端實現無感登錄 在現代的前端開發中&#xff0c;用戶體驗是非常重要的一環。無感登錄&#xff08;也叫自動登錄&#xff09;就是其中一個提升用戶體驗的關鍵功能。它的目標是讓用戶在登錄后&#xff0c;即使關閉瀏覽器或長時間不操作&#xff0c;也能在下次訪問時自動登錄&a…

JAVASE查漏補缺

這段時間學習了很多知識&#xff0c;好多還有疑問不清楚的地方。今天有空總結一下。 javame,javase,javaee 一、Java ME&#xff08;Micro Edition&#xff0c;微型版&#xff09; Java ME是一種適用于移動設備和嵌入式系統的小型Java平臺&#xff0c;具有高度可移植性和跨平…

【設計模式】基于 Java 語言實現工廠模式

目錄 一、簡單工廠模式 1.1 簡單工廠模式的介紹 二、工廠方法模式 2.1 工廠方法模式的介紹 2.2 工廠方法模式的基本實現 2.3 工廠方法模式的應用場景 三、抽象工廠 3.1 抽象工廠的概念 3.2 抽象工廠的基本結構 3.3 抽象工廠的基本實現 3.4 抽象工廠的應用場景 四、…