国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32標準庫——(5)EXTI外部中斷

這篇具有很好參考價值的文章主要介紹了STM32標準庫——(5)EXTI外部中斷。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.中斷系統(tǒng)

中斷:在主程序運行過程中,出現(xiàn)了特定的中斷觸發(fā)條件(中斷源),使得CPU暫停當前正在運行的程序,轉而去處理中斷程序,處理完成后又返回原來被暫停的位置繼續(xù)運行

中斷優(yōu)先級:當有多個中斷源同時申請中斷時,CPU會根據(jù)中斷源的輕重緩急進行裁決,優(yōu)先響應更加緊急的中斷源

中斷嵌套:當一個中斷程序正在運行時,又有新的更高優(yōu)先級的中斷源申請中斷,CPU再次暫停當前中斷程序,轉而去處理新的中斷程序,處理完成后依次進行返回

2.中斷執(zhí)行流程

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機

3.STM32中斷

  • 68個可屏蔽中斷通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多個外設
  • 使用NVIC統(tǒng)一管理中斷,每個中斷通道都擁有16個可編程的優(yōu)先等級,可對優(yōu)先級進行分組,進一步設置搶占優(yōu)先級和響應優(yōu)先級

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機

  1. WWDG:窗口看門狗 用來監(jiān)測程序運行狀態(tài)的中斷 比如程序卡死了 沒有及時喂狗 窗口看門狗就會申請中斷 讓程序調(diào)到窗口看門狗的中斷程序里 此時可以在中斷程序里進行一些錯誤檢查 看看出現(xiàn)什么問題
  2. PVD電源電壓檢測:如果供電電壓不足 PVD電路就會申請中斷 在中斷里可知供電不足 此時便需要保存重要數(shù)據(jù)
  3. 地址:程序中的中斷函數(shù)其地址是由編譯器來分配的 是不固定的 但中斷跳轉由于硬件的限制 只能跳到固定的地址執(zhí)行程序 所以為了能讓硬件跳轉到一個不固定的中斷函數(shù)里 這里就需要在內(nèi)存中定義一個地址的列表 這個列表地址是固定的 中斷發(fā)生后 就跳到這個固定位置 在這個固定位置上 由編譯器 再加上一條跳轉到中斷函數(shù)的代碼 此時中斷跳轉就可以跳轉到任意位置了 這個中斷地址的列表 就是中斷向量表 相當于中斷跳轉的一個跳板 但我們是用C語言編程的 不需要去管這個中斷向量表

4.NVIC基本結構(嵌套中斷向量控制器)

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機

5.NVIC優(yōu)先級分組

  • NVIC的中斷優(yōu)先級由優(yōu)先級寄存器的4位(0~15)決定,這4位可以進行切分,分為高n位的搶占優(yōu)先級和低4-n位的響應優(yōu)先級

  • 搶占優(yōu)先級高的可以中斷嵌套,響應優(yōu)先級高的可以優(yōu)先排隊,搶占優(yōu)先級和響應優(yōu)先級均相同的按中斷號排隊

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機

6.EXIT簡介

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機

  1. 相同的Pin不能同時觸發(fā)中斷:比如PA0和PB0不能同時使用
  2. 通道數(shù):加起來總共有20個中斷線路 16個GPIO_Pin是外部中斷的主要功能 后面四個主要是來外部中斷”蹭網(wǎng)“的 外部中斷有個功能 就是從低功耗模式的停止模式下喚醒STM32 對于PVD電源電壓監(jiān)測 當電源從電壓過低恢復時 就需要PVD借助一下外部中斷退出停止模式 對于RTC鬧鐘來說 有時候為了省電 RTC定了個鬧鐘后 STM32會進入停止模式 等到鬧鐘響的時候再喚醒 這也需要借助外部中斷 USB喚醒、以太網(wǎng)喚醒也都是類似作用
  3. 中斷響應:申請中斷 讓CPU執(zhí)行中斷函數(shù)
  4. 事件響應:是STM32對外部中斷增加的一種額外的功能 當外部中斷檢測到引腳電平變化時 正常的流程是選擇觸發(fā)中斷 但在STM32中 也可以選擇觸發(fā)一個事件 如果選擇觸發(fā)事件 那外部中斷的信號就不會通向CPU 而是通向其他外設 用來觸發(fā)其他外設的操作 比如觸發(fā)ADC轉換、觸發(fā)DMA等
  5. 3、4對比總結:中斷響應是正常流程 引腳電平變化觸發(fā)中斷 事件響應不會觸發(fā)中斷 而是觸發(fā)別的外設操作 屬于外設之間的聯(lián)合工作

