硬汉嵌入式论坛

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

[技术讨论] 【STM32F407定时器时钟与ARR-CNT寄存器访问】【这辈子没有遇见过这么无语的事情】硬汉代码里的一个小问题

[复制链接]

5

主题

24

回帖

39

积分

新手上路

积分
39
发表于 2022-6-7 09:32:19 | 显示全部楼层 |阅读模式
本帖最后由 winddevil 于 2022-6-7 09:36 编辑

硬汉的bsp_tim_pwm.c里边除了PWM还提供了一个他自己写的接口,叫做bsp_SetTIMforInt,可以任意启动一个定时器并且开始中断用以完成定时任务。里边也提供了bsp_RCC_TIM_Enable和bsp_RCC_TIM_Disable,在PWM模式用于开关PWM非常的好用。但是对于这个bsp_SetTIMforInt来说,从我的调试过程中,直接开关时钟来开关TIM是非常危险的,尤其是每次开关都重新把TIMx->CNT清零的情况。由于未知的原因,关掉时钟之后就算是MDK调试的Watch窗口里读取到的ARR和CNT两个寄存器的值都会是0,而且从现象来看,确实会一直卡死在中断服务函数里边。这个原因希望硬汉看到之后也思考一下。
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2022-6-7 09:41:20 | 显示全部楼层
我个人的解决方式很简单,就是TIMx->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN));/HCSR04_TIM->CR1 |= TIM_CR1_CEN;,直接访问CR1的CEN位更改使能情况,而不断开时钟。喜欢使用HAL库的朋友可以调用__HAL_TIM_ENABLE和__HAL_TIM_DISABLE这两个宏,实现上有小小的不一样,多了几个判断。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2022-6-7 09:55:51 | 显示全部楼层
bsp_RCC_TIM_Enable和bsp_RCC_TIM_Disable这两个函数不是开关定时器中断函数bsp_SetTIMforInt用的。他们仅仅是为了方便我们选择TIM使用的那个定时器API使用的。

我们没有提供关闭功能。
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2022-6-8 12:49:58 | 显示全部楼层
eric2013 发表于 2022-6-7 09:55
bsp_RCC_TIM_Enable和bsp_RCC_TIM_Disable这两个函数不是开关定时器中断函数bsp_SetTIMforInt用的。他们仅 ...

原来是这样
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2022-6-8 12:51:47 | 显示全部楼层
eric2013 发表于 2022-6-7 09:55
bsp_RCC_TIM_Enable和bsp_RCC_TIM_Disable这两个函数不是开关定时器中断函数bsp_SetTIMforInt用的。他们仅 ...

他这个时钟断开之后再访问ARR和CNT都会变成0就非常奇怪哈哈哈
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2022-6-9 08:40:06 | 显示全部楼层
winddevil 发表于 2022-6-8 12:51
他这个时钟断开之后再访问ARR和CNT都会变成0就非常奇怪哈哈哈

这就是定时器硬件外设的工作机制问题了。
回复

使用道具 举报

210

主题

1041

回帖

1681

积分

至尊会员

More we do, more we can do.

积分
1681
发表于 2022-6-11 23:09:47 | 显示全部楼层
直接开关时钟来开关TIM是非常危险的


楼主这么说的依据是什么?这种用法很常见,比如低功耗时,关闭外设时钟。
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2022-6-12 00:39:14 | 显示全部楼层
emwin 发表于 2022-6-11 23:09
楼主这么说的依据是什么?这种用法很常见,比如低功耗时,关闭外设时钟。

我的依据是我看到ARR寄存器这时候访问到的结果已经是0了,你觉得很常见的情形和我需要的情形不同啊,我希望直接通过关闭时钟关闭定时器,而实际上你只关时钟会卡中断,低功耗模式是你用的32的吧,你难道一个个去关时钟吗,他那个好像是从总线矩阵直接给你掐断时钟
回复

使用道具 举报

332

主题

2031

回帖

3032

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3032
发表于 2022-6-21 09:41:51 | 显示全部楼层
你的语句很长,没看懂你的意思?? 关时钟,会直接进入定时器中断吗??
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2022-6-24 01:14:58 | 显示全部楼层
caicaptain2 发表于 2022-6-21 09:41
你的语句很长,没看懂你的意思?? 关时钟,会直接进入定时器中断吗??

是的,进国测试是这样的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 08:04 , Processed in 0.180870 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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