OpenEdv-开源电子网

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

求助,两个定时器,进不了主程序一直在定时器中断里?

[复制链接]

27

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2015-4-25
在线时间
70 小时
发表于 2018-12-2 21:05:06 | 显示全部楼层 |阅读模式
66金钱
本帖最后由 kinshen 于 2018-12-2 21:53 编辑

有2个定时器,TIM2做10ms定时中断,在中断里做模式控制,另外一个中断是TIM5捕获中断,测量外部脉冲的频率。

TIM2单独工作的时候,没有问题!

加上TIM5的时候,会出现程序进不来主程序的情况!但是这个时候不固定,有的时候很快就跑飞,有的时候时间长点才跑飞!

TIM2和TIM5的配置如图(代码粘贴后注释是乱码,所以截图了)?

请帮忙分析下是什么原因!谢谢了!


TIM截图20181202210307.png
TIM截图20181202210352.png
TIM截图20181202215022.png
TIM截图20181202215243.png
TIM截图20181202215251.png

最佳答案

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

楼主,尽量别把应用级别的代码放在中断处理函数里面执行,因为每进入一次中断相关数据会被压栈的,如果中断处理函数执行的时间过长,可能会导致栈还没有释放下一次中断又到来了,结果导致又有数据被压栈了,那么这样循环下去,栈就会被压爆的,这个时候系统就死机了,也就是程序跑飞了。仅供参考,谢谢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2018-5-8
在线时间
22 小时
发表于 2018-12-2 21:05:07 | 显示全部楼层
楼主,尽量别把应用级别的代码放在中断处理函数里面执行,因为每进入一次中断相关数据会被压栈的,如果中断处理函数执行的时间过长,可能会导致栈还没有释放下一次中断又到来了,结果导致又有数据被压栈了,那么这样循环下去,栈就会被压爆的,这个时候系统就死机了,也就是程序跑飞了。仅供参考,谢谢
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-12-2 21:47:46 | 显示全部楼层
看着没啥问题,再上传两个中断函数吧
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-12-2 22:10:01 | 显示全部楼层
首先定时器2中断看着有点乱,有点长没法看   sensor_read()这个函数不知道啥情况,内部没延时,while()之类的,不过你这两个中断也不抢占应该没啥问题,有while()之类做好出错退出处理没
回复

使用道具 举报

27

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2015-4-25
在线时间
70 小时
 楼主| 发表于 2018-12-2 22:24:37 | 显示全部楼层
275891381 发表于 2018-12-2 22:10
首先定时器2中断看着有点乱,有点长没法看   sensor_read()这个函数不知道啥情况,内部没延时,while()之类 ...

没有延时,感觉是抢占的时候出问题了,但是不知道确切的原因,想找出来。跑飞后,主程序进不去,两个定时器中断一直在运行
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-12-2 22:32:12 | 显示全部楼层
kinshen 发表于 2018-12-2 22:24
没有延时,感觉是抢占的时候出问题了,但是不知道确切的原因,想找出来。跑飞后,主程序进不去,两个定时 ...

优先级一样哪有抢占,这个中断不执行完,不会去别的中断   尽量简化中断内函数把
回复

使用道具 举报

27

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2015-4-25
在线时间
70 小时
 楼主| 发表于 2018-12-2 23:10:33 | 显示全部楼层
275891381 发表于 2018-12-2 22:32
优先级一样哪有抢占,这个中断不执行完,不会去别的中断   尽量简化中断内函数把

因为之前设置了抢占,出了问题,现在初始化没有抢占了,也还是出问题。。。
回复

使用道具 举报

27

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2015-4-25
在线时间
70 小时
 楼主| 发表于 2018-12-3 22:14:09 | 显示全部楼层
尹林 发表于 2018-12-3 17:27
楼主,尽量别把应用级别的代码放在中断处理函数里面执行,因为每进入一次中断相关数据会被压栈的,如果中断 ...

谢谢,请问怎么能知道是堆栈出问题了?有没有什么方法来查看原因?
回复

使用道具 举报

27

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2015-4-25
在线时间
70 小时
 楼主| 发表于 2018-12-3 22:17:47 | 显示全部楼层