7.EXIT基本結構

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機

  1. AFIO:數(shù)據(jù)選擇器 可以在前面3個GPIO外設的16個引腳里選擇其中一個連接到后面的EXIT的通道里
  2. 輸入信號經(jīng)過EXIT電路后分為了兩種輸出 上面的接到了NVIC 是用來觸發(fā)中斷的 本來20路輸入 應該有20路中斷的輸出 可能開發(fā)板公司覺得20輸出太多 比較占用NVIC的通道資源 所以把其中外部中斷的9~5、15~10分到一個通道里 意思是外部中斷的9~5會觸發(fā)同一個中斷函數(shù) 15~10也會觸發(fā)同一個中斷函數(shù) 在編程時 在這兩個中斷函數(shù)里 ?需要再根據(jù)標志位來區(qū)別到底是哪個中斷進來的 下面有20條輸出線路到了其他外設 這就是用來觸發(fā)其他外設操作的 也就是我們上面說的事件響應

8.AFIO復用IO口

  • AFIO主要用于引腳復用功能的選擇和重定義

  • 在STM32中,AFIO主要完成兩個任務:復用功能引腳重映射、中斷引腳選擇

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機

9.EXIT框圖

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機

  • 觸發(fā)信號通過或門之后 兵分兩路 上一路是觸發(fā)中斷的 下一路是觸發(fā)事件的 中斷輸出部分:觸發(fā)中斷首先會置一個掛起寄存器 相當于是一個中斷標志位 可以讀取這個寄存器判斷是哪個通道觸發(fā)的中斷 如果中斷掛起寄存器置1 繼續(xù)向左走中斷屏蔽寄存器共同進入一個與門 然后至NVIC中斷控制器 這個與門相當于一個開關 中斷屏蔽寄存器給1另一個就是直接輸出 也就是允許中斷 中斷屏蔽寄存器給0 另一個無論輸入什么 輸出都是0 相當于屏蔽了這個中斷 事件輸出部分:事件屏蔽寄存器進行開關控制 最后通過一個脈沖發(fā)生器到其他外設 這個脈沖發(fā)生器就是給一個電平脈沖 用來觸發(fā)其他外設的動作 ?

10.相關API

10.1?GPIO_AFIODeInit

void GPIO_AFIODeInit(void)(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
功能:
	用來復位AFIO外設 調(diào)用該函數(shù)后AFIO外設的配置就會全部清除
參數(shù):
    無    
返回值:
	無    

10.2?GPIO_PinLockConfig

void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:
	鎖定GPIO引腳配置寄存器
參數(shù):
    GPIOx:GPIOx:其中x可以為(A..G)選擇GPIO外設
    GPIO_Pin:要寫的端口位,該參數(shù)可以是GPIO_Pin_x的任意組合,其中x可以是(0..15)
返回值:
	無    

10.3?GPIO_PinRemapConfig

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
功能:
	更改指定引腳的映射
參數(shù):
    GPIO_Remap: 選擇要重新映射的引腳
    NewState:端口引腳重新映射的新狀態(tài),取值為:ENABLE或DISABLE 
返回值:
	無    

10.4?GPIO_EXTILineConfig

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
功能:
	選擇 GPIO 管腳用作外部中斷線路
參數(shù):
    GPIO_PortSource: 選擇用作外部中斷線源的 GPIO 端口,取值為GPIO_PortSourceGPIOx,其中x為(A..G)
    GPIO_PinSource:待設置的外部中斷線路,該參數(shù)可以是GPIO_PinSourcex,其中x可以是(0..15)  
返回值:
	無    

10.5?EXTI_Init

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
功能:
	根據(jù) EXTI_InitStruct 中指定的參數(shù)初始化外設 EXTI 寄存器
參數(shù):
    EXTI_InitStruct:指向結構 EXTI_InitTypeDef 的指針,包含了外設 EXTI 的配置信息 
返回值:
	無    

10.6?EXTI_GetITStatus

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)
功能:
	檢查指定的 EXTI 線路觸發(fā)請求發(fā)生與否
參數(shù):
    EXTI_Line:待檢查 EXTI 線路的掛起位 
