硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5348|回复: 11
收起左侧

[STM32CubeF4] HAL库的定时器使用问题

[复制链接]

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2019-8-9 12:08:40 | 显示全部楼层 |阅读模式
初始化定时器后,似乎定时器并没有开始计数?
使用了HAL_TIM_Base_Start_IT(&htim4);后,定时器开始计数,并且有中断产生。

为了在TIM4中断发生一次后,停止定时器,回调函数中使用了   HAL_TIM_Base_Stop_IT(&htim4); 但是,tim4的中断还是会不断的进入,为什么呢?
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */
  if (htim->Instance == TIM4) {
   HAL_TIM_Base_Stop_IT(&htim4);
  }
  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM11) {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */
  /* USER CODE END Callback 1 */
}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2019-8-9 12:16:56 | 显示全部楼层
1、查看下成功进入了没。
2、这个函数 HAL_TIM_Base_Stop_IT也比较简单明了,应该关闭了才对,不行就直接寄存器关闭下试试
这个函数里面也没有锁状态什么的。
HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim)
{
  /* Check the parameters */
  assert_param(IS_TIM_INSTANCE(htim->Instance));
  /* Disable the TIM Update interrupt */
  __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE);

  /* Disable the Peripheral */
  __HAL_TIM_DISABLE(htim);

  /* Return function status */
  return HAL_OK;
}

回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2019-8-9 12:22:02 | 显示全部楼层
DEBUG一下,看下寄存器配置,这个应该好定位
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2019-8-9 16:45:23 | 显示全部楼层
eric2013 发表于 2019-8-9 12:16
1、查看下成功进入了没。
2、这个函数 HAL_TIM_Base_Stop_IT也比较简单明了,应该关闭了才对,不行就直接 ...

这个callback函数,还有什么情况下会进入?
由于HAL开始定时器的时候,HAL_TIM_Base_Start_IT()打开了全部的定时器中断。也可能时别的中断导致进入这个callback?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2019-8-9 17:42:18 | 显示全部楼层
caicaptain2 发表于 2019-8-9 16:45
这个callback函数,还有什么情况下会进入?
由于HAL开始定时器的时候,HAL_TIM_Base_Start_IT()[/back ...

就这一个地方,其它是在定时器DMA里面了
QQ截图20190809174124.jpg
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2019-8-10 12:18:34 | 显示全部楼层
eric2013 发表于 2019-8-9 17:42
就这一个地方,其它是在定时器DMA里面了

还有一个猜想,我用mdk的debug调试,断点就设在这个函数里面。
会不会是,第一次执行到此断点,程序停住了,但是定时器还在运行,中断还在累积。。。??
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2019-8-10 12:22:32 | 显示全部楼层
caicaptain2 发表于 2019-8-10 12:18
还有一个猜想,我用mdk的debug调试,断点就设在这个函数里面。
会不会是,第一次执行到此断点,程序停住 ...

可以在中断里面加个IO翻转试试。

先别用调试。

下周我用F4的做个你这种方式的试试、正常应该没问题的。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2019-8-10 16:04:05 | 显示全部楼层
eric2013 发表于 2019-8-10 12:22
可以在中断里面加个IO翻转试试。

先别用调试。

感谢!
再问一个问题,在定时器正常计数运行的时候,能不能把它的计数值直接赋值为0?
HAL库中,应该用哪个函数?

回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2019-8-10 16:09:49 | 显示全部楼层
本帖最后由 caicaptain2 于 2019-8-10 16:22 编辑
eric2013 发表于 2019-8-10 12:22
可以在中断里面加个IO翻转试试。

先别用调试。

在百度中找到一个类似的问题,解决方案很特别!
https://blog.csdn.net/ludaoyi88/article/details/51934122
“中断函数中执行TIM_Cmd(TIM3, DISABLE);  扰乱了时序关系。当失能后,其实中断并没有真正失能,还会再进入一次中断,因此事件又被执行了一次,对于时序比较严格的事件,就产生了问题!”

但是,“如果把关闭定时器放到了主函数后,不用再清中断标志位。能正常把定时器关闭,并不会进入中断。”

还有一个帖子,也是这个类似问题,估计算定时器函数的细节问题了:  https://blog.csdn.net/qq_41976419/article/details/82455405

简直让人惊诧不已! 我周一工作的时候再试试看了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2019-8-10 17:17:33 | 显示全部楼层
caicaptain2 发表于 2019-8-10 16:09
在百度中找到一个类似的问题,解决方案很特别!
https://blog.csdn.net/ludaoyi88/article/details/5193 ...

换成我们的bsp_timer.C文件里面的单次定时器模式吧,比较好用,我做了个F的HAL版本。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2019-8-10 17:40:51 | 显示全部楼层
eric2013 发表于 2019-8-9 17:42
就这一个地方,其它是在定时器DMA里面了

刚刚发现了一个问题,这个hal库思路有点清奇。。。
你这个图中,__HAL_TIM_CLEAR_IT()函数是禁止了update中断。全程没有清除中断标志!!
定时器清除中断标志需要手动操作,使用__HAL_TIM_CLEAR_FLAG(),然而,整个回调函数中没有执行这个函数。。。。所以,我第二次打开定时器的时候,啥都没有干,就直接进入中断了。

对比串口的中断函数就不一样了。串口读取数据后就自动清除了中断标志,无需手动。。






回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2019-8-22 09:57:21 | 显示全部楼层
caicaptain2 发表于 2019-8-10 17:40
刚刚发现了一个问题,这个hal库思路有点清奇。。。
你这个图中,__HAL_TIM_CLEAR_IT()函数是禁止了updat ...

应该是这个问题
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 01:24 , Processed in 0.194170 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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