嵌入式STM32學習——外部中斷EXTI與NVIC的基礎練習?

按鍵控制LED燈

按鍵控制LED的開發流程:

第一步:使能功能復用時鐘

第二布,配置復用寄存器

第三步,配置中斷屏蔽寄存器

固件庫按鍵控制LED燈

外部中斷EXTI結構體:typedef struct{uint32_t EXTI_Line;              
EXTIMode_TypeDef EXTI_Mode;       
EXTITrigger_TypeDef EXTI_Trigger; 
FunctionalState EXTI_LineCmd;    
}EXTI_InitTypeDef;外部中斷EXTI相關庫函數:void EXTI_DeInit(void);void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);void EXTI_ClearFlag(uint32_t EXTI_Line);ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

軟件流程設計

  • 初始化系統

????????????????初始化GPIO、EXTI外設時鐘

????????????????初始化按鍵和LED引腳

????????????????初始化EXTI外部中斷條件

????????????????初始化NVIC嵌套中斷控制器及分組

  • 編寫外部中斷函數

????????????????判斷按鍵是否按下控制LED燈

weak:若弱定義;如果用戶沒有自己定義的中斷函數,則系統默認執行系統自定義的中斷函數,如果用戶有定義中斷函數則優先執行用戶的中斷函數。

實現代碼

LED

led.h
#ifndef LED_H_
#define LED_H_void LED_Init(void);#endif
led.c
#include "led.h"
#include "stm32f10x.h"//初始化LED燈的函數————函數的定義、聲明、調用(led.c    led.h  main.c)
void LED_Init(void)
{//1.初始化led引腳GPIOA1GPIO_InitTypeDef  led_initstruct;  //定義GPIO的結構體//2.3?ê??ˉê±?óRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//時鐘的初始化led_initstruct.GPIO_Pin = GPIO_Pin_1;led_initstruct.GPIO_Speed = GPIO_Speed_2MHz;led_initstruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&led_initstruct);  //初始化GPIO結構體}

按鍵

key.h
void Key_Init(void);
key.c
#include "key.h"
#include "stm32f10x.h"void Key_Init(void)
{GPIO_InitTypeDef Key_Initstruct;EXTI_InitTypeDef exti_key_initstruct;NVIC_InitTypeDef nvic_key_initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,  ENABLE);  //時鐘初始化//按鍵Key_Initstruct.GPIO_Pin=GPIO_Pin_0;Key_Initstruct.GPIO_Mode=GPIO_Mode_IPU;  GPIO_Init(GPIOA, &Key_Initstruct);    
//按鍵Key_Initstruct.GPIO_Pin =GPIO_Pin_13;Key_Initstruct.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOC, &Key_Initstruct);    GPIO_EXTILineConfig( GPIO_PortSourceGPIOA , GPIO_PinSource0);			//中斷線exti_key_initstruct.EXTI_Line = EXTI_Line0;							//中斷exti_key_initstruct.EXTI_Mode = EXTI_Mode_Interrupt;exti_key_initstruct.EXTI_Trigger = EXTI_Trigger_Falling;exti_key_initstruct.EXTI_LineCmd = ENABLE;EXTI_Init(&exti_key_initstruct);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                //NVIC分組nvic_key_initstruct.NVIC_IRQChannel = EXTI0_IRQn;                //NVIC初始化nvic_key_initstruct.NVIC_IRQChannelPreemptionPriority = 0;nvic_key_initstruct.NVIC_IRQChannelSubPriority = 0;nvic_key_initstruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&nvic_key_initstruct);
}

main.c

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "shake.h"
void delay(uint16_t time) 
{uint16_t i=0;while(time--){i =12000;while(i--);}}int  main()
{LED_Init();Key_Init();GPIO_SetBits( GPIOA, GPIO_Pin_1);while(1){delay(1000);GPIO_SetBits( GPIOA, GPIO_Pin_1);}		
}void EXTI0_IRQHandler()  //中斷函數
{if(EXTI_GetITStatus(EXTI_Line0) != RESET)//判斷是否滿足中斷條件{GPIO_ResetBits(GPIOA,GPIO_Pin_1);EXTI_ClearITPendingBit(EXTI_Line0);			//外部中斷標志位清除,為下一次中斷留出位置,一般與EXTI_GetITStatus一起使用}
}