返回值:
	EXTI_Line 的新狀態(tài)(SET 或者 RESET) 
        
    

10.7?EXTI_ClearITPendingBit

void EXTI_ClearITPendingBit(uint32_t EXTI_Line)
功能:
	清除 EXTI 線路掛起位
參數(shù):
    EXTI_Line:待清除 EXTI 線路的掛起位 
返回值:
	無 
        
       

10.8?NVIC_PriorityGroupConfig

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
功能:
	設置優(yōu)先級分組:先占優(yōu)先級和從優(yōu)先級(先占就是搶先優(yōu)先級,從站就是響應優(yōu)先級)
參數(shù):
    NVIC_PriorityGroup:優(yōu)先級分組位長度(本次代碼選擇的是2為搶占2位響應 比較平均)
返回值:
	無


PriorityGroup類型
/** @defgroup Preemption_Priority_Group 
  * @{
  */

#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                            4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                            3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                            2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                            1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                            0 bits for subpriority */


10.9?NVIC_Init

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
功能:
	根據(jù) NVIC_InitStruct 中指定的參數(shù)初始化外設 NVIC 寄存器
參數(shù):
    NVIC_InitStruct:指向結構 NVIC_InitTypeDef 的指針,包含了外設 GPIO 的配置信息     
返回值:
	無    

11.對射式紅外傳感器工程

11.1 對射式紅外傳感器模塊

11.1.1 簡介

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機

該產(chǎn)品采用FTR9606高靈敏度槽型光耦器件,槽寬5mm。它由一個紅外發(fā)光二極管和NPN光電三極管組成,M3固定安裝孔,有輸出狀態(tài)指示燈,輸出高電平燈滅,輸出低電平燈亮。有遮擋,輸出高電平。無遮擋,輸出低電平。使用3.3-5VDC 寬電壓LM393比較器輸出,信號干凈,波形好,驅動能力強,超過15mA。輸出形式:數(shù)字開關量輸出(0和1)。廣泛用于電機轉速檢測,脈沖計數(shù),位置限位等。

11.1.2 特點

1、使用進口ITR9606高靈敏度槽型光耦傳感器,槽寬度5mm。
2、有輸出狀態(tài)指示燈,輸出高電平燈滅,輸出低電平燈亮。
3、有遮擋,輸出高電平;無遮擋,輸出低電平。
4、比較器輸出,信號干凈,波形好,驅動能力強,超過15mA。
5、工作電壓3.3V-5V
6、輸出形式:數(shù)字開關量輸出(0和1)
7、設有M3固定螺栓孔,方便安裝
8、小板PCB尺寸:3.2cm x 1.4cm
9、使用寬電壓LM393比較器
10、廣泛用于電機轉速檢測,脈沖計數(shù),位置限位等。

11.1.3 引腳說明

1、VCC 接電源正極3.3-5V

2、GND 接電源負極

3、DO TTL開關信號輸出

4、AO 此模塊不起作用

11.1.4 操作說明

1、接好VCC和GND,模塊電源指示燈會亮
2、模塊槽中無遮擋時,接收管導通,模塊DO輸出低電平,開關指示燈亮;遮擋時,DO輸出高電平,開關指示燈滅。
3、模塊DO可與繼電器相連,組成限位開關等功能,也可以與有源蜂鳴器模塊相連,組成報警器。
4、DO輸出接口可以與單片機10口直接相連,一般接外部中斷,檢測傳感器是否有遮檔,如用電機碼盤則可檢測電機的轉速。

11.1.5 電路原理圖

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機

11.2 接線圖

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機

11.3 相關代碼

CountSensor.c
#include "stm32f10x.h"                  // Device header

uint16_t CountSensor_Count;				//全局變量,用于計數(shù)

/**
  * 函    數(shù):計數(shù)傳感器初始化
  * 參    數(shù):無
  * 返 回 值:無
  */
