打印

分享讨论:GD32与STM32外部中断的使用

[复制链接]
1016|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shenmu2012|  楼主 | 2015-6-10 19:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GD32与STM32 在很多地方都一致的,在中断上也差不多的,,再者跟大家学习讨论下的了。
沙发
shenmu2012|  楼主 | 2015-6-10 20:00 | 只看该作者
这是讲STM32的。。。
中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加复杂。

使用特权

评论回复
板凳
shenmu2012|  楼主 | 2015-6-10 20:00 | 只看该作者
基本概念
ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。
STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。
4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。按照这种分组,4bit一共可以分成5组
第0组:所有4bit用于指定响应优先级;
第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;
第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;
第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;
第4组:所有4位用于指定抢占式优先级。

使用特权

评论回复
地板
shenmu2012|  楼主 | 2015-6-10 20:00 | 只看该作者
所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。
当 两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后 才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们 在中断表中的排位顺序决定先处理哪一个。每一个中断源都必须定义2个优先级。

使用特权

评论回复
5
shenmu2012|  楼主 | 2015-6-10 20:01 | 只看该作者
有几点需要注意的是:
1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;
2)抢占式优先级别相同的中断源之间没有嵌套关系;
3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

使用特权

评论回复
6
shenmu2012|  楼主 | 2015-6-10 22:19 | 只看该作者
GPIO外部中断
STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。

使用特权

评论回复
7
shenmu2012|  楼主 | 2015-6-10 22:19 | 只看该作者
对于这个GPIO口的外部中断的需要多注意的啊。。。这个跟以往见到的单片机的不太一样的。

使用特权

评论回复
8
shenmu2012|  楼主 | 2015-6-10 22:20 | 只看该作者
对于中断的控制,STM32有一个专用的管理机构:NVIC。对于NVIC的详细解释,可以参考《ARM Cortex-M3权威指南》,Joseph Yiu著,宋岩译,北京航空航天大学出版社出版,第8章NVIC与中断控制。中断的使能,挂起,优先级,活动等等部都是NVIC在管理的。

这个是主要参考的资料的。

使用特权

评论回复
9
shenmu2012|  楼主 | 2015-6-10 22:21 | 只看该作者

程序开发
其实上面那些基本概念和知识只是对STM32的中断系统有一个大概的认识,用程序说话将会更能够加深如何使用中断。使用外部中断的基本步骤如下:
1.       设置好相应的时钟;
2.       设置相应的中断;
3.       IO口初始化;
4.       把相应的IO口设置为中断线路(要在设置外部中断之前)并初始化;
5.       在选择的中断通道的响应函数中中断函数。

使用特权

评论回复
10
shenmu2012|  楼主 | 2015-6-10 22:22 | 只看该作者
给个例程的说明下的吧。。。
void NVIC_cfg()
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                          //选择中断分组2
        
        
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQChannel;     //选择中断通道2
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //响应式中断优先级设置为0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                   //使能中断
        NVIC_Init(&NVIC_InitStructure);

        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;            //选择中断通道3
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占式中断优先级设置为1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //响应式中断优先级设置为1
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                   //使能中断
        NVIC_Init(&NVIC_InitStructure);

        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;  //选择中断通道5
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占式中断优先级设置为2
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //响应式中断优先级设置为2
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                   //使能中断
        NVIC_Init(&NVIC_InitStructure);
}

使用特权

评论回复
11
shenmu2012|  楼主 | 2015-6-10 22:23 | 只看该作者
好了,剩下的教给大家自己去学习的体会的吧。。。

使用特权

评论回复
12
firstblood| | 2015-6-11 19:14 | 只看该作者
4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。

使用特权

评论回复
13
sunmeat| | 2015-6-13 08:41 | 只看该作者
学习了。不过在新版本的库里,GD和STM32的库函数是不同的。

使用特权

评论回复
14
comeon201208| | 2015-6-13 22:50 | 只看该作者
ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。

使用特权

评论回复
15
STM32初学者| | 2015-6-14 14:26 | 只看该作者
68个外部中断.不是只有16个IO中断么,哪来的64个呢?

使用特权

评论回复
16
angerbird| | 2015-6-15 19:55 | 只看该作者
shenmu2012 发表于 2015-6-10 20:00
基本概念
ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级 ...

这个GD32的中断优先级的跟STM32的是一致的。

使用特权

评论回复
17
angerbird| | 2015-6-15 19:55 | 只看该作者
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。当 两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后 才能被处理。

使用特权

评论回复
18
baimiaocun2015| | 2015-6-17 21:57 | 只看该作者
shenmu2012 发表于 2015-6-10 20:00
基本概念
ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级 ...

这个中断优先级的问题的两者是一致的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

76

主题

4324

帖子

9

粉丝