[STM32F4] stm32 TIM 输出比较

[复制链接]
2718|12
 楼主| fxk416532131 发表于 2013-12-20 21:15 | 显示全部楼层 |阅读模式
  1. void TIM4_LED_Config(void)
  2. {
  3.   TIM_OCInitTypeDef  TIM_OCInitStructure;
  4.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.   NVIC_InitTypeDef NVIC_InitStructure;
  6.   uint16_t prescalervalue = 0;
  7.   
  8.   /* TIM4 clock enable */
  9.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  10.   
  11.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  12.   
  13.   /* Enable the TIM3 gloabal Interrupt */
  14.   NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  15.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  16.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  17.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  18.   NVIC_Init(&NVIC_InitStructure);

  19.   /* Initialize Leds mounted on STM324F4-EVAL board */
  20.   STM_EVAL_LEDInit(LED3);
  21.   STM_EVAL_LEDInit(LED4);
  22.         STM_EVAL_LEDInit(LED5);
  23.   STM_EVAL_LEDInit(LED6);
  24.   
  25.   /* Compute the prescaler value */
  26.   prescalervalue = (uint16_t) ((SystemCoreClock ) / 50000) - 1;
  27.   
  28.   /* Time base configuration */
  29.   TIM_TimeBaseStructure.TIM_Period = 65535;         
  30.   TIM_TimeBaseStructure.TIM_Prescaler = prescalervalue;
  31.   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  32.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  33.   TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  34.   
  35.   /* Enable TIM4 Preload register on ARR */
  36.   TIM_ARRPreloadConfig(TIM4, ENABLE);
  37.   
  38.   /* TIM PWM1 Mode configuration: Channel */
  39.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  40.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  41.   TIM_OCInitStructure.TIM_Pulse = CCR_Val;
  42.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  43.   
  44.   /* Output Compare PWM1 Mode configuration: Channel2 */
  45.   TIM_OC1Init(TIM4, &TIM_OCInitStructure);
  46.   TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Disable);
  47.    
  48.   /* TIM Interrupts enable */
  49.   TIM_ITConfig(TIM4, TIM_IT_CC1 , ENABLE);
  50.   
  51.   /* TIM4 enable counter */
  52.   TIM_Cmd(TIM4, ENABLE);

  53. }
输出比较设置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 | 显示全部楼层
闪烁的频率一样吗?间隔的时间是不是一致?
 楼主| fxk416532131 发表于 2013-12-24 18:43 | 显示全部楼层
tianli1980 发表于 2013-12-23 15:59
闪烁的频率一样吗?间隔的时间是不是一致?

改了之后,闪烁的就完全没规律了,不是周期性的。。。
 楼主| fxk416532131 发表于 2013-12-24 18:45 | 显示全部楼层
jjjkkk00 发表于 2013-12-23 15:48
楼主的“小灯闪的不对”是什么意思?是闪烁的时间间隔与你的预期不一样么?

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

就是闪烁完全乱掉,不是周期性的,有时候亮的时间长,有时候亮的时间短。。
lanseshuijing 发表于 2013-12-24 20:17 | 显示全部楼层
33.  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

增计数 65535一直进中断吧
zeluo 发表于 2013-12-24 20:45 | 显示全部楼层
感觉很有意思啊   很好玩   不错     先看看
huzi2099 发表于 2013-12-25 00:23 | 显示全部楼层
65535是计数周期,其它值应该没问题.
闪灯那段在哪里?
 楼主| fxk416532131 发表于 2013-12-25 13:03 | 显示全部楼层
huzi2099 发表于 2013-12-25 00:23
65535是计数周期,其它值应该没问题.
闪灯那段在哪里?

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

  3.   /* Checks whether the TIM interrupt has occurred */
  4.   if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
  5.   {
  6.     TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
  7.     if( LED_Toggle == 3)
  8.     {
  9.       /* LED3 Orange toggling */
  10.       STM_EVAL_LEDToggle(LED3);
  11.       STM_EVAL_LEDOff(LED6);
  12.       STM_EVAL_LEDOff(LED4);
  13.     }
  14.     else if( LED_Toggle == 4)
  15.     {
  16.       /* LED4 Green toggling */
  17.       STM_EVAL_LEDToggle(LED4);
  18.       STM_EVAL_LEDOff(LED6);
  19.       STM_EVAL_LEDOff(LED3);
  20.     }
  21.     else if( LED_Toggle == 6)
  22.     {
  23.       /* LED6 Blue toggling */
  24.       STM_EVAL_LEDOff(LED3);
  25.       STM_EVAL_LEDOff(LED4);
  26.       STM_EVAL_LEDToggle(LED6);
  27.     }
  28.     else if (LED_Toggle ==0)
  29.     {
  30.       /* LED6 Blue On to signal Pause */
  31.       STM_EVAL_LEDOn(LED6);
  32.     }
  33.     else if (LED_Toggle == 7)
  34.     {
  35.       /* LED4 toggling with frequency = 439.4 Hz */
  36.       STM_EVAL_LEDOff(LED3);
  37.       STM_EVAL_LEDOff(LED4);
  38.       STM_EVAL_LEDOff(LED5);
  39.       STM_EVAL_LEDOff(LED6);
  40.     }
  41.     capture = TIM_GetCapture1(TIM4);
  42.     TIM_SetCompare1(TIM4, capture + CCR_Val);
  43.   }
  44. }
 楼主| fxk416532131 发表于 2013-12-25 13:07 | 显示全部楼层
lanseshuijing 发表于 2013-12-24 20:17
33.  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

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

就是设置的定时中断啊,然后在中断里,反转小灯闪烁。周期只能是 65535,换做别的就不正常闪烁了。。
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 很给力!

查看全部评分

 楼主| fxk416532131 发表于 2013-12-25 14:21 | 显示全部楼层
jjjkkk00 发表于 2013-12-25 13:48
看到你的中断函数就发现了问题!
capture = TIM_GetCapture1(TIM4);
TIM_SetCompare1(TIM4, capture + CCR ...

嗯 没问题了,之前一直在找初始化问题,没注意中断里面。 谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部