void CountSensor_Init(void)
{
	/*開啟時鐘*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//開啟GPIOB的時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);		//開啟AFIO的時鐘,外部中斷必須開啟AFIO的時鐘
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);						//將PB14引腳初始化為上拉輸入
	
	/*AFIO選擇中斷引腳*/
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//將外部中斷的14號線映射到GPIOB,即選擇PB14為外部中斷引腳
	
	/*EXTI初始化*/
	EXTI_InitTypeDef EXTI_InitStructure;						//定義結構體變量
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;					//選擇配置外部中斷的14號線
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//指定外部中斷線使能
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//指定外部中斷線為中斷模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;		//指定外部中斷線為下降沿觸發(fā)
	EXTI_Init(&EXTI_InitStructure);								//將結構體變量交給EXTI_Init,配置EXTI外設
	
	/*NVIC中斷分組*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC為分組2
																//即搶占優(yōu)先級范圍:0~3,響應優(yōu)先級范圍:0~3
																//此分組配置在整個工程中僅需調(diào)用一次
																//若有多個中斷,可以把此代碼放在main函數(shù)內(nèi),while循環(huán)之前
																//若調(diào)用多次配置分組的代碼,則后執(zhí)行的配置會覆蓋先執(zhí)行的配置
	
	/*NVIC配置*/
	NVIC_InitTypeDef NVIC_InitStructure;						//定義結構體變量
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;		//選擇配置NVIC的EXTI15_10線
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC線路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//指定NVIC線路的搶占優(yōu)先級為1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC線路的響應優(yōu)先級為1
	NVIC_Init(&NVIC_InitStructure);								//將結構體變量交給NVIC_Init,配置NVIC外設
}

/**
  * 函    數(shù):獲取計數(shù)傳感器的計數(shù)值
  * 參    數(shù):無
  * 返 回 值:計數(shù)值,范圍:0~65535
  */
uint16_t CountSensor_Get(void)
{
	return CountSensor_Count;
}

/**
  * 函    數(shù):EXTI15_10外部中斷函數(shù)
  * 參    數(shù):無
  * 返 回 值:無
  * 注意事項:此函數(shù)為中斷函數(shù),無需調(diào)用,中斷觸發(fā)后自動執(zhí)行
  *           函數(shù)名為預留的指定名稱,可以從啟動文件復制
  *           請確保函數(shù)名正確,不能有任何差異,否則中斷函數(shù)將不能進入
  */
void EXTI15_10_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line14) == SET)		//判斷是否是外部中斷14號線觸發(fā)的中斷
	{
		/*如果出現(xiàn)數(shù)據(jù)亂跳的現(xiàn)象,可再次判斷引腳電平,以避免抖動*/
		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)
		{
			CountSensor_Count ++;					//計數(shù)值自增一次
		}
		EXTI_ClearITPendingBit(EXTI_Line14);		//清除外部中斷14號線的中斷標志位
													//中斷標志位必須清除
													//否則中斷將連續(xù)不斷地觸發(fā),導致主程序卡死
	}
}
CountSensor.h
#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_H

void CountSensor_Init(void);
uint16_t CountSensor_Get(void);

#endif
main.c
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"

int main(void)
{
	/*模塊初始化*/
	OLED_Init();			//OLED初始化
	CountSensor_Init();		//計數(shù)傳感器初始化
	
	/*顯示靜態(tài)字符串*/
	OLED_ShowString(1, 1, "Count:");	//1行1列顯示字符串Count:
	
	while (1)
	{
		OLED_ShowNum(1, 7, CountSensor_Get(), 5);		//OLED不斷刷新顯示CountSensor_Get的返回值
	}
}

現(xiàn)象:這里給外部中斷配置的是下降沿 所以每次遮擋傳感器 在遮擋的那一瞬間計次加1 拿起的說話不變 再次遮擋計次再次加1

12.旋轉編碼器工程

12.1 旋轉編碼器模塊

12.1.1 簡介
  • 旋轉編碼器:用來測量位置、速度或旋轉方向的裝置,當其旋轉軸旋轉時,其輸出端可以輸出與旋轉速度和方向對應的方波信號,讀取方波信號的頻率和相位信息即可得知旋轉軸的速度和方向

  • 類型:機械觸點式/霍爾傳感器式/光柵式

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機

12.2 硬件電路

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機

  1. 左邊接了一個10的上拉電阻 默認沒旋轉的情況下 這個點被上拉為高電平 通過R3輸出到A端口就是高電平 當旋轉時 內(nèi)部觸電導通 這個點直接被拉低到GND 再通過R3輸出 A端口就是低電平?
  2. R3:輸出限流電阻 防止模塊引腳電流過大
  3. C1:輸出濾波電容 防止一些輸出信號抖動?

12.2 接線圖

STM32標準庫——(5)EXTI外部中斷,STM32,stm32,單片機文章來源地址http://www.zghlxwxcb.cn/news/detail-828818.html

