打印
[STM32F4]

stm32 TIM 输出比较

[复制链接]
2228|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fxk416532131|  楼主 | 2013-12-20 21:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void TIM4_LED_Config(void)
{
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  uint16_t prescalervalue = 0;
  
  /* TIM4 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* Enable the TIM3 gloabal Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* Initialize Leds mounted on STM324F4-EVAL board */
  STM_EVAL_LEDInit(LED3);
  STM_EVAL_LEDInit(LED4);
        STM_EVAL_LEDInit(LED5);
  STM_EVAL_LEDInit(LED6);
  
  /* Compute the prescaler value */
  prescalervalue = (uint16_t) ((SystemCoreClock ) / 50000) - 1;
  
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 65535;         
  TIM_TimeBaseStructure.TIM_Prescaler = prescalervalue;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  
  /* Enable TIM4 Preload register on ARR */
  TIM_ARRPreloadConfig(TIM4, ENABLE);
  
  /* TIM PWM1 Mode configuration: Channel */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  
  /* Output Compare PWM1 Mode configuration: Channel2 */
  TIM_OC1Init(TIM4, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Disable);
   
  /* TIM Interrupts enable */
  TIM_ITConfig(TIM4, TIM_IT_CC1 , ENABLE);
  
  /* TIM4 enable counter */
  TIM_Cmd(TIM4, ENABLE);

}
输出比较设置timing 计时模式,定时中断,然后小灯反转闪烁,为什么 TIM_TimeBaseStructure.TIM_Period = 65535;必须设置成65535呢?换成别的就小灯闪的就不对了,乱闪
沙发
logokfu| | 2013-12-20 21:21 | 只看该作者
楼主再仔细检查下问题出在哪里应该不会很难的,另外那些申请版主的都出来展示下你们的技术。

使用特权

评论回复
板凳
jjjkkk00| | 2013-12-23 15:48 | 只看该作者
楼主的“小灯闪的不对”是什么意思?是闪烁的时间间隔与你的预期不一样么?

如果是这样的话,请看下面的解释:
第一,TIM_Period的值可以是任意的。
第二,定时器触发中断的时间需要下列几个参数共同作用:来确定定时器的计数频率、加载值、产生中断的比较值。

TIM_TimeBaseStructure.TIM_Period = 65535;         
TIM_TimeBaseStructure.TIM_Prescaler = prescalervalue;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_OCInitStructure.TIM_Pulse = CCR_Val;

使用特权

评论回复
地板
tianli1980| | 2013-12-23 15:59 | 只看该作者
闪烁的频率一样吗?间隔的时间是不是一致?

使用特权

评论回复
5
fxk416532131|  楼主 | 2013-12-24 18:43 | 只看该作者
tianli1980 发表于 2013-12-23 15:59
闪烁的频率一样吗?间隔的时间是不是一致?

改了之后,闪烁的就完全没规律了,不是周期性的。。。

使用特权

评论回复
6
fxk416532131|  楼主 | 2013-12-24 18:45 | 只看该作者
jjjkkk00 发表于 2013-12-23 15:48
楼主的“小灯闪的不对”是什么意思?是闪烁的时间间隔与你的预期不一样么?

如果是这样的话,请看下面的解 ...

就是闪烁完全乱掉,不是周期性的,有时候亮的时间长,有时候亮的时间短。。

使用特权

评论回复
7
lanseshuijing| | 2013-12-24 20:17 | 只看该作者
33.  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

增计数 65535一直进中断吧

使用特权

评论回复
8
zeluo| | 2013-12-24 20:45 | 只看该作者
感觉很有意思啊   很好玩   不错     先看看

使用特权

评论回复
9
huzi2099| | 2013-12-25 00:23 | 只看该作者
65535是计数周期,其它值应该没问题.
闪灯那段在哪里?

使用特权

评论回复
10
fxk416532131|  楼主 | 2013-12-25 13:03 | 只看该作者
huzi2099 发表于 2013-12-25 00:23
65535是计数周期,其它值应该没问题.
闪灯那段在哪里?

在中断里,代码是
void TIM4_IRQHandler(void)
{

  /* Checks whether the TIM interrupt has occurred */
  if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
    if( LED_Toggle == 3)
    {
      /* LED3 Orange toggling */
      STM_EVAL_LEDToggle(LED3);
      STM_EVAL_LEDOff(LED6);
      STM_EVAL_LEDOff(LED4);
    }
    else if( LED_Toggle == 4)
    {
      /* LED4 Green toggling */
      STM_EVAL_LEDToggle(LED4);
      STM_EVAL_LEDOff(LED6);
      STM_EVAL_LEDOff(LED3);
    }
    else if( LED_Toggle == 6)
    {
      /* LED6 Blue toggling */
      STM_EVAL_LEDOff(LED3);
      STM_EVAL_LEDOff(LED4);
      STM_EVAL_LEDToggle(LED6);
    }
    else if (LED_Toggle ==0)
    {
      /* LED6 Blue On to signal Pause */
      STM_EVAL_LEDOn(LED6);
    }
    else if (LED_Toggle == 7)
    {
      /* LED4 toggling with frequency = 439.4 Hz */
      STM_EVAL_LEDOff(LED3);
      STM_EVAL_LEDOff(LED4);
      STM_EVAL_LEDOff(LED5);
      STM_EVAL_LEDOff(LED6);
    }
    capture = TIM_GetCapture1(TIM4);
    TIM_SetCompare1(TIM4, capture + CCR_Val);
  }
}

使用特权

评论回复
11
fxk416532131|  楼主 | 2013-12-25 13:07 | 只看该作者
lanseshuijing 发表于 2013-12-24 20:17
33.  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

增计数 65535一直进中断吧 ...

就是设置的定时中断啊,然后在中断里,反转小灯闪烁。周期只能是 65535,换做别的就不正常闪烁了。。

使用特权

评论回复
12
jjjkkk00| | 2013-12-25 13:48 | 只看该作者
本帖最后由 jjjkkk00 于 2013-12-25 13:58 编辑
fxk416532131 发表于 2013-12-25 13:03
在中断里,代码是

看到你的中断函数就发现了问题!
capture = TIM_GetCapture1(TIM4);
TIM_SetCompare1(TIM4, capture + CCR_Val);
是这里两行代码出的错。

删除它们。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
fxk416532131 + 1 很给力!
13
fxk416532131|  楼主 | 2013-12-25 14:21 | 只看该作者
jjjkkk00 发表于 2013-12-25 13:48
看到你的中断函数就发现了问题!
capture = TIM_GetCapture1(TIM4);
TIM_SetCompare1(TIM4, capture + CCR ...

嗯 没问题了,之前一直在找初始化问题,没注意中断里面。 谢谢。

使用特权

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

本版积分规则

2

主题

10

帖子

0

粉丝