STM32學習歷程(day6)

EXTI外部中斷使用教程

首先先看下EXTI的框圖

看這個框圖就能知道要先初始化GPIO外設 那么和前面一樣

1、先RCC使能時鐘

2、配置GPIO 選擇端口為輸入模式,?

3、配置AFIO,選擇我們用的GPIO連接到后面的EXTI

4、配置EXTI,選擇邊沿觸發方式 eg:上升沿 下降沿 雙邊沿。選擇觸發事件或者中斷

5、配置NVIC,給中斷配置優先級

AFIO函數

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);

函數可以用來引腳重映射,參數1是要選擇的重映射的方式,參數2是新的狀態

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

這個函數可以配置AFIO的數據選擇器,來選擇我們想要的中斷引腳

EXTI配置

可以去exti的頭文件的最下面 查看有什么函數 我們這里只用到了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);

?配置示范

//配置EXTI 這里配置成上升沿觸發中斷,引腳為14EXTI_InitTypeDef EXTI_InitStruct;EXTI_InitStruct.EXTI_Line = EXTI_Line14;EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_Init(&EXTI_InitStruct);

NVIC配置?

nvic的函數定義在misc.h里面

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);

配置示范?

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStruct);

中斷函數

在Start\startup_stm32f10x_md.s里有匯編代碼 能查看到每個模式下的中斷函數?

 ; External InterruptsDCD     WWDG_IRQHandler            ; Window WatchdogDCD     PVD_IRQHandler             ; PVD through EXTI Line detectDCD     TAMPER_IRQHandler          ; TamperDCD     RTC_IRQHandler             ; RTCDCD     FLASH_IRQHandler           ; FlashDCD     RCC_IRQHandler             ; RCCDCD     EXTI0_IRQHandler           ; EXTI Line 0DCD     EXTI1_IRQHandler           ; EXTI Line 1DCD     EXTI2_IRQHandler           ; EXTI Line 2DCD     EXTI3_IRQHandler           ; EXTI Line 3DCD     EXTI4_IRQHandler           ; EXTI Line 4DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7DCD     ADC1_2_IRQHandler          ; ADC1_2DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TXDCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1DCD     CAN1_SCE_IRQHandler        ; CAN1 SCEDCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5DCD     TIM1_BRK_IRQHandler        ; TIM1 BreakDCD     TIM1_UP_IRQHandler         ; TIM1 UpdateDCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and CommutationDCD     TIM1_CC_IRQHandler         ; TIM1 Capture CompareDCD     TIM2_IRQHandler            ; TIM2DCD     TIM3_IRQHandler            ; TIM3DCD     TIM4_IRQHandler            ; TIM4DCD     I2C1_EV_IRQHandler         ; I2C1 EventDCD     I2C1_ER_IRQHandler         ; I2C1 ErrorDCD     I2C2_EV_IRQHandler         ; I2C2 EventDCD     I2C2_ER_IRQHandler         ; I2C2 ErrorDCD     SPI1_IRQHandler            ; SPI1DCD     SPI2_IRQHandler            ; SPI2DCD     USART1_IRQHandler          ; USART1DCD     USART2_IRQHandler          ; USART2DCD     USART3_IRQHandler          ; USART3DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10DCD     RTCAlarm_IRQHandler        ; RTC Alarm through EXTI LineDCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend

?這里我們用到的是14引腳 所以用這個中斷函數

void EXTI15_10_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line14) == SET){COUNTSENSOR_COUNT++;EXTI_ClearITPendingBit(EXTI_Line14);}}

下面是EXTI中斷示范代碼,頭文件需要自己添加,能夠實現計次加數