12.3 相關代碼

Encoder.c
#include "stm32f10x.h"                  // Device header

int16_t Encoder_Count;					//全局變量,用于計數(shù)旋轉編碼器的增量值

/**
  * 函    數(shù):旋轉編碼器初始化
  * 參    數(shù):無
  * 返 回 值:無
  */
void Encoder_Init(void)
{
	/*開啟時鐘*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//開啟GPIOB的時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);		//開啟AFIO的時鐘,外部中斷必須開啟AFIO的時鐘
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);						//將PB0和PB1引腳初始化為上拉輸入
	
	/*AFIO選擇中斷引腳*/
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);//將外部中斷的0號線映射到GPIOB,即選擇PB0為外部中斷引腳
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);//將外部中斷的1號線映射到GPIOB,即選擇PB1為外部中斷引腳
	
	/*EXTI初始化*/
	EXTI_InitTypeDef EXTI_InitStructure;						//定義結構體變量
	EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;		//選擇配置外部中斷的0號線和1號線
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//指定外部中斷線使能
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//指定外部中斷線為中斷模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;		//指定外部中斷線為下降沿觸發(fā)
	EXTI_Init(&EXTI_InitStructure);								//將結構體變量交給EXTI_Init,配置EXTI外設
	
	/*NVIC中斷分組*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC為分組2
																//即搶占優(yōu)先級范圍:0~3,響應優(yōu)先級范圍:0~3
																//此分組配置在整個工程中僅需調(diào)用一次
																//若有多個中斷,可以把此代碼放在main函數(shù)內(nèi),while循環(huán)之前
																//若調(diào)用多次配置分組的代碼,則后執(zhí)行的配置會覆蓋先執(zhí)行的配置
	
	/*NVIC配置*/
	NVIC_InitTypeDef NVIC_InitStructure;						//定義結構體變量
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;			//選擇配置NVIC的EXTI0線
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC線路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//指定NVIC線路的搶占優(yōu)先級為1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC線路的響應優(yōu)先級為1
	NVIC_Init(&NVIC_InitStructure);								//將結構體變量交給NVIC_Init,配置NVIC外設

	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;			//選擇配置NVIC的EXTI1線
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC線路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//指定NVIC線路的搶占優(yōu)先級為1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;			//指定NVIC線路的響應優(yōu)先級為2
	NVIC_Init(&NVIC_InitStructure);								//將結構體變量交給NVIC_Init,配置NVIC外設
}

/**
  * 函    數(shù):旋轉編碼器獲取增量值
  * 參    數(shù):無
  * 返 回 值:自上此調(diào)用此函數(shù)后,旋轉編碼器的增量值
  */
int16_t Encoder_Get(void)
{
	/*使用Temp變量作為中繼,目的是返回Encoder_Count后將其清零*/
	/*在這里,也可以直接返回Encoder_Count
	  但這樣就不是獲取增量值的操作方法了
	  也可以實現(xiàn)功能,只是思路不一樣*/
	int16_t Temp;
	Temp = Encoder_Count;
	Encoder_Count = 0;
	return Temp;
}

/**
  * 函    數(shù):EXTI0外部中斷函數(shù)
  * 參    數(shù):無
  * 返 回 值:無
  * 注意事項:此函數(shù)為中斷函數(shù),無需調(diào)用,中斷觸發(fā)后自動執(zhí)行
  *           函數(shù)名為預留的指定名稱,可以從啟動文件復制
  *           請確保函數(shù)名正確,不能有任何差異,否則中斷函數(shù)將不能進入
  */
void EXTI0_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line0) == SET)		//判斷是否是外部中斷0號線觸發(fā)的中斷
	{
		/*如果出現(xiàn)數(shù)據(jù)亂跳的現(xiàn)象,可再次判斷引腳電平,以避免抖動*/
		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)
		{
			if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)		//PB0的下降沿觸發(fā)中斷,此時檢測另一相PB1的電平,目的是判斷旋轉方向
			{
				Encoder_Count --;					//此方向定義為反轉,計數(shù)變量自減
			}
		}
		EXTI_ClearITPendingBit(EXTI_Line0);			//清除外部中斷0號線的中斷標志位
													//中斷標志位必須清除
													//否則中斷將連續(xù)不斷地觸發(fā),導致主程序卡死
	}
}

