



内核中断10个,外设70个
中断优先级寄存器
跟内核相关的函数找core_cm3.c/h,misc.c/h
NVIC的功能就是中断优先级分组、中断优先级的配置、读中断请求标志、清除中断请求标志、使能中断、清除中断等,它控制着STM32中断向量表中的中断相关功能!!。

先比较主优先级,再比较子优先级,都相同比较硬件的编号



1-中断函数名称要好启动文件里中断向量表里的函数名称一样,因为启动文件是弱定义,所以重定义就可以覆盖。写错了就只会执行启动文件里的。
2-为了方便管理在stm32f10x_it.c里写函数
具体的实例—GPIO中断

EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

读取GPIO的变化由EXTI产生中断来交给内核NVIC

输入线

1,输入线20根,具体是

2,


各个寄存器都可以找到


定义化EXTI结构体


上面那些都是给寄存器赋值
编程

硬件图是要求用按键来产生中断

代码整理
main.c
int main()
{
void EXTI_Key_Config();
EXTI_Key_Config();
void EXTI0_IRQHandler(void);
EXTI0_IRQHandler();
while (1)
{}
}
bsp_exti.c
#include "stm32f10x.h" // Device header
//说明文件只能被当前的文件调用
static void EXTI_Config()
{ //定义NVIC结构体
NVIC_InitTypeDef NVIC_Ins;
//设置中断线
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
//指定通道
NVIC_Ins.NVIC_IRQChannel=EXTI0_IRQn ;
//设定组优先级
NVIC_Ins.NVIC_IRQChannelPreemptionPriority=1;
//设定子优先级,数字越小越高
NVIC_Ins.NVIC_IRQChannelSubPriority=1;
//指定通道是启用还是禁止
NVIC_Ins.NVIC_IRQChannelCmd=ENABLE;
//调用初始化函数
NVIC_Init(&NVIC_Ins);
}
void EXTI_Key_Config()
{
//初始化EXTI的结构体
EXTI_InitTypeDef GPIO_InitStruct;
//配置中断优先级
EXTI_Config();
//初始化GPIO 开启PA0 复用输入
GPIO_InitTypeDef led_init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
led_init.GPIO_Speed =GPIO_Speed_50MHz;
led_init.GPIO_Pin=GPIO_Pin_0;
led_init.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &led_init);
//初始化GPIO 开启PB0 推挽输出
GPIO_InitTypeDef le_init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE );
le_init.GPIO_Speed =GPIO_Speed_50MHz;
le_init.GPIO_Pin=GPIO_Pin_0;
le_init.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &le_init);
//打开EXTI的时钟 打开的是AFIO EXTI中断在AFIO里
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE );
//初始化EXTI
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
//配置中断线
GPIO_InitStruct.EXTI_Line=EXTI_Line0 ;
//配置中断模式
GPIO_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
//配置为上升沿触发
GPIO_InitStruct.EXTI_Trigger= EXTI_Trigger_Rising;
//配置开启
GPIO_InitStruct.EXTI_LineCmd=ENABLE;
//结构题设置好了后写入固件库 结构体是变量,对于输入指针要用&
EXTI_Init(&GPIO_InitStruct);
//编写中断函数在stm32f10x_it.c文件中
}
stm32f10x_it.c
void EXTI0_IRQHandler(void)
{
//判断中断线是否有中断
if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
{
GPIOB->ODR^=GPIO_Pin_0 ;
}//清楚中断标志位
EXTI_ClearITPendingBit(EXTI_Line0);
}