你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f051的TIM1的更新中断不正确的问题???

[复制链接]
你好我好大家好! 提问时间:2015-8-3 10:56 /
    想看看在TIM1的重复计数器等于0的情况下,更新中断是在计数器上溢时发生,还是在下溢时发生 。就配置了下面的代码,在更新中断里面反转PD2引脚电平,与通道一输出的pwm波比较,用于指示更新中断产生的时刻,结果测量波形显示,在每一个计数周期中产生好几次更细中断,不知道这是为什么???求大神帮忙啊
  1. int main(void)
  2. {
  3.     /* TIM Configuration */
  4.   TIM_Config();

  5.   /* Infinite loop */
  6.   while (1)
  7.   {
  8.   }
  9. }

  10. /**
  11.   * @brief  Configure the TIM1 Pins.
  12.   * @param  None
  13.   * @retval None
  14.   */
  15. static void TIM_Config(void)
  16. {
  17.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  18.   TIM_OCInitTypeDef  TIM_OCInitStructure;
  19.   GPIO_InitTypeDef GPIO_InitStructure;
  20.   NVIC_InitTypeDef NVIC_InitStructure;
  21.   /* GPIOA, GPIOB and GPIOE Clocks enable */
  22.   RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOD, ENABLE);
  23.   
  24.   /* GPIOA Configuration: Channel 1, as alternate function push-pull */
  25.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;
  26.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  27.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  28.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  29.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
  30.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  31.   
  32.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);
  33.    
  34.          /*·´×ªÒý½Å*/
  35.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  36.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  37.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  38.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  39.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
  40.   GPIO_Init(GPIOD, &GPIO_InitStructure);
  41.   
  42.   /* Compute the value to be set in ARR regiter to generate signal frequency at 17.57 Khz */
  43.   TimerPeriod = (SystemCoreClock / 17570 ) - 1;
  44.   /* Compute CCR1 value to generate a duty cycle at 50% for channel 1 and 1N */
  45.   Channel1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);

  46.   /* TIM1 clock enable */
  47.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
  48.   
  49.   /* Time Base configuration */
  50.   TIM_TimeBaseStructure.TIM_Prescaler = 0;
  51.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned3;
  52.   TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
  53.   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  54.   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  55.   TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  56.   /* Channel 1, 2,3 and 4 Configuration in PWM mode */
  57.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  58.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  59.   TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  60.   TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;
  61.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  62.   TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  63.   TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  64.   TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

  65.   TIM_OC1Init(TIM1, &TIM_OCInitStructure);

  66.   TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
  67.         
  68.   /* TIM1 counter enable */
  69.   TIM_Cmd(TIM1, ENABLE);

  70.   /* TIM1 Main Output Enable */
  71.   TIM_CtrlPWMOutputs(TIM1, ENABLE);
  72.         
  73.           /* Enable the TIM1 Trigger and commutation interrupt */
  74.   NVIC_InitStructure.NVIC_IRQChannel = TIM1_BRK_UP_TRG_COM_IRQn;
  75.   NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  76.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  77.   NVIC_Init(&NVIC_InitStructure);
  78. }






  79.   */
  80. void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
  81. {
  82.         if(TIM_GetITStatus(TIM1,TIM_IT_Update))
  83.           {
  84.                         GPIOD->ODR ^=GPIO_Pin_2;
  85.     }
  86. }
复制代码

QQ截图20150803105653.png
收藏 评论4 发布时间:2015-8-3 10:56

举报

4个回答
你好我好大家好! 回答时间:2015-8-4 11:20:54
自己已解决:问题出现在进入更新中断后,没有清除硬件中断标志,这样的话单片机内核以为一直有更行中断的产生,所以就会一直执行更新中断子程序,出现上述现象。在中断子函数中if语句内部加上一句:                        TIM_ClearITPendingBit(TIM1,TIM_IT_Update);,问题就解决了!
你好我好大家好! 回答时间:2015-8-4 09:11:52
自己帮自己顶起,论坛里就没有高手遇到过这样的问题吗
左岸右岸 回答时间:2015-8-4 10:15:36
帮顶
yanhaijian 回答时间:2015-8-4 13:47:07
帮顶,。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版