68個可屏蔽中斷通道,包括EXTI,TIM,ADC,USART,SPI,I2C,RTC等多個外設(F1系列最多的數量,以型號為主);
使用NVIC統(tǒng)一管理中斷,每個中斷通道都擁有16個可編程優(yōu)先等級,可以對優(yōu)先級進行分組,進一步設置搶占優(yōu)先級和響應優(yōu)先級。
AFIO內部圖
EXTI內部圖
中斷和事件的區(qū)別
NVIC的中斷優(yōu)先級由優(yōu)先級寄存器的4位(0-15)決定,這四位可以進行切分,分為高N位的搶占優(yōu)先級,
和4-n位的響應優(yōu)先級;
搶占優(yōu)先級高的可以中斷嵌套,響應優(yōu)先級高的可以優(yōu)先排隊,搶占優(yōu)先級和響應優(yōu)先級均相同的話,
按照中斷號排隊。
操作的是NVIC->IPRx寄存器
中斷示例
main
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OUT1.H"
#include "Interrupt.h"
int main(void)
{
OUT1_Init();
Interrupt_Init();
OUT1_OFF();
while(1)
{
Delay_s(5);
OUT1_OFF();
}
}
interrupt.c
#include "stm32f10x.h" // Device header
#include "OUT1.h"
void Interrupt_Init (void)
{
//開啟GPIOC的時鐘控制
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//開啟AFIO的時鐘控制
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//EXTI的時鐘控制不需要開啟
//NVIC也不需要開啟,NVIC是屬于內核內的外設
/*配置GPIO */
GPIO_InitTypeDef GPIO_InitStructur;
GPIO_InitStructur.GPIO_Mode=GPIO_Mode_IPU; //設置成上拉輸入
GPIO_InitStructur.GPIO_Pin=GPIO_Pin_15; //選擇15號Pin腳
GPIO_InitStructur.GPIO_Speed=GPIO_Speed_50MHz; //不重要
GPIO_Init(GPIOC,&GPIO_InitStructur); //選擇C組的GPIO
/*配置AIFO */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource15); //設置PC15為外部中斷線
/*配置EXIT */
EXTI_InitTypeDef EXTI_Initstructure;
EXTI_Initstructure.EXTI_Line=EXTI_Line15; //配置中斷線
EXTI_Initstructure.EXTI_LineCmd=ENABLE; //是否開啟中斷
EXTI_Initstructure.EXTI_Mode=EXTI_Mode_Interrupt; //配置成中斷
EXTI_Initstructure.EXTI_Trigger=EXTI_Trigger_Rising; //配置成上升沿觸發(fā)
EXTI_Init(&EXTI_Initstructure);
/*配置NVIC 配置中斷分組 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置中斷搶占優(yōu)先級和響應優(yōu)先級分組
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1; //配置搶占優(yōu)先級
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1; //配置響應優(yōu)先級
NVIC_Init(&NVIC_InitStruct);
}
/*編寫中斷函數,中斷函數的名字都是固定的,中斷函數都是無參數無返回值的 */
/*編中斷函數的函數名可以在啟動文件startup_stm32f10x_md.s中可以找到 */
/*中斷函數的名字都是以_IRQHandler結尾 */
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line15)==SET)
{
/*編寫中斷程序 */
OUT1_ON();
EXTI_ClearITPendingBit(EXTI_Line15); //清除中斷標志位
}
}
interrupt.h
#ifndef __Interrupt_H
#define __Interrupt_H
void Interrupt_Init (void);
#endif
-
寄存器
+關注
關注
31文章
5317瀏覽量
120008 -
STM32
+關注
關注
2266文章
10871瀏覽量
354812 -
外部中斷
+關注
關注
1文章
131瀏覽量
15801 -
時鐘控制
+關注
關注
0文章
17瀏覽量
6812 -
AFIO
+關注
關注
0文章
6瀏覽量
2944
發(fā)布評論請先 登錄
相關推薦
評論