#include "stm32f10x.h"                  // Device headeruint16_t COUNTSENSOR_COUNT;
void CountSensor_Init(void)
{//使能GPIO和AFIO的時鐘//EXTI和NVIC的時鐘是一直打開的,所以不用使能,NVIC不歸RCC管RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);//配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//配置EXTI 這里配置成上升沿觸發中斷,引腳為14EXTI_InitTypeDef EXTI_InitStruct;EXTI_InitStruct.EXTI_Line = EXTI_Line14;EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_Init(&EXTI_InitStruct);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStruct);
}uint16_t CountSensor_Get(void)
{return COUNTSENSOR_COUNT;
}
void EXTI15_10_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line14) == SET){COUNTSENSOR_COUNT++;EXTI_ClearITPendingBit(EXTI_Line14);}}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"int main()
{OLED_Init();CountSensor_Init();OLED_ShowString(1, 1, "Count");while (1){OLED_ShowNum(1, 7, CountSensor_Get(), 5);}
}

總結

學好GPIO外設的使用方法 后面的這些外設使用起來都大差不差 而且ARM公司提供的庫函數的函數注釋也很詳細 感覺最主要的就是要學會看框圖 知道自己的工程需要哪些外設 然后他的電路圖如何走 跟著一步步初始化和使能就可以?

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

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

相關文章

LVS實驗

LVS實驗 nginx1 RS1 192.168.11.137 nginx2 RS2 192.168.11.138 test4 調度器 ens33 192.168.11.135 ens36 12.0.0.1 test2 客戶端 12.0.0.10 一、test4 配置兩張網卡地址信息 [roottest4 network-scripts]# cat ifcfg-ens33 TYPEEthernet BOOTPROTOstatic DEFROUTEyes DEVIC…

詳解平面DP(上)

前言 其實平面DP和正常的dp沒有什么本質上的區別,只不過是在二維的面上進行DP,而且,客觀的說,其實和遞推沒有什么區別,不要把他想的太難了 講解 本蒻雞思前想后,好像關于平面DP的理論知識好像沒有什么&a…

前后端分離系統

前后端分離是一種現代軟件架構模式,特別適用于Web應用開發,它強調將用戶界面(前端)與服務器端應用邏輯(后端)相分離。兩者通過API接口進行數據交互。這種架構模式的主要優勢在于提高開發效率、維護性和可擴…

Git命令常規操作

目錄 常用操作示意圖 文件的狀態變化周期 1. 創建文件 2. 修改原有文件 3. 刪除原有文件 沒有添加到暫存區的數據直接 rm 刪除即可: 對于添加到暫存區的數據 文件或目錄: 4. 重命名暫存區數據 5. 查看歷史記錄 6. 還原歷史數據 恢復過程的原…

最新深度技術Win7精簡版系統:免費下載!

在Win7電腦操作中,用戶想要給電腦安裝上深度技術Win7精簡版系統,但不知道去哪里才能找到該系統版本?接下來系統之家小編給大家帶來了深度技術Win7系統精簡版本的下載地址,方便大家點擊下載安裝。系統安裝步驟已簡化,新…

定位和分析解決std::thread創建失敗的問題和解決方法(mmap虛擬地址耗盡)

文章目錄 引言問題描述和分析監控shell腳本shell腳本解釋 問題根源追溯解決方案一:增大mmap區域解決方案二:優化線程棧空間解決方案三:引入線程池參考文章 引言 在高并發和長周期運行的環境中,頻繁創建std::thread線程可能導致mm…

設計模式8-橋模式

設計模式8-Bridge 橋模式 由來與目的模式定義結構代碼推導1. 類和接口的定義2. 平臺實現3. 業務抽象4. 使用示例總結1. 類數量過多,復雜度高2. 代碼重復3. 不符合單一職責原則4. 缺乏擴展性改進后的設計1. 抽象和實現分離(橋接模式)2. 抽象類…

學習XDMA—20240709

概覽: 在內部,子系統可以配置為實現多達8個獨立的物理DMA引擎(最多4個H2C和4個C2H)。這些DMA引擎可以映射到單獨的AXI4Stream接口,也可以將共享的AXI4內存映射(MM)接口映射到用戶應用程序。在axis4 MM接口上,PCI Express的DMA/橋接…

智能警衛:Conda包依賴的自動監控之道

智能警衛:Conda包依賴的自動監控之道 引言 在復雜的軟件開發項目中,依賴管理是確保項目健康運行的關鍵環節。Conda作為Python和其他科學計算語言的強大包管理器,提供了依賴監控功能,幫助用戶自動化和簡化依賴項的監控過程。本文…