?個人感悟:

難,要多練!!!

小練習:

外部中斷震動感應燈

嵌入式STM32學習——外部中斷震動感應燈-CSDN博客

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

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

相關文章

《Deepseek從入門到精通》清華大學中文pdf完整版

資源介紹: 《DeepSeek:從入門到精通》是由清華大學新聞與傳播學院新媒體研究中心元宇宙文化實驗室的精心撰寫的一份專業文檔。該文檔以通俗易懂的方 式,全面介紹了DeepSeek的使用方法,為用戶提供了極具價值的指導。 這份文檔內容豐…

Apache Pulsar 消息、流、存儲的融合

Apache Pulsar 消息、流、存儲的融合 消息隊列在大層面有兩種不同類型的應用,一種是在線系統的message queue,一種是流計算,data pipeline的streaming高throughout,一致性較低,延遲較差的過程。 存算分離 擴容和縮容快…

JavaScript vs Python 用于 Web Scraping(2025):終極對比指南

1. 引言 在不斷發展的 Web Scraping 領域,選擇合適的編程語言對于項目的成功至關重要。雖然 JavaScript 和 Python 在 2025 年仍然是 Web Scraping 領域的熱門選擇,但它們各自具備不同的優勢和挑戰。 本指南將深入分析 JavaScript 和 Python 的核心特性…

【RocketMQ Broker 相關源碼】- NettyRemotingClient 和 NettyRemotingServer

文章目錄 1. 前言2. BrokerOuterAPI2.1 NettyRemotingClient2.2 start 啟動2.2.1 NettyRemotingClient#start 3. NettyRemotingServer3.1 ClientHousekeepingService3.2 ProducerManager#doChannelCloseEvent3.3 ConsumerManager#doChannelCloseEvent3.3.1 DefaultConsumerIdsC…

C++性能測試工具——AMD CodeAnalyst及其新工具的使用

一、CodeAnalyst及其新的替代工具 與VTune相比,AMD也有自己的性能測試工具,也就是CodeAnalyst。不過目前看,其應該已經有些過時,目前AMD提供了更新的性能測試工具uProf或CodeXL,這些新工具的優點在于對新的硬件架構和…

ProfibusDP主站轉modbusTCP網關與ABB電機保護器數據交互

ProfibusDP主站轉modbusTCP網關與ABB電機保護器數據交互 在工業自動化領域,Profibus DP(Process Field Bus)和Modbus TCP是兩種常見的通訊協議,它們各自在不同的場合發揮著重要作用。然而,隨著技術的發展和應用需求的…

2025.05.17淘天機考筆試真題第三題

📌 點擊直達筆試專欄 👉《大廠筆試突圍》 💻 春秋招筆試突圍在線OJ 👉 筆試突圍OJ 03. 奇偶平衡樹分割問題 問題描述 K小姐是一位園林設計師,她設計了一個由多個花壇組成的樹形公園。每個花壇中種植了不同數量的花…

第三十五節:特征檢測與描述-ORB 特征

1. 引言:為什么需要ORB? 在計算機視覺領域,特征檢測與描述是許多任務(如圖像匹配、目標跟蹤、三維重建等)的核心基礎。傳統的算法如SIFT(尺度不變特征變換)和SURF(加速穩健特征)因其優異的性能被廣泛應用,但它們存在兩個顯著問題: 專利限制:SIFT和SURF受專利保護,…

深入解讀WPDRRC信息安全模型:構建中國特色的信息安全防護體系

