打印
[STM32F1]

STM32的中断嵌套问题

[复制链接]
2304|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shendy.liu|  楼主 | 2014-5-9 19:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用的是STM32F103VET6,现在用到了定时器中断3和外部中断。这两个中断单独都能使用。但是在外部中断中调用定时器中断,则定时器不进行中断。猜测是在进入外部中断后关闭了总中断,从而定时器中断不响应。我设置的定时器中断优先级是2,外部中断时4.
void   TIME3_INIT(void){//10us中断
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  
  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
  //抢占优先级0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//响应优先级0
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  //启动此通道的中断
  NVIC_Init(&NVIC_InitStructure);
  
  TIM_DeInit(TIM3);//定义10us
  TIM_TimeBaseStructure.TIM_Period = 179;
  TIM_TimeBaseStructure.TIM_Prescaler = 3;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
// 定时时间T计算公式:
//T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=(35999+1)*(1999+1)/72MHz=1s
  
  
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
  TIM_Cmd(TIM3,ENABLE);
}
    //IR INPUT
//外部中断初始化
  RCC_APB2PeriphClockCmd(IR_INPUT_CLOCK, ENABLE);     
  gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  gpio.GPIO_Pin = IR_INPUT_PIN;
  gpio.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(IR_BASE, &gpio);  
  
  //IR 中断
  GPIO_EXTILineConfig(IR_INT_PORT, IR_INT_PIN);
  
  exti.EXTI_Line = IR_INT_LINE;
  exti.EXTI_Mode = EXTI_Mode_Interrupt;
  exti.EXTI_Trigger = EXTI_Trigger_Falling;    //下降沿触发
  exti.EXTI_LineCmd = ENABLE;
  EXTI_Init(&exti);
  
  nvic.NVIC_IRQChannel = IR_INT_CHANNEL;
  nvic.NVIC_IRQChannelPreemptionPriority = 4;
nvic.NVIC_IRQChannelSubPriority = 4;
  nvic.NVIC_IRQChannelCmd = ENABLE;
  NVIC_ClearPendingIRQ(IR_INT_CHANNEL);
  NVIC_Init(&nvic);
沙发
mmuuss586| | 2014-5-9 19:54 | 只看该作者
进入外部中断后,不会关闭总中断的。
应该程序哪里有问题,我暂时没看出来,你再仔细看下;

关于中断优先级和嵌套你可以看看这个
http://wenku.baidu.com/view/492464f7ba0d4a7302763ace.html

使用特权

评论回复
板凳
diweo| | 2014-5-9 22:21 | 只看该作者
你好历害.居然在中断里调用中断.

使用特权

评论回复
地板
airwill| | 2014-5-10 08:15 | 只看该作者
    在外部中断中调用定时器中断?   不太理解这句话的意思. 我们软件设计有个不成文的规范, 中断服务程序是不能被其他函数作为子程序调用的. 因为以前的 CPU 都用 IRET 这类特别的指令(而不是 RET) 完成中断返回的. 当然 Cortex M 系列处理器更改机制, 使中断函数和普通函数具有相同的代码. 给中断函数化身为普通函数创造了条件, 是不是还有问题我没有测试过, 也没有官方资料称肯定没有问题, 毕竟中断服务函数直接针对硬件. 所以我觉得这个不成文的规范还是遵守的好.

    另外, 楼主的问题还存在于设置上.
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
那么 TIM3 的 IRQChannelPreemptionPriority=2; 和 IR_INT 的 IRQChannelPreemptionPriority = 4; 是一样的. 不能发生中断嵌套!

使用特权

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

本版积分规则

1

主题

7

帖子

1

粉丝