尹林 发表于 2018-12-3 17:27
楼主,尽量别把应用级别的代码放在中断处理函数里面执行,因为每进入一次中断相关数据会被压栈的,如果中断 ...

还有一个,如果只有一个中断的话没有重启的问题,2个的话就会出现,这个怎么分析?
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-12-3 22:43:54 | 显示全部楼层
楼上几位说得对,
TIM2的中断服务程序太长了,没有必要。
不就是每10ms执行一次按键扫描并进行模式判断和控制吗?
完全可以修改为:TIM2中只置10ms时间到的标志,然后在主循环中查询这个标志并执行这一大段程序。
当然,前提条件是你的主循环并不复杂,执行一遍主循环的时间不能太长。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

3

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2018-5-8
在线时间
22 小时
发表于 2018-12-4 14:20:27 | 显示全部楼层
kinshen 发表于 2018-12-3 22:17
还有一个,如果只有一个中断的话没有重启的问题,2个的话就会出现,这个怎么分析?

楼主,建议你看看ST提供的文档“Cortex-M3 User Guide.pdf”,这份文档讲解了cortex-m3内核运行相关的一些东西。楼主你可以试一试只开一个定时器,中断时间微妙级别吧,然后再在启动代码里面把堆栈的大小减小(启动代码是汇编写的),最后再在中断服务函数里面运行大量的代码,这样就可以看到死机效果了。就是开一个定时器也会死机。谢谢
回复

使用道具 举报

27

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2015-4-25
在线时间
70 小时
 楼主| 发表于 2018-12-4 22:08:10 | 显示全部楼层
尹林 发表于 2018-12-4 14:20
楼主,建议你看看ST提供的文档“Cortex-M3 User Guide.pdf”,这份文档讲解了cortex-m3内核运行相关的一 ...

好的,谢谢,我来试试
回复

使用道具 举报

27

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2015-4-25
在线时间
70 小时
 楼主| 发表于 2018-12-5 22:30:46 | 显示全部楼层
尹林 发表于 2018-12-4 14:20
楼主,建议你看看ST提供的文档“Cortex-M3 User Guide.pdf”,这份文档讲解了cortex-m3内核运行相关的一 ...

你好,请问,如果我只用一个定时器,中断里面程序还是比较多(执行时间只有1ms多点),定时器中断是10ms一次,而且我把堆栈调的比较大(0x2000),这样的话是不是可以避免堆栈的“压爆”问题?谢谢!
回复

使用道具 举报

27

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2015-4-25
在线时间
70 小时
 楼主| 发表于 2018-12-8 17:36:33 | 显示全部楼层
问题貌似解决了,在timer2的10ms定时中断中调用了AD采集函数,自己写了给多次采集取平均值的函数,在函数中调用了延时函数,代码如下,
u16 Get_Adc_Average(u8 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        u16 k;
        u16 min,max;
        for(t=0;t<times;t++)
        {
                temp_val+=Get_Adc(ch);
                for(k=0;k<200;k++);
//                delay_us(100);
        }
        return temp_val/times;
}          

发现:如果用delay_us(10)函数,程序就会出问题(主程序执行不了,一直运行定时器中断程序);如果吧延时时间调的大些,比如delay_us(100)就没关系。

好像频繁采集AD数据造成了影响?

不知道这样是什么原因呢?哪位高手帮忙分析一下!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-9 02:24:44 | 显示全部楼层
kinshen 发表于 2018-12-8 17:36
问题貌似解决了,在timer2的10ms定时中断中调用了AD采集函数,自己写了给多次采集取平均值的函数,在函数中 ...

放main函数里面试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

27

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2015-4-25
在线时间
70 小时
 楼主| 发表于 2018-12-9 08:36:34 | 显示全部楼层
本帖最后由 kinshen 于 2018-12-9 16:59 编辑
正点原子 发表于 2018-12-9 02:24
放main函数里面试试

放main函数里面也是一样的。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-10 01:42:14 | 显示全部楼层
kinshen 发表于 2018-12-9 08:36
放main函数里面也是一样的。。。

仿真看看
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

36

主题

227

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3096
金钱
3096
注册时间
2016-4-15
在线时间
350 小时
发表于 2018-12-10 09:43:50 | 显示全部楼层
仿真器一步一步调试,然后定位到卡死的地方,然后再分析原因。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 23:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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