OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13183|回复: 7

每个实验都要加void NVIC_Configuration(void)里面的配置都是一样的都是第二组 2位抢占优先级,如果我有若干个中断,抢占优先级从优先级一个组都不够用了,我是不是要都配置如下?

[复制链接]

22

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2014-11-3
在线时间
1 小时
发表于 2014-11-17 10:16:41 | 显示全部楼层 |阅读模式
5金钱
void NVIC_Configuration(void)
{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 

}

如果我中断太多有若干,我配置是不是要这样?
先打开所有的组
void NVIC_Configuration(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
}

然后分配这若干的中断,定时器、外部中断什么的分到不同的组不同的从优先级,假设有若干,一两个组的16个从优先级不够用了,实际可能没有的

定时器3
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //第0组
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure);  

定时器2
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //第1组
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure);  

定时器1
NVIC_InitStructure.NVIC_IRQChannel = TIM1_IRQn;  
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //第2组
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure);  


......

不知道理解正确不?





最佳答案

查看完整内容[请看2#楼]

回复【5楼】j2030982: --------------------------------- 我觉得是最后一句话
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-11-17 10:16:42 | 显示全部楼层
回复【5楼】j2030982:
---------------------------------
我觉得是最后一句话
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-11-17 10:52:17 | 显示全部楼层
打开需要的那一个。前面的都被最后一个覆盖了。
相当于a=0;a=1;...a=4;结果a=4;
小小蜗牛
回复

使用道具 举报

22

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2014-11-3
在线时间
1 小时
 楼主| 发表于 2014-11-17 12:49:06 | 显示全部楼层
回复【2楼】jiutianshenjian:
---------------------------------
你好 请教下 如果我需要把所有的都开起来 该怎么写呢
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-11-17 13:09:09 | 显示全部楼层
回复【3楼】j2030982:
---------------------------------
啥意思?

                      STM32(Cortex-M3)中的优先级概念  
STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应
优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源
都需要被指定这两种优先级。  
    具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处
理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌
套低抢占式优先级的中断。  
    当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,
当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就
要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,
则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果
他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的
排位顺序决定先处理哪一个。  
    既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存
器位记录每个中断的优先级;在 Cortex-M3 中定义了 8 个比特位用于
设置中断源的优先级,这 8 个比特位可以有 8 种分配方式,如下:  
所有 8 位用于指定响应优先级  
最高 1 位用于指定抢占式优先级,最低 7 位用于指定响应优先级  
最高 2 位用于指定抢占式优先级,最低 6 位用于指定响应优先级  
最高 3 位用于指定抢占式优先级,最低 5 位用于指定响应优先级  
最高 4 位用于指定抢占式优先级,最低 4 位用于指定响应优先级  
最高 5 位用于指定抢占式优先级,最低 3 位用于指定响应优先级  
最高 6 位用于指定抢占式优先级,最低 2 位用于指定响应优先级  
最高 7 位用于指定抢占式优先级,最低 1 位用于指定响应优先级  
    这就是优先级分组的概念。  
Cortex-M3 允许具有较少中断源时使用较少的寄存器位指定中断源的
优先级,因此 STM32 把指定中断优先级的寄存器位减少到 4 位,这
4 个寄存器位的分组方式如下:   
第 0 组:所有 4 位用于指定响应优先级  
第 1 组:最高 1 位用于指定抢占式优先级,最低 3 位用于指定响应优
先级  
第 2 组:最高 2 位用于指定抢占式优先级,最低 2 位用于指定响应优
先级  
第 3 组:最高 3 位用于指定抢占式优先级,最低 1 位用于指定响应优
先级  
第 4 组:所有 4 位用于指定抢占式优先级  
     可 以 通 过 调 用 STM32 的 固 件 库 中 的 函 数
NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数
的参数有下列 5 种:  
NVIC_PriorityGroup_0 => 选择第 0 组  
NVIC_PriorityGroup_1 => 选择第 1 组  
NVIC_PriorityGroup_2 => 选择第 2 组  
NVIC_PriorityGroup_3 => 选择第 3 组  
NVIC_PriorityGroup_4 => 选择第 4 组  
接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指
定中断源的抢占式优先级和响应优先级:  
// 选择使用优先级分组第 1 组  
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  
    
// 使能 EXTI0 中断  
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;     // 这 里 原 来
为              EXTI10_5_IRQChannel,但要改为 EXTI10_5_IRQn  
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //  指 定
抢占式优先级别 1  
 
            stm32 nvic 总结!非常全,非常给力 
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //  指 定 响 应 优
先级别 0  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
NVIC_Init(&NVIC_InitStructure);  
    
// 使能 EXTI9_5 中断  
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;  //这里原来
为             EXTI9_5_IRQChannel,但要改为 EXTI9_5_IRQn  
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //  指 定
抢占式优先级别 0  
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //  指 定 响 应 优
先级别 1  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
NVIC_Init(&NVIC_InitStructure);  
 
要注意的几点是:  
1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级
分组所限定的范围,将可能得到意想不到的结果;  
2)抢占式优先级别相同的中断源之间没有嵌套关系;  
3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断
源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的
响应优先级别
小小蜗牛
回复

使用道具 举报

22

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2014-11-3
在线时间
1 小时
 楼主| 发表于 2014-11-17 13:46:31 | 显示全部楼层
回复【4楼】jiutianshenjian:
-------------------------------
写的很详细的,也就是说NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 这个语句,如果我要配置中断优先级的时候就调用一次
如果group1都配置完了我在调用一下NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);把里面组参数换了 然后在配置。如果都配置完了我在调用NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);依次...在配置才可以都用上, 而不是在一个函数里都写上结果只能是最后一个语句有用,是这样的吗?

还是说怎么配置 都只有16个中断优先等级可以用?不能超过16个
回复

使用道具 举报

22

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2014-11-3
在线时间
1 小时
 楼主| 发表于 2014-11-17 14:50:35 | 显示全部楼层
回复【6楼】jiutianshenjian:
---------------------------------
好的 我有点明白了 3q
回复

使用道具 举报

87

主题

569

帖子

0

精华

高级会员

Rank: 4

积分
831
金钱
831
注册时间
2014-9-30
在线时间
140 小时
发表于 2014-11-18 12:02:21 | 显示全部楼层
回复【5楼】j2030982:
---------------------------------
其实 只是看你怎么去设置。。既然 优先级别 只有 16个。。

你有 超过 16个 的中断,,那,,就会 有几个 是“同级别”而已。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 23:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表