OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3658|回复: 2

定时器开启就进中断

[复制链接]

12

主题

25

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-3-25
在线时间
35 小时
发表于 2017-7-7 15:41:23 | 显示全部楼层 |阅读模式
8金钱
板子芯片是STM32F405ZGTx,我想在程序中可以随时更改定时器的设定值,所以在程序中会随时有定时器初始化,但是我发现定时器每次在初始化后开启时都会进一次中断。网上查了下也没有搞定,发帖求教。定时器的配置使用CubeMx配的,TIM时钟为36MHz。定时器初始化是我自己改的:void MX_timer4_Init(uint16_t x,uint16_t y)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  htim4.Instance = TIM4;
  htim4.Init.Prescaler = x;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = y;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}

因为可能需要定时时间比较长,所以给PSC和Period都做了赋值。最高就可以定时到119s。
定时器中断程序如下:
void TIM4_IRQHandler(void)
{               
        switch(flag_time[0])
                {       
                        case 1:               
            HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);
                        flag_time[0]=2;
                        if(time4[1]<=655)
                        {
            MX_timer4_Init(3599,time4[1]*100-1);
                  HAL_TIM_Base_Start_IT(&htim4);
                        break;
                        }
                        else if(time4[1]>655)
                        {
                        MX_timer4_Init(65535,time4[1]*360000/65535-1);
                  HAL_TIM_Base_Start_IT(&htim4);
                        break;
                        }
                        case 2:
                                flag_time[0]=1;
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET);
                        if(time4[2]<=655)
                        {
                        MX_timer4_Init(3599,time4[2]*100-1);
                        HAL_TIM_Base_Start_IT(&htim4);
                        break;
                        }
                        else if(time4[2]>655)
                        {
                        MX_timer4_Init(65535,time4[2]*360000/65535-1);
                        HAL_TIM_Base_Start_IT(&htim4);
                        break;
                        }
                        case 3:
                                flag_time[0]=0;
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET);
                        HAL_TIM_Base_Stop_IT(&htim4);
                                break;
                }
  HAL_TIM_IRQHandler(&htim4);
}

然后我发现每次用
MX_timer4_Init(65535,time4[2]*360000/65535-1);
                        HAL_TIM_Base_Start_IT(&htim4);
初始化然后开启定时器时都会进中断,而不是我希望的只有在溢出时才进中断,求教。

最佳答案

查看完整内容[请看2#楼]

这个问题我也遇到过,定时器初始化后,定时器已开启就会立刻进入“更新中断”,所以产生了定时器开始就进中断的现象。开启定时器前先清除更新中断就好了。__HAL_TIM_CLEAR_FLAG(huart->pstUart_Emul_Peripheral->htim, TIM_FLAG_UPDATE);希望对你有帮助。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-7-8
在线时间
1 小时
发表于 2017-7-7 15:41:24 | 显示全部楼层
这个问题我也遇到过,定时器初始化后,定时器已开启就会立刻进入“更新中断”,所以产生了定时器开始就进中断的现象。开启定时器前先清除更新中断就好了。__HAL_TIM_CLEAR_FLAG(huart->pstUart_Emul_Peripheral->htim, TIM_FLAG_UPDATE);希望对你有帮助。
回复

使用道具 举报

12

主题

25

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-3-25
在线时间
35 小时
 楼主| 发表于 2017-7-10 11:51:49 | 显示全部楼层
薛坤 发表于 2017-7-7 15:41
这个问题我也遇到过,定时器初始化后,定时器已开启就会立刻进入“更新中断”,所以产生了定时器开始就进中 ...

在网上找了一种方法,时在定时器初始化时给一个操作EGR寄存器,产生一个中断时间,然后清除更新标志位,暂时解决了,具体的过程还没有仔细研究。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-12-18 15:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表