OpenEdv-开源电子网

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

关于中断分组的设置

[复制链接]

29

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2015-6-10
在线时间
1 小时
发表于 2015-8-9 13:15:21 | 显示全部楼层 |阅读模式
5金钱
如果我写了一个程序,在这个程序里面,我用到了一下中断:
1、串口接受中断;
2、PB0口外部中断;
3、systick定时器中断;
那么,想知道,在设置中断分组的时候,这3个中断是需要设置为统一的中断分组(比如组1),还是说可以设置3个不同的中断分组,比如:串口为组0,PB0为组1,systick定时器为组3?一般情况下大家会怎么去设置?

最佳答案

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

中断分组,同一个代码里面有且只能设置一个。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-9 13:15:22 | 显示全部楼层
中断分组,同一个代码里面有且只能设置一个。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-8-9 18:28:47 | 显示全部楼层
才3个    我会搞到同一个分组下面
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-8-9 19:12:57 | 显示全部楼层
同一分组下,每个工程需要设置为统一的分组,分组不同以第一次有效还是最后一次有效记不清了
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

29

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2015-6-10
在线时间
1 小时
 楼主| 发表于 2015-8-9 23:48:57 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
我写了一个工程,有6个.C源文件是自己写的,此工程中我一共设置了三个分组,但编译是通过的,而且程序运行也正常...
回复

使用道具 举报

29

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2015-6-10
在线时间
1 小时
 楼主| 发表于 2015-8-9 23:50:11 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
你说的同一代码是什么意思?同一个源文件?还是同一个函数?
回复

使用道具 举报

6

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-9
在线时间
76 小时
发表于 2015-8-10 09:47:46 | 显示全部楼层
回复【5楼】enginezhong:
---------------------------------
设置这么多次,最后一次有效
签名必须手写!
回复

使用道具 举报

6

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-9
在线时间
76 小时
发表于 2015-8-10 09:48:17 | 显示全部楼层
回复【6楼】enginezhong:
---------------------------------
就是你的一个工程。
签名必须手写!
回复

使用道具 举报

29

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2015-6-10
在线时间
1 小时
 楼主| 发表于 2015-8-10 11:18:33 | 显示全部楼层
回复【8楼】sf116:
---------------------------------
假如我的中断在main函数中的设置顺序是这样的:
1、设置systick 中断,組2,抢占优先级为0,响应优先级为0;
     NVIC_SetPriority(SysTick_IRQn, 0x00);    
2、设置串口1接受非空中断,组0,响应优先级为1;
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
3、设置外部中断0,组1,相应优先级为1
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0); 
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);            
   NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;         
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
那么,你的意思其实最后中断的分组是为3中的设置,即组1,是这样吗?那假如说,我把1,即NVIC_SetPriority(SysTick_IRQn, 0x00)中的0x00设置为0x08,那这样的话,其实NVIC_SetPriority(SysTick_IRQn, 0x08)函数中的中断优先级设置是不成功的,因为最后3中设置的中断分组是组0,组0没有分配抢占优先级位,但是NVIC_SetPriority(SysTick_IRQn, 0x08)函数却又是给systick设置的抢占优先级是2。
回复

使用道具 举报

29

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2015-6-10
在线时间
1 小时
 楼主| 发表于 2015-8-10 11:20:04 | 显示全部楼层
回复【8楼】sf116:
---------------------------------
不好意思,有些地方错误了,我再发一次。
假如我的中断在main函数中的设置顺序是这样的: 
1、设置systick 中断,組2,抢占优先级为0,响应优先级为0; 
     NVIC_SetPriority(SysTick_IRQn, 0x00);     
2、设置串口1接受非空中断,组1,响应优先级为1; 
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    NVIC_Init(&NVIC_InitStructure); 
3、设置外部中断0,组0,相应优先级为1 
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);  
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);             
   NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; 
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;          
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
   NVIC_Init(&NVIC_InitStructure); 
那么,你的意思其实最后中断的分组是为3中的设置,即组1,是这样吗?那假如说,我把1,即NVIC_SetPriority(SysTick_IRQn, 0x00)中的0x00设置为0x08,那这样的话,其实NVIC_SetPriority(SysTick_IRQn, 0x08)函数中的中断优先级设置是不成功的,因为最后3中设置的中断分组是组0,组0没有分配抢占优先级位,但是NVIC_SetPriority(SysTick_IRQn, 0x08)函数却又是给systick设置的抢占优先级是2。
回复

使用道具 举报

6

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-9
在线时间
76 小时
发表于 2015-8-10 16:47:35 | 显示全部楼层
回复【10楼】enginezhong:
---------------------------------那1中设置的抢占优先级不成功呗。看函数原型
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
  /* Check the parameters */
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  
  /* Set the RIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
你想想,一个寄存器,你先写1再写2,肯定是最后一个数据有效啊。
签名必须手写!
回复

使用道具 举报

29

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2015-6-10
在线时间
1 小时
 楼主| 发表于 2015-8-10 16:57:36 | 显示全部楼层
回复【11楼】sf116:
---------------------------------
回复【11楼】sf116:
---------------------------------
真是这样吗?那如果是这样的,一个工程中如果你想设置两个不同的中断分组那是不能实现的了。有什么可以证明一下,我说的这个例子,是自己写的工程,但是目前来看,程序下载在硬件上运行时是正常的。
回复

使用道具 举报

6

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-9
在线时间
76 小时
发表于 2015-8-10 17:03:58 | 显示全部楼层
回复【12楼】enginezhong:
---------------------------------
肯定只能选择一个分组。
运行正常是因为你的运行条件对抢占的要求不高。你不设置分组,它也能正常运行。
签名必须手写!
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-8-10 17:21:15 | 显示全部楼层
回复【13楼】sf116:
---------------------------------
 我感觉楼主说的是中断优先级,不是中断分组
小小蜗牛
回复

使用道具 举报

6

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-9
在线时间
76 小时
发表于 2015-8-10 17:27:19 | 显示全部楼层
回复【12楼】enginezhong:
---------------------------------
我做了一个测试,
*******************************************************
TIM_ITConfig(TIM3,TIM_IT_Update,   ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure);  
*******************************************************
TIM_ITConfig(TIM2,TIM_IT_Update,   ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure); 
*******************************************************
void TIM2_IRQHandler(void) 
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) 
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update  ); 
while(1);
         }
}
*******************************************************
如果分组设置NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
定时器3的抢占优先级比2高,可以正常跑。
如果分组设置NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
这样就没有抢占优先级,只有执行优先级,那么定时器3执行优先级比2的低,这样定时器3一直无法执行。
签名必须手写!
回复

使用道具 举报

6

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-9
在线时间
76 小时
发表于 2015-8-10 17:28:59 | 显示全部楼层
回复【14楼】jiutianshenjian:
---------------------------------
楼主说的是怎样设置分组。
签名必须手写!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 15:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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