OpenEdv-开源电子网

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

定时器中断

[复制链接]

12

主题

25

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-3-25
在线时间
35 小时
发表于 2017-7-3 13:33:49 | 显示全部楼层 |阅读模式
9金钱
我在405的一个板子上用了TIM4,然后希望能用串口去控制TIM4的定时时间,也就是希望可以按需要更改TIM4中的htim4.Init.Period。可是我发现我在中断里如果用了两次定时器的初始化的话,好像会出现冲突,定时器的时钟频率为72MHz,预分频为7199:void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{

if(htim==&htim4)  
        {
//        HAL_TIM_Base_Stop_IT(&htim4);
//                HAL_TIM_Base_Stop_IT(&htim4);
//    HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_5);
//                HAL_TIM_Base_Start_IT(&htim4);
                if(flag_time==1)
                {
                                flag_time=2;
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);
      MX_timer4_Init(29999);
                  HAL_TIM_Base_Start_IT(&htim4);       
                }
                        else if(flag_time==2)
                        {
                                flag_time=1;
                                HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET);
                                MX_timer4_Init(59999);
                    HAL_TIM_Base_Start_IT(&htim4);
                        }
        }


}
MX_timer4_Init(59999);这个是我改的初始化TIM4的一个函数,想用这个来改变Period的值:
void MX_timer4_Init(uint32_t x)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  htim4.Instance = TIM4;
  htim4.Init.Prescaler = 7199;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = x;
  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__);
  }
}

这样的程序下,定时器并不能按我想的进入3000ms和6000ms的中断。Debug看了下,好像一直在进中断,并没有按3000ms,6000ms这样定时,然后进中断。就像图2、3,设置断点后,程序跑完第一个if里的 MX_timer4_Init(29999);直接就蹦到第二个if里的 MX_timer4_Init(59999);了。这是为什么?
这是一个问题,另一个问题是,Period寄存器是不是16位的,那就是只能计数到65535?,如果不改变prescaler的值和CKD的值,是不是就只能定时到6553ms这么长时间?如图1.

tim1.png
图2.png
图3.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-7-4 01:26:26 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 20:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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