OpenEdv-开源电子网

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

STM32的TIM3使用定时器中断初始化后立即进入中断

[复制链接]

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
发表于 2023-5-22 10:29:24 | 显示全部楼层 |阅读模式
1金钱
STM32的TIM3使用定时器中断,初始化后使用一次中断然后关闭定时器后可以再次初始化吗?两次初始化的值可以不同吗?现在在程序中使用一次定时器中断后关闭了定时器,然后对定时器重新进行了初始化,但是初始化后立马进入的定时器中断

最佳答案

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

为什么要重新初始化呢?如果修改频率的话,直接修改分频系数和重载值就好了啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6698

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12692
金钱
12692
注册时间
2012-11-26
在线时间
3711 小时
发表于 2023-5-22 10:29:25 | 显示全部楼层
为什么要重新初始化呢?如果修改频率的话,直接修改分频系数和重载值就好了啊
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2023-5-22 10:43:54 来自手机 | 显示全部楼层
本帖最后由 苏九思 于 2023-5-22 10:44 编辑
我是先TIM_Cmd(TIM3, DISABLE);    然后   
        TIM_TimeBaseStructure.TIM_Period = arr;         
        TIM_TimeBaseStructure.TIM_Prescaler =psc;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);可以吗
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2023-5-22 11:06:10 | 显示全部楼层
可以,在使能定时器前建议先清除中断标志
回复

使用道具 举报

70

主题

6698

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12692
金钱
12692
注册时间
2012-11-26
在线时间
3711 小时
发表于 2023-5-22 11:11:32 | 显示全部楼层
苏九思 发表于 2023-5-22 10:43
我是先TIM_Cmd(TIM3, DISABLE);    然后   
        TIM_TimeBaseStructure.TIM_Period = arr;         
...

不需要啊   直接修改寄存器的值   可以参考下原子的示例代码
学无止境
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2023-5-22 11:14:45 | 显示全部楼层
阿侑kevin 发表于 2023-5-22 11:06
可以,在使能定时器前建议先清除中断标志

这样用出现了使能后立马进入中断的情况,如果使能前清除中断标志出现不在进入中断的情况
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2023-5-22 11:17:10 | 显示全部楼层
阿侑kevin 发表于 2023-5-22 11:06
可以,在使能定时器前建议先清除中断标志

不好意思,我再试试,好像可以了
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2023-5-22 11:30:57 来自手机 | 显示全部楼层

TIM3->ARR=arr;          //趨//1ms   
TIM3->PSC=psc;          //7200,10Khz
是这样直接操作寄存器吗

回复

使用道具 举报

28

主题

360

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2021-2-4
在线时间
146 小时
发表于 2023-5-22 11:48:14 | 显示全部楼层
苏九思 发表于 2023-5-22 11:30
TIM3->ARR=arr;          //趨//1ms   
TIM3->PSC=psc;          //7200,10Khz
是这样直接操作寄存器 ...

对的。你是做步进电机的加减速吧?
初始化后立马进中断正常的。所以要清除一下标志位
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2023-5-22 13:51:14 来自手机 | 显示全部楼层


不是,是做别的
我的TIM_Cmd(TIM3, DISABLE);
是放在定时器中断中的,打断点调试的时候发现定时器关断后会再进入一次中断,有遇到过这种情况吗
回复

使用道具 举报

28

主题

360

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2021-2-4
在线时间
146 小时
发表于 2023-5-22 13:59:20 | 显示全部楼层
苏九思 发表于 2023-5-22 13:51
不是,是做别的
我的TIM_Cmd(TIM3, DISABLE);
是放在定时器中断中的,打断点调试的时候发现定时器关 ...

关闭后还会进一次中断有没有遇到过那没太注意,
我是遇到过开定时器立马进中断。
然后我开关定时器都会加上清除中断标志位的语句
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2023-5-22 14:05:52 来自手机 | 显示全部楼层
本帖最后由 苏九思 于 2023-5-22 14:08 编辑

我只在初始化的时候加上了清除中断语句,使能和关闭没有加
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2023-5-22 14:33:26 来自手机 | 显示全部楼层
我使用的定时器中断的时候,定时器不是一直处于开启状态, 而且关闭时候是在中断里关闭。

void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{

TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//要处理的事件内容。。。。

TIM_Cmd(TIM3, DISABLE); //失能(函数外使能)

}
}
看似没错,而且也看似正常。但是,处理的事件内容出现了很多未知错误,无法正常执行。通过后来的调试中发现,发现是:TIM_Cmd(TIM3, DISABLE); 扰乱了时序关系。当失能后,其实中断并没有真正失能,还会再进入一次中断,因此事件又被执行了一次,在失能前面加了句清除中断标志位,或将清除中断标志位语句放到最后都可解决重入问题
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
//要处理的事件内容。。。。

TIM_Cmd(TIM3, DISABLE); //失能(函数外使能)
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
回复

使用道具 举报

28

主题

360

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2021-2-4
在线时间
146 小时
发表于 2023-5-22 14:39:31 | 显示全部楼层
苏九思 发表于 2023-5-22 14:05
我只在初始化的时候加上了清除中断语句,使能和关闭没有加

那就加上去吧
这种可以自己试试的
我之前就是有问题然后我就到处加了一遍
回复

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
 楼主| 发表于 2023-5-22 14:54:25 来自手机 | 显示全部楼层
本帖最后由 苏九思 于 2023-5-22 14:57 编辑
确实是这样,使能和关闭前后必须加一个清除中断标志位语句,否则就会出现要么使能后直接进入中断当中,要么会出现关闭定时器后直接再进入一次中断
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 08:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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