目录
一、综述
二、中断详解:
1NVIC:
1介绍
2中断优先级
2EXTI
1介绍
2原理分析
3中断处理函数
中断是什么,那么多中断由谁控制(NVIC),他是怎么被触发的(EXTI等)触发后发生什么。(中断处理函数)
中断:程序运行中,出现特定触发条件(中断源),CPU暂停当前程序,转而去处理中断程序,处理完又返回原来被暂停的位置继续进行。
向量中断控制器,控制着整个芯片中断相关功能。
事情有轻重缓急,中断也不能例外。面对多个中断同时发生的情况我们用优先级将他们划分成三六九等。于是高级有插队特权,低级只能默默等待。
中断优先级寄存器NVIC_IPRx,IPR宽度为8位,在F103中,只使用了高4位。用于表达优先级的这4位,又被分成抢占优先级和子优先级两组。如果有多个中断同时响应,抢占优先级高的就会先于抢占优先级低的,优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较它们的硬件中断编号,编号越小,优先级越高。
一个中断优先级的具体配置我们放在一个结构体中。
typedef struct
{
uint8_t NVIC_IRQChannel; //中断源
uint8_t NVIC_IRQChannelPreemptionPriority; //抢占优先级
uint8_t NVIC_IRQChannelSubPriority; //子优先级
FunctionalState NVIC_IRQChannelCmd; //中断使能
} NVIC_InitTypeDef;
分组:优先级的分组由内核外设SCB的应用程序中断及复位控制寄存器AIRCR的PRIGROUP [10:8]位决定,优先级分组可调用库函数NVIC_Priority Group Config()实现。
于是我们得到了一个配置NVIC的模板:
NVIC_PriorityGroupConfig();
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= ;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
外部中断/事件控制器,管理了控制器的20个中断/事件线。
框图
先看起点和终点:1和5,8。换而言之:事件触发后可能产生两种结果。
两种结果:5这一路代表产生了中断(与NVIC有关),8这一路表示产生了事件。
它们对应函数为:(我们把他们都放进同一个结构体。)
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = ;//信号源
EXTI_InitStructure.EXTI_Mode = ;//中断或软件
EXTI_InitStructure.EXTI_Trigger = ;上升下降等
EXTI_InitStructure.EXTI_Line Cmd = ENABLE;
EXTI_Init(&EXTI_Init Structure);
触发:以3为节点,我们看到了三种触发方式:上升沿,下降沿,软件。
补充:3信号线上打一个斜杠并标注“20”字样,这个表示在,控制器内部类似的信号线路有20个。(其他斜杠同理)
以1为节点:输入1的结构图20个信号线路其中通用I/O端口以下图的方式连接到16个外部中断/事件线上,另外四个EXTI线的连接方式如下: EXTI线16连接到PVD输出 EXTI线17连接到RTC闹钟事件 EXTI线18连接到USB唤醒事件 EXTI线19连接到以太网唤醒事件(只适用于互联型产品)
(16+4)
我们看到所有Pn(1...15)通过AFIO过去,也就是说同一时间,A0,B0,C0...只有一路可以过去。
实现这一功能对应函数为:
GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
触发后会进入这里完成函数中的程序。在启动文件中