打印

stm32的定时器,计数值比比较捕获定时器值小,能触发中断?

[复制链接]
5194|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenzongxi|  楼主 | 2011-11-16 10:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32的定时器输出比较实验,计数值比比较捕获定时器值小,能触发中断?应该不能啊
现在我的程序一直在触发中断,不知道为什么
没有开溢出中断
#include "stm32f10x.h"
void RCC_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD,ENABLE);  //外设要开复用时钟?
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;               //LED0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;  
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_8);         
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;          //LED1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;  
GPIO_Init(GPIOD,&GPIO_InitStructure);

GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;            //TIM2的CH1是PA0的复用功能
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;              //复用输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;  
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void TIMx_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;         
TIM_OCInitTypeDef TIM_OCInitStructure;         
                      //时基单元初始化
TIM_TimeBaseStructure.TIM_Period = 8000;         //计数值8000
TIM_TimeBaseStructure.TIM_Prescaler = 999;         //8000000/1000=8000Hz,周期为1/8000,计数器周期为1s
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Active;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        
TIM_OCInitStructure.TIM_Pulse = 15100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2,&TIM_OCInitStructure);

TIM_ITConfig(TIM2,TIM_IT_CC1,ENABLE);

TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);          //使能输出比较中断
TIM_Cmd(TIM2,ENABLE);
}
void Delay(vu32 times)
{
for(;times!=0;times--);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  
NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
  RCC_Configuration();
  GPIO_Configuration();
  TIMx_Configuration();
  NVIC_Configuration();
  while(1)
  {
   GPIO_ResetBits(GPIOA,GPIO_Pin_8);
  Delay(100000);
  GPIO_SetBits(GPIOA,GPIO_Pin_8);
  Delay(100000);
  }
}





void TIM2_IRQHandler(void)
{
     
if(TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);                                         
TIM_SetCounter(TIM2,0x0000);         
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
Delay(1000000);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
}
沙发
香水城| | 2011-11-16 11:27 | 只看该作者
你的程序一直在触发中断,什么中断?清标志位了吗?

使用特权

评论回复
板凳
airwill| | 2011-11-16 12:25 | 只看该作者
计数值与比较捕获定时器值相等触发中断
计数值比比较捕获定时器值小, 那过会儿不就可以相等了
用计数器, 要知道计数值是一直在变的.

使用特权

评论回复
地板
chenzongxi|  楼主 | 2011-11-16 14:20 | 只看该作者
void TIM2_IRQHandler(void)
{
     
if(TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);                                         
TIM_SetCounter(TIM2,0x0000);         
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
Delay(1000000);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
}
这个中断,是比较捕获中断,计数值没有等于比较捕获寄存器值,为什么会进入这个中断呢,GPIOD的2脚是LED,在闪烁,所以进入中断了。

使用特权

评论回复
5
chenzongxi|  楼主 | 2011-11-16 14:23 | 只看该作者
3# airwill


计数器赋值是8000,向上计数,应该从0到8000,而比较捕获寄存器是15100,计数值达不到啊,怎么会中断呢,

使用特权

评论回复
6
chenzongxi|  楼主 | 2011-11-16 14:23 | 只看该作者
2# 香水城



void TIM2_IRQHandler(void)
{
     
if(TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);                                         
TIM_SetCounter(TIM2,0x0000);         
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
Delay(1000000);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
}
这个中断,是比较捕获中断,计数值没有等于比较捕获寄存器值,为什么会进入这个中断呢,GPIOD的2脚是LED,在闪烁,所以进入中断了。

使用特权

评论回复
7
香水城| | 2011-11-16 14:42 | 只看该作者
你怎么知道计数值达不到?可以在清除了中断标志后,读出计数器的值看看。

使用特权

评论回复
8
chenzongxi|  楼主 | 2011-11-16 15:53 | 只看该作者
7# 香水城



计数器赋值是8000,向上计数,应该从0到8000,而比较捕获寄存器是15100,计数值达不到啊,怎么会中断呢,

使用特权

评论回复
9
香水城| | 2011-11-16 16:01 | 只看该作者
7# 香水城  

计数器赋值是8000,向上计数,应该从0到8000,而比较捕获寄存器是15100,计数值达不到啊,怎么会中断呢,
chenzongxi 发表于 2011-11-16 15:53


你说的这是理想情况,实际是不是这样需要验证一下;所以你应该按照我在7楼的建议进行验证。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
chenzongxi + 1
10
chenzongxi|  楼主 | 2011-11-16 18:20 | 只看该作者
9# 香水城
我这不能仿真,我用另一个LED实验,打开了溢出中断和比较捕获中断,LED0在溢出中断中亮灭,LED1在比较捕获中断中亮灭,显示LED0亮——灭,然后LED1亮——灭,LED0灭的同时,LED1亮, 能够知道都是8000这个值到的中断。
比较捕获中断怎么会在计数值为8000时跳入的呢?

使用特权

评论回复
11
chenzongxi|  楼主 | 2011-11-16 19:02 | 只看该作者
10# chenzongxi


if(TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);               
GPIO_ResetBits(GPIOA,GPIO_Pin_8);    //LED0
if(TIM_GetCounter(TIM2) == 8000)
{
TIM_SetCounter(TIM2,0x0000);        
GPIO_ResetBits(GPIOD,GPIO_Pin_2);   //LED1
Delay(1000000);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
}


把中断加了一个条件语句
if(TIM_GetCounter(TIM2) == 8000)
LED0能亮,LED1不亮,去掉这个条件语句,则LED1闪烁,说明不是在8000这进入中断,15100也不行,不知道在哪个值进入中断。


}

使用特权

评论回复
12
chenzongxi|  楼主 | 2011-11-16 19:59 | 只看该作者
7# 香水城



我又改动了一下中断函数,得到清晰的结果

void TIM2_IRQHandler(void)
{

   
if(TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET)//比较捕获中断
{
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);//清中断                                      
GPIO_ResetBits(GPIOA,GPIO_Pin_8);    //红灯亮
if(TIM_GetCounter(TIM2) ==0)            //计数值为零
{
TIM_SetCounter(TIM2,0x0000);        //清零计数值     
GPIO_ResetBits(GPIOD,GPIO_Pin_2);  //黄灯亮
Delay(1000000);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
}

}


当计数值为零时,黄灯能够亮灭。计数值小于比较捕获寄存器值,应该不会触发中断,但触发中断了,而且是在计数值为零时,实在搞不懂了,

使用特权

评论回复
13
grissiom| | 2011-11-16 22:15 | 只看该作者
加两句
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
        TIM_OCStructInit(&TIM_OCInitStructure);
试试~

使用特权

评论回复
14
chenzongxi|  楼主 | 2011-11-17 07:43 | 只看该作者
13# grissiom


加上了也不行,

使用特权

评论回复
15
airwill| | 2011-11-17 08:41 | 只看该作者
LZ: 最好先仔细看看数据手册.

RM0008 Reference Manual Rev 10, 中译版: P270 的图128 特别仔细地研究一下.

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
chenzongxi + 1
16
caesar.song| | 2012-1-18 07:47 | 只看该作者
TIM_TimeBaseStructure.TIM_Period = 8000;         //计数值8000
TIM_TimeBaseStructure.TIM_Prescaler = 999;         //8000000/1000=8000Hz,周期为1/8000,计数器周期为1s
上面那句是什么意思?那个8m 是怎么出来的

使用特权

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

本版积分规则

0

主题

43

帖子

1

粉丝