/**
  * 函    數(shù):EXTI1外部中斷函數(shù)
  * 參    數(shù):無
  * 返 回 值:無
  * 注意事項:此函數(shù)為中斷函數(shù),無需調(diào)用,中斷觸發(fā)后自動執(zhí)行
  *           函數(shù)名為預留的指定名稱,可以從啟動文件復制
  *           請確保函數(shù)名正確,不能有任何差異,否則中斷函數(shù)將不能進入
  */
void EXTI1_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line1) == SET)		//判斷是否是外部中斷1號線觸發(fā)的中斷
	{
		/*如果出現(xiàn)數(shù)據(jù)亂跳的現(xiàn)象,可再次判斷引腳電平,以避免抖動*/
		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
		{
			if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)		//PB1的下降沿觸發(fā)中斷,此時檢測另一相PB0的電平,目的是判斷旋轉方向
			{
				Encoder_Count ++;					//此方向定義為正轉,計數(shù)變量自增
			}
		}
		EXTI_ClearITPendingBit(EXTI_Line1);			//清除外部中斷1號線的中斷標志位
													//中斷標志位必須清除
													//否則中斷將連續(xù)不斷地觸發(fā),導致主程序卡死
	}
}
Encoder.h
#ifndef __ENCODER_H
#define __ENCODER_H

void Encoder_Init(void);
int16_t Encoder_Get(void);

#endif
main.c
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"

int16_t Num;			//定義待被旋轉編碼器調(diào)節(jié)的變量

int main(void)
{
	/*模塊初始化*/
	OLED_Init();		//OLED初始化
	Encoder_Init();		//旋轉編碼器初始化
	
	/*顯示靜態(tài)字符串*/
	OLED_ShowString(1, 1, "Num:");			//1行1列顯示字符串Num:
	
	while (1)
	{
		Num += Encoder_Get();				//獲取自上此調(diào)用此函數(shù)后,旋轉編碼器的增量值,并將增量值加到Num上
		OLED_ShowSignedNum(1, 5, Num, 5);	//顯示Num
	}
}

