stm32-中断





       STM32的外部中断系统由两个部分组成:一个标准的NVIC,用于提供一级中断,还有个外部中断/事件控制器(EXTI),提供二级中断。所有来自EXTI的中断都要汇集到NVIC中。
EXTI共有19个中断事件请求器,可独立配置为下降,上升或双边沿触发,0~15接到每个端口的16位线上,16接PVD输出,17接RTC闹钟输出,18接USB唤醒。


EXTI由下降沿触发选择寄存器EXTI_RTSR,上升沿触发选择寄存器EXTI_FTSR,软件中断寄存器EXTI_SWISR,请求挂起寄存器EXTI_PR(与事件触发无关,中断(包括软中断)响应后,清除该寄存器避免一直触发中断),中断屏蔽寄存器EXTI_IMR,事件屏蔽寄存器EXTI_EMR。最终的结果送至NVIC进行进一步的处理。
注意:事件或中断触发源是没有区别的,只是在芯片内部分开,一路向CPU产生中断信号,另一路则向其他功能模块发送脉冲触发信号,其他功能模块如何响应这个触发信号,由对应的模块决定。事件表示有触发事件产生,适用于触发特定的外设模块,中断则是表示有某个事件发生,并跳到响应的中断服务函数中。




外部中断配置的步骤:
1.使能复用时钟(0X01)  AFIO_ EXTICRn(1-4):如EXTICR0的低四位0~3表示Pn0(0001为PA,0010为PB。。。),4~7表示Pn1
2,EXTI_IMR或EXTI_EMR    清除EXTI_PR(写1清除)
3,EXTI_FTSR或EXTI_RTSR
事件配置就此结束,中断还有进行如下NVIC配置:
4.分组{
u32 temp,temp1;  
temp1=(~NVIC_Group)&0x07;//取后三位
temp1<<=8;
temp=SCB->AIRCR;  //读取先前的设置
temp&=0X0000F8FF; //清空先前分组
temp|=0X05FA0000; //写入钥匙
temp|=temp1;   
SCB->AIRCR=temp;  //设置分组
}


NVIC->IP   高四位   设置优先级
5.NVIC_ISER_SETENA0~SENTENA2或NVIC_ICER_CLRENA0~CLRENA2(32位寄存器)
6,对中断的统一屏蔽PRIMASK    FAULTMASK
最后在中断里清除EXTI_PR(写1清除)。




另外,NVIC还有几个不常用到的32位寄存器
;8个NVIC_IABR(中断活跃标志)
8个NVIC_ISPR  (中断挂起设置寄存器)
写:0:无影响  1:删除挂起状态
读:1:中断正等待处理    0:中断没有挂起
8个NVIC_ICPR:中断挂起清除寄存器
写:0:无影响  1:挂起中断
读:1:中断正等待处理    0:中断没有挂起

你可能感兴趣的:(笔记)