軟考高級第四版備考--第15天(建設團隊)Develop Team

定義:提高工作能力,促進團隊成員互動,改善團隊整體氛圍以提高項目績效的過程 作用:改進團隊協作、增強人際關系技能、激勵員工、減少摩擦以提升整體項目績效 說明:高效團隊行為: 使用開放與有效的溝通&a…

簡述 JS 中對象的創建和拷貝

在 JavaScript 中,對象是一種非常重要且靈活的數據結構,用于存儲多個值(屬性)和方法(函數) 對象的創建和拷貝是日常開發中經常涉及的操作,對于業務邏輯的準確實現有著重要的作用 本文將簡要概…

linux查看目錄下的文件夾命令,find 查找某個目錄,但是不包括這個目錄本身?

linux查看目錄下的文件夾命令,find 查找某個目錄,但是不包括這個目錄本身? Linux中查看目錄下的文件夾的命令是使用ls命令。ls命令用于列出指定目錄中的文件和文件夾。通過不同的選項可以實現顯示詳細信息、按照不同的排序方式以及使用不同的…

Profibus轉ModbusTCP網關模塊實現Profibus_DP向ModbusTCP轉換

Profibus和ModbusTCP是工業控制自動化常用的二種通信協議。Profibus是一種串口通信協議,它提供了迅速靠譜的數據傳輸和各種拓撲結構,如總線和星型構造。Profibus可以和感應器、執行器、PLC等各類設備進行通信。 ModbusTCP是一種基于TCP/IP協議的通信協議…

一次零基礎 自“信息收集“到“權限維持“的滲透測試全程詳細記錄

一、滲透總流程 1.確定目標: 在本靶場中,確定目標就是使用各種掃描工具進行ip掃描,確定目標ip。 2.信息收集: 比如平常挖洞使用fofa,天眼查,ip域名等進行查,在我們這個靶場中比如使用Wappalyz…

基于網絡編碼的 tcp 變種-tcp/nc

tcp/nc 是指 “tcp with network coding”,是一種結合了網絡編碼技術的 tcp 變種,網上資源很少,我也不準備多介紹,只介紹它的核心。 傳統 tcp 在演進過程中一直搞不定效率問題,網絡帶寬在增長,cpu 卻沒有變…

C++類和對象(上篇)

文章目錄 前言一、面向過程和面向對象初步認識 二、類的引入 三、類的定義 六、類的實例化 七、類的對象大小的計算 八、類成員函數的this指針 總結 前言 類和對象是面向對象編程的兩個核心概念。 類是一種抽象的數據類型,是描述對象共同特征和行為的模板。一個類…

yolov5:Conv類參數量計算

Conv是yolov5自定義的類,里邊包含了卷積層、BN層和激活函數 class Conv(nn.Module):# Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)default_act nn.SiLU() # default activationdef __init__(self, c…

點云下采樣有損壓縮

轉自本人博客&#xff1a;點云下采樣有損壓縮 點云下采樣是通過一定規則對原點云數據進行再采樣&#xff0c;減少點云個數&#xff0c;降低點云稀疏程度&#xff0c;減小點云數據大小。 1. 體素下采樣&#xff08;Voxel Down Sample&#xff09; std::shared_ptr<PointClo…

華為機考真題 -- 信道分配

題目描述&#xff1a; 算法工程師小明面對著這樣一個問題&#xff0c;需要將通信用的信道分配給盡量多的用戶&#xff0c; 信道的條件及分配規則如下&#xff1a; 1) 所有信道都有屬性&#xff1a;”階”。階為 r 的信道容量為 2^r 比特&#xff1b; 2) 所有用戶需要傳輸的數…

區間貪心

目錄 1.貪心算法的思想 2.區間貪心算法常用的一些題目類型 1.選擇最多不相交區間問題 P2970 [USACO09DEC] Selfish Grazing S 1.思路分析 2.上代碼 2.區間選點問題 P1250 種樹 1.題目 2.方法一 1.代碼解釋 3.方法二 3.區間合并問題 P2434 [SDOI2005] 區間 1. 思路…