【单片机学习之旅】(2-3)stm32F4中断初始化过程解析

中断初始化过程

中断的初始化过程其实就是初始化嵌套向量中断控制器 (NVIC)和外部中断/事件控制器 (EXTI)的值。
对应的库函数就是misc.cexti.c
exti是用来配置外部中断/事件的
【单片机学习之旅】(2-3)stm32F4中断初始化过程解析_第1张图片
【单片机学习之旅】(2-3)stm32F4中断初始化过程解析_第2张图片
EXTI_Init函数将结构体参数配置到对应的寄存器中去,实现的逻辑也是很容易看懂的。
配置好中断线后就需要配置对应的中断事件了(中断向量),F407有89个中断向量,其中向量EXTI0-EXTI4对应外部中断线0-4,向量EXTI9_5和向量EXTI15_10是多跟外部中断线共用的(外部中断线5-9,10-15),外部中断线16-22都有对应的中断向量。剩下的向量都是各种外设的中断向量,不需要经过中断线,是直接和NVIC打交道的。
【单片机学习之旅】(2-3)stm32F4中断初始化过程解析_第3张图片
创建结构体初始化参数,再调用NVIC_Init函数就可以把中断初始化完成了

【单片机学习之旅】(2-3)stm32F4中断初始化过程解析_第4张图片
改变的是NVIC寄存器的值,因为涉及到内核,参考手册中并没有怎么介绍嵌套向量中断控制器 (NVIC),只是说更多关于异常和 NVIC 编程的说明,请参考《ARM Cortex™-M4F 技术参考手册》中的第 5 章:异常和第 8 章:嵌套向量中断控制器。有兴趣的可以找一下,我找了好久都没找到。。。
还有一个就是要先设置中断分组:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
值为NVIC_PriorityGroup_0~NVIC_PriorityGroup_4,对应为下面这个图

【单片机学习之旅】(2-3)stm32F4中断初始化过程解析_第5张图片
外部中断配置流程

    GPIO_InitTypeDef GPIO_InitStructure;//GPIO结构体
    EXTI_InitTypeDef EXTI_InitStructure;//外部中断结构体
    NVIC_InitTypeDef NVIC_InitStructure;//中断向量使能结构体
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//系统配置时钟
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //选择端口                           
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;   //浮空输入
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOI,&GPIO_InitStructure); //GPIO初始化配置
    
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource1); //GPIO 与中断线关联(连接)
    
    EXTI_InitStructure.EXTI_Line = EXTI_Line1;//选择中断线                     
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//外部中断
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//触发沿
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断使能
    EXTI_Init(&EXTI_InitStructure);  //外部中断初始化
    
    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;//选择中断向量
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 8;//响应优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //使能中断向量
    NVIC_Init(&NVIC_InitStructure);//初始化中断向量配置

如果是串口等其它外设中断就不需要初始化EXTI了,则需配置对应外设初始化

你可能感兴趣的:(单片机,stm32,学习)