打印

初学STM32,问个关于定时器溢出和通道嵌套的问题

[复制链接]
3721|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hackthree|  楼主 | 2011-2-9 10:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初学STM32,在整到TIM定时器的时候遇到了个问题,就是关于定时器中断嵌套的问题。。

我是用的TIM2定时器的溢出和通道1,想在溢出的中断中实现开启和关闭通道1的中断,

但是实际调试只能实现通道1中断的开启,一旦开启后,就没法在溢出中调用函数关闭了。。
程序应该是没啥问题,因为我用TIM2和TIM3设置好优先级是可以的实现的。。。

所以就想问,在TIM2中溢出和四个通道之间怎么确定优先级?

怎么才能用TIM2的溢出和四个通道实现我要的功能呢?:(
沙发
香水城| | 2011-2-9 10:47 | 只看该作者
问题描述不清楚:
1)用通道1做什么?怎么用?
2)你是如何开启和关闭通道中断的?
3)为什么说“程序应该是没啥问题”?
4)你要用TIM2的溢出和四个通道实现什么功能?

使用特权

评论回复
板凳
hackthree|  楼主 | 2011-2-9 11:14 | 只看该作者
2# 香水城

不好意思,我贴上我的部分程序说吧:
首先是TIM 的配置。
初始化的时候定义了TIM2的溢出和通道一,但只开启了TIM2 的溢出

void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
u16 CCR1_Val = 800;//定时器计数值1

/* TIM2 clock enable */
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

/* 基础设置,其中AHB1为20M,分频值为2000,所以定时器速度为10K,计数值是1000,所以0.1S溢出*/
TIM_TimeBaseStructure.TIM_Period = 1000;   //计数值   
TIM_TimeBaseStructure.TIM_Prescaler = 2000-1;     //预分频,此值+1为分频的除数
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


/* 比较通道1*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive;        //输出比较非主动模式
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;  
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //极性为正
   
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);   

TIM_ARRPreloadConfig(TIM2, ENABLE);
/*预先清除所有中断位*/
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
/* 4个通道和溢出都配置中断*/
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
/* 允许TIM2开始计数 */
TIM_Cmd(TIM2, ENABLE);

}

然后就是TIM2 的中断处理函数,在溢出中处理  Key_Scan()函数,是一个键盘扫描函数
在通道一中断处理中是display()函数,是一个显示函数。

void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
  TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  
  Key_Scan();

}
else if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
  /*必须清空标志位*/
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

   display();
}
}

然后,是键盘扫描函数Key_Scan()中开启和关闭通道1 的部分函数

。。。。。。。。

else if(Key==KEY_SET_LONG)
{
  if(menu_num==MENU)       //当在主界面的时候,长按SET键,关闭TIM2通道1的中断,跳回密码界面
  {
   TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);/*预先清除通道1的中断位*/

   TIM_ITConfig(TIM2, TIM_IT_CC1, DISABLE);/* 关闭通道1的中断*/

   menu_num=MENU_PW;
   }
}

else if(Key==KEY_MAN_LONG)     //当在密码界面的时候,长按MAN键,开启TIM2通道1的中断,跳回主菜单界面
{
     if(menu_num==MENU_PW)
  {
   TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);/*预先清除通道1的中断位*/

   TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);/* 开启通道1的中断*/

   menu_num=MENU;
  }
}
。。。。。。。

想要实现是功能如注释,当在主界面的时候,长按SET键,关闭TIM2通道1的中断,跳回密码界面;
当在密码界面的时候,长按MAN键,开启TIM2通道1的中断,跳回主菜单界面;
可调试的时候发现,只能实现在当在密码界面的时候,长按MAN键,开启TIM2通道1的中断,跳回主菜单界面
但是当在主界面的时候,长按SET键,无法关闭TIM2通道1的中断,跳回密码界面;

我说的程序没啥问题是指,我用TIM2和TIM3两个定时器,在TIM2中处理键盘扫描,在TIM3里处理显示,TIM2的优先级高于TIM3就可以实现
当在主界面的时候,长按SET键,关闭TIM2通道1的中断,跳回密码界面;
当在密码界面的时候,长按MAN键,开启TIM2通道1的中断,跳回主菜单界面;

所以想问的是,如果只用TIM2一个定时器,用里面的溢出和四个通道,怎么去定义TIM2的溢出中断和四个通道它们的优先级?

语言组织能力不佳,也不晓得香主能不能看懂。。

使用特权

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

本版积分规则

1

主题

220

帖子

1

粉丝