分享战舰开发板教程解析 实验五 外部中断

2019-07-21 08:44发布


仅仅是我的拙见  
如果那里有说的不对的  肯定各位指出来。或者说您认为那里应该添加内容

三、外部中断

3.1  NVIC的优先级分组 STM32中指定优先级的寄存器为4位,其定义如下: 第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位(2^3=8级)用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位(2^2=4级)用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级 以上定义也称作中断优先级分组,相关内容在STM32固件库的misc.h文件中有     举个例子,比如火车站买票,那些火车站的规章制度就是NVIC,规定学生和军人有比一般人更高优先级,它们则给你单独安排个窗口,同学与同学之间也有区别,那就是你也得排队,也就是你的组别(抢断优先级)和你的排队序号(响应优先级)决定你何时能买到票。 抢断优先级,顾名思义,能再别人中断是抢占别人中断,实现中断嵌套。响应优先级则只能排队,不能抢在前面插别人的对,即不能嵌套。   具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。    当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
3.2中断通道如何查找? 定义初始化那个中断,如外部中断EXTI2_IRQn NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
这个如何快速查找 EXTI2_IRQn??
   我是没有找到快速查找外部中断的方法。。。。如果有的话请各位告之我 我只有这样记住  stm32f10x.h  第167行是中断IRQn  全部在这里
3.3 外部中断初始化过程 任何初始化都可以大致分为以下几步 1、()_InitTypeDef ()_InitStructure; 2、时钟使能    (RCC_APB2PeriphClockCmd或RCC_APB1PeriphClockCmd) 3、配置GPIO和中断线的映射关系     GPIO_EXTILineConfig() 4、中断初始化参数配置了 EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); 5、中断分组优先级配置 在原子哥教程里把中断优先级放入中断初始化函数中,有的程序则是调用子函数。NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);通过配置它的参数我们可以得到 NVIC_IRQChannel = EXTI0_IRQn;//外部中断通道3.2中有讲解 NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,  NVIC_IRQChannelSubPriority = 0x03; //子优先级3 NVIC_IRQChannelCmd = ENABLE; 原子哥调皮的地方是 他把中断分组NVIC_PriorityGroupConfig();这个函数单独写出一个函数,在sys.c中,我们使用原子哥的教程后可以通过sys.c中的system下面的sys.c文件内的NVIC_Configuration(void)调节分组,在主函数中要放入此函数。 6、外部中断服务函数    (1)//外部中断2服务程序名称如何查找        void EXTI2_IRQHandler(void)        这个EXTI2_IRQHandler(void) 怎么快速查找其余的中断服务函数名字?      在启动文件CORE下的startup_stm32f10x_hds文件内第264到323行之间,所有的中断服务名称都在其中
(2)  在函数里写执行函数。在最后要清除已经发送的中断请求。EXTI_ClearITPendingBit();
 (3)PPT内容     我们讲解了为什么在我们4个中断服务函数的开头,我们没有调用函数 EXTI_GetITStatus去判断这个中断是来自哪个中断线。 这里我们讲解不是很清晰,这里我们补充一下。
因为我们中断服务函数0~4(EXTI0_IRQHandler,EXTI4_IRQHandler)都只处理来自唯一的中断线的中断服务请求,也就是说,在我们执行这四个 中断服务函数的时候,我们就已经知道了这个中断请求时来自哪个中断线(例如EXTI0_IRQHandler一定是处理中断线0的请求),所以我们不需要再去调用 EXTI_GetITStatus去判断中断来自哪个中断线。 但是对于我们的中断服务函数EXTI9_5_IRQHandler和EXTI15_10_IRQHandler,我们在开头就需要要判断是来自哪个中断线。。。。                   
3.4  中断在程序里是如何执行的?
程序运行时 触发中断,则有硬件跳转到中断执行函数。

3.5 STM32外部中断仅仅支持边沿触发   上升沿触发:当检测从低到高的变化时就触发   下降沿触发:当检测从高到低的变化时就触发 变化后的高电平还是低电平与状态无关。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
正点原子
1楼-- · 2019-07-21 12:18
不错啊,cool
逍遥居士_888
2楼-- · 2019-07-21 12:35
回复【2楼】正点原子:
---------------------------------
嘿嘿 谢谢原子哥
w417074951
3楼-- · 2019-07-21 12:56
挺细的啊,谢谢分享
龙之谷
4楼-- · 2019-07-21 17:06
 精彩回答 2  元偷偷看……
andychen92
5楼-- · 2019-07-21 19:52
不错,总结得很好!谢谢分享!
lblly
6楼-- · 2019-07-21 23:44
写的挺好的,赞一个

一周热门 更多>