STM32中断_NVIC_EXTI_资料汇总整理
~~*建于:2019年3月28日,逐步更新完善,哈*~
几位前辈的参考文章,讲得很好, 重点理解:
之前使用函数库实现,如履雾中,走了很多弯路。然后,尝试寄存器操作,多了N倍时间学习 ,路径反而清晰起来了。
F429 在内核水平上搭载了一个异常(中断/事件)响应系统,支持为数众多的系统异常和外部中断。
- 其中, 系统异常有 10 个,外部中断有 91个。
- 除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。中断通道的优先级确定设备整体的优先级,而设备本身的多个中断执行顺序由用户的中断服务程序决定。
- 每个中断源/中断事件都要通过指定的中断通道向内核申请中断。
- 有关具体的系统异常和外部中断可在标准库文件 stm32f4xx.h这个头文件查询到,在 IRQn_Type 这个结构体里面包含了 F4 系列全部的异常声明。
操作步骤 , 主要操作两部分, NVIC和EXT. 建议用A4纸,打开思维导图,把知识点联系起来.
- 初始化 IO 口, 输入模式
- 使能复用时钟 SYSCFG
- IO 与中断线的映射关系
- IO 触发条件
- NVIC 分组\ 优先级
- 使能中断
- 编写中断函数(清除中断标志)
在理解上, 反过来,从大方向上先把NVCI理解.
一: NVIC
嵌套向量中断控制器 : 用于为中断分组,从而分配抢占优先级和响应优先级.
1:优先级分组
SCB->AIRCR = ((uint32_t)0x05FA0000) | (0x05<<8);
// 一行代码解决分组. 即IP寄存器中[7:6]抢占优先级, [5:4]响应优先级;
这个是必须先处理的。
- SCB->AIRCR的 [10:8] PriGroup 位,是优先级分组号,其实它决定的异常优先级分组结构:,即NVIC->IP[240] 8位寄存器中的高4位作用(用多少位做抢占级,多少位做响应级).
- 共4位,可分16种优先级 .编号越小,优先级别越高 , 高抢占优先级可中断运行中的低抢占优先级任务,即中断嵌套.同级抢占有优先级的,不能打断,按响应级排除.
- 这里直接配置为第二组,在自己日后的嵌入系统中也统一办用这个设置,够用,免得烦心.
- (uint32_t)0x05FA0000, 是密匙,AIRCR的写操作,必须同时写入密匙,否则无效.读操作无需密匙,直接读取.
2: 指定中断源的优先级
这是函数库, 还没理解寄存器的操作
// 使能EXTI9_5中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
这段代码,指定了EXTI9_5_IRQChannel(向量表中第23号)这个异常, 具有的抢占级和响应级
下图为 系统异常清单, 在STM32中文参考手册中,专业名词为 中断嵌套向量表. 在 stm32f4xx.h 文件 IRQn_Type 结构体里面的异常声明.
二:EXTI
外部中断/ 事件控制器: 主要是控制外部中断/事件的产生
- 支持 23个外部中断/ 事件的中断源请求。
- 每个中断线设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置
- 中断线的屏蔽位 (EXTI_IMR)
- 中断线的触发选择位(EXTI_RTSR 和 EXTI_FTSR)
- 需要配置对应到外部中断控制器 (EXTI) 的 NVIC 中断通道的使能和屏蔽位,使得 23 个中断线中的请求可以被正确地响应。***(这个最难理解)***