目錄 前言1 WPDRRC模型概述2 模型結構詳解2.1 預警(Warning)2.2 保護(Protect)2.3 檢測(Detect)2.4 響應(React)2.5 恢復(Restore)2.6 反擊(Count…

《算法導論(第4版)》閱讀筆記:p82-p82

《算法導論(第4版)》學習第 17 天,p82-p82 總結,總計 1 頁。 一、技術總結 1. Matrix Matrices(矩陣) (1)教材 因為第 4 章涉及到矩陣,矩陣屬于線性代數(linear algebra)范疇,如果不熟悉,可以看一下作者推薦的兩本…

基于Spring Boot和Vue的在線考試系統架構設計與實現(源碼+論文+部署講解等)

源碼項目獲取聯系 請文末卡片dd我獲取更詳細的演示視頻 系統介紹 基于Spring Boot和Vue的在線考試系統。為學生和教師/管理員提供一個高效、便捷的在線學習、考試及管理平臺。系統采用前后端分離的架構,后端基于成熟穩定的Spring Boot框架,負責數據處理…

Codeforces Round 1024 (Div.2)

比賽鏈接&#xff1a;CF1024 A. Dinner Time 只有當 n n n 是 p p p 的倍數而且 n ? q p ? m \frac{n \cdot q}{p} \not m pn?q?m 時輸出 NO&#xff0c;其余情況均滿足條件。 時間復雜度&#xff1a; O ( 1 ) O(1) O(1)。 #include <bits/stdc.h> using na…

【LeetCode 熱題 100】二叉樹的最大深度 / 翻轉二叉樹 / 二叉樹的直徑 / 驗證二叉搜索樹

??個人主頁&#xff1a;小羊 ??所屬專欄&#xff1a;LeetCode 熱題 100 很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~ 目錄 二叉樹的中序遍歷二叉樹的最大深度翻轉二叉樹對稱二叉樹二叉樹的直徑二叉樹的層序遍歷將有序數組轉換為二叉搜索樹驗…

Tomcat發布websocket

一、tomcal的lib放入文件 tomcat-websocket.jar websocket-api.jar 二、代碼示例 package com.test.ws;import com.test.core.json.Jmode;import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.util.concurrent.CopyOnWriteArraySet; imp…

LLM筆記(二)LLM數據基礎-分詞算法(2)

文章目錄 1. 分詞算法概述1.1 基于詞典的&#xff08;或基于規則的&#xff09;分詞算法1.2 基于統計的&#xff08;或基于機器學習的&#xff09;分詞算法1.3 基于深度學習的分詞算法1.4 子詞&#xff08;Subword&#xff09;分詞算法1.5 混合分詞算法1.6 針對不同語言的特點 …

Uniapp開發鴻蒙應用時如何運行和調試項目

經過前幾天的分享&#xff0c;大家應該應該對uniapp開發鴻蒙應用的開發語法有了一定的了解&#xff0c;可以進行一些簡單的應用開發&#xff0c;今天分享一下在使用uniapp開發鴻蒙應用時怎么運行到鴻蒙設備&#xff0c;并且在開發中怎么調試程序。 運行 Uniapp項目支持運行到…

數據湖與數據倉庫融合:Hudi、Iceberg、Delta Lake 實踐對比

在實時與離線一體化的今天,數據湖與數據倉庫邊界不斷融合,越來越多企業選用如 Hudi、Iceberg、Delta Lake 等開源方案實現統一的數據存儲、計算、分析平臺。本篇將圍繞以下關鍵點,展開實戰對比與解決方案分享: ? 實時寫入能力 ? ACID 保證 ? 增量數據處理能力 ? 流批一…

Python爬蟲(29)Python爬蟲高階:動態頁面處理與云原生部署全鏈路實踐(Selenium、Scrapy、K8s)

目錄 引言&#xff1a;動態爬蟲的技術挑戰與云原生機遇一、動態頁面處理&#xff1a;Selenium與Scrapy的協同作戰1.1 Selenium的核心價值與局限1.2 Scrapy-Selenium中間件開發1.3 動態分頁處理實戰&#xff1a;京東商品爬蟲 二、云原生部署&#xff1a;Kubernetes架構設計與優化…

數據結構(十)——排序

一、選擇排序 1.簡單選擇排序 基本思想&#xff1a;假設排序表為[1,…,n]&#xff0c;第i趟排序即從[i,…,n]中選擇關鍵字最小的元素與L[i]交換 eg&#xff1a;給定關鍵字序列{87&#xff0c;45&#xff0c;78&#xff0c;32&#xff0c;17&#xff0c;65&#xff0c;53&…

小結:jvm 類加載過程

類加載過程 是Java虛擬機&#xff08;JVM&#xff09;將字節碼文件&#xff08;.class文件&#xff09;加載到內存中&#xff0c;并轉換為運行時數據結構的過程。這個過程可以分為多個步驟&#xff0c;每個步驟都有其特定的任務和目的。根據你提供的信息&#xff0c;以下是類加…