到了這里,關于STM32標準庫——(5)EXTI外部中斷的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • STM32單片機(六)TIM定時器 -> 第二節(jié):TIM定時中斷練習(定時器定時中斷和定時器外部時鐘)

    STM32單片機(六)TIM定時器 -> 第二節(jié):TIM定時中斷練習(定時器定時中斷和定時器外部時鐘)

    ?? 專欄簡介:本專欄記錄了從零學習單片機的過程,其中包括51單片機和STM32單片機兩部分;建議先學習51單片機,其是STM32等高級單片機的基礎;這樣再學習STM32時才能融會貫通。 ?? 專欄適用人群 :適用于想要從零基礎開始學習入門單片機,且有一定C語言基礎的的童鞋

    2024年02月09日
    瀏覽(31)
  • STM32--EXTI外部中斷

    STM32--EXTI外部中斷

    前文回顧---STM32--GPIO 相關回顧--有關中斷系統(tǒng)簡介 目錄 STM32中斷 NVIC ?EXTI外部中斷 AFIO EXTI框圖 旋轉編碼器簡介 對射式紅外傳感器工程 代碼: 旋轉編碼器工程 代碼: 先說一下 基本原理 : 1. 中斷請求發(fā)生 :外部事件(如按鍵觸發(fā),定時器溢出等)引起中斷請求信號; 2. 中

    2024年02月12日
    瀏覽(21)
  • 02:STM32--EXTI外部中斷

    02:STM32--EXTI外部中斷

    目錄 一:中斷 1:簡歷 2:AFIO ?3:EXTI ?編輯 ?4:NVIC基本結構 5:使用步驟 二:中斷的應用 A:對外式紅外傳感計數(shù)器 1:連接圖?編輯 ?2:函數(shù)介紹 3:硬件介紹 ?4:計數(shù)代碼 B;旋轉編碼計數(shù)器 1:連接圖 ?2:硬件介紹 3:旋轉編碼器代碼: ????? ???中斷 :在主程序運行過程中,出現(xiàn)了特定

    2024年02月13日
    瀏覽(16)
  • 【STM32】STM32學習筆記-EXTI外部中斷(11)

    【STM32】STM32學習筆記-EXTI外部中斷(11)

    中斷 :在主程序運行過程中,出現(xiàn)了特定的中斷觸發(fā)條件(中斷源),使得CPU暫停當前正在運行的程序,轉而去處理中斷程序,處理完成后又返回原來被暫停的位置繼續(xù)運行 中斷優(yōu)先級 :當有多個中斷源同時申請中斷時,CPU會根據(jù)中斷源的輕重緩急進行裁決,優(yōu)先響應更加

    2024年02月04日
    瀏覽(21)
  • 【STM32教程】第四章 STM32的外部中斷EXTI

    【STM32教程】第四章 STM32的外部中斷EXTI

    案例代碼及相關資料下載鏈接: 鏈接:https://pan.baidu.com/s/1hsIibEmsB91xFclJd-YTYA?pwd=jauj? 提取碼:jauj?? 中斷系統(tǒng)的定義:中斷是指在主程序運行過程中,出現(xiàn)了特定的中斷觸發(fā)條件(中斷源),使得CPU暫停當前正在運行的程序,轉而去處理中斷程序,處理完成后又返回原來被暫

    2024年02月09日
    瀏覽(28)
  • 嵌入式-stm32-江科大-EXTI外部中斷

    嵌入式-stm32-江科大-EXTI外部中斷

    1.1 STM32 中斷系統(tǒng) 中斷 是指在主程序運行過程中,出現(xiàn)了特定的中斷觸發(fā)條件(中斷源),使得CPU暫停當前的程序,轉而去處理中斷程序,處理完成后又返回原來被暫停的位置繼續(xù)執(zhí)行, 當中斷發(fā)生時是由硬件自動調(diào)用中斷函數(shù)執(zhí)行的,期間編譯器會保護現(xiàn)場最后還原現(xiàn)場

    2024年01月25日
    瀏覽(33)
  • STM32的HAL庫開發(fā)系列 - GPIO中斷/外部中斷EXTI

    STM32的HAL庫開發(fā)系列 - GPIO中斷/外部中斷EXTI 中斷它可以在GPIO口的電平發(fā)生變化時產(chǎn)生中斷,從而使得STM32微控制器能夠及時響應外部設備的變化。 STM32的GPIO中斷/外部中斷EXTI可以配置為上升沿中斷、下降沿中斷和雙邊沿中斷三種類型,分別在GPIO口電平從低電平變?yōu)楦唠娖?、?/p>

    2024年02月12日
    瀏覽(17)
  • 單片機第三季-第七課:STM32中斷體系

    單片機第三季-第七課:STM32中斷體系

    目錄 1,NVIC 2,中斷和事件的區(qū)別 3,優(yōu)先級的概念? 4,如何實際編程使用外部中斷 5,STM32開發(fā)板通過按鍵控制LED? 5.1,打開相應GPIO模塊時鐘 5.2,NVIC設置 5.3,外部中斷線和配套的GPIO進行連接映射 5.4,代碼文件? 6,F(xiàn)SMC NVIC: Nested Vector Interrupt Control,嵌套向量中斷控制器;

    2024年01月18日
    瀏覽(32)
  • 【單片機】STM32單片機頻率計程序,外部脈沖計數(shù)程序,基于脈沖計數(shù)的頻率計程序,STM32F103

    【單片機】STM32單片機頻率計程序,外部脈沖計數(shù)程序,基于脈沖計數(shù)的頻率計程序,STM32F103

    兩種方法用于在單片機中實現(xiàn)頻率計的功能。 第一種方法是通過定時器來衡量信號的周期,然后將周期轉換為頻率。在這種方法中,你可以使用單片機的定時器模塊來測量輸入信號的周期,定時器會產(chǎn)生一個計數(shù)值,你可以根據(jù)這個計數(shù)值來推算出輸入信號的周期,并通過簡

    2024年02月11日
    瀏覽(26)
  • 單片機外部晶振故障后自動切換內(nèi)部晶振——以STM32為例

    單片機外部晶振故障后自動切換內(nèi)部晶振——以STM32為例

    作者 日期 版本 說明 Dog Tao 2023.08.02 V1.0 1. 發(fā)布初始版本。 Dog Tao 2023.08.10 V1.1 1. 修改了STM32F103時鐘系統(tǒng)的配圖位置。 時鐘信號是單片機的心跳,對嵌入式系統(tǒng)的長期穩(wěn)定運行有著至關重要的作用。現(xiàn)代單片機的時鐘信號一般都支持外部時鐘、外部晶體振蕩器、內(nèi)部RC振蕩器等

    2024年02月13日
    瀏覽(45)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包