OpenEdv-开源电子网

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

定时器中断回调函数HAL_TIM_PeriodElapsedCallback的问题

[复制链接]

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
发表于 2020-12-17 16:24:01 | 显示全部楼层 |阅读模式
15金钱
本帖最后由 lyy26655 于 2021-1-28 09:46 编辑
   又是本萌新,想请问下各位大佬,查了相关资料都有点语焉不详,现在F103设定的TIM3一秒进一次中断,然后 if(HAL_TIM_Base_Start_IT(&htim3)!=HAL_OK)
                                                  {
                                                      while(1);
                                                  }


但是while(1)里面的代码好像并没有执行,是因为1s太短了吗?但如果不这么写就会一直执行while(1)里的代码,没有必要这么频繁查询传感器数据

上面这个已解决
然后一直没完全确定一个答案,定时器每进一次中断应该就会触发一次HAL_TIM_PeriodElapsedCallback,那触发之后HAL_TIM_PeriodElapsedCallback是不是必须完全执行完才能执行下一次定时器中断?我在网上查的是定时器中断不会等待HAL_TIM_PeriodElapsedCallback执行完,但我现在的代码是这样的:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
         if(htim->Instrance == htim3.Instrance)
      {
         static uint16_t i=0;
         static uint16_t j=0;



        i++;
        if(i>10)/*相当于就是11s执行一次*/
        {
           i=0;
           dosomethingAAA;
        }

        j++;
        if(j>15)
        {
           j=0;
           dosomethingBBB;
           dosomethingCCC;
        }


       }

那如果我的代码是这样的,定时器中断又是1s一次,这里面的执行关系是怎么样的呢?

(1)同时这里想问下,为什么写成
        if(i==10)
        {
           i=0;
           dosomething;        }


dosomething就不执行呢?感觉没写错呀

(2)如果           dosomethingBBB;
                          dosomethingCCC;
代表用同一个串口发送信息,两个函数之间执行没有延时,它就不会执行,但回调函数里面肯定是不能加延时的,但写成这样它也不执行,我要疯了@@

j++;
        if(j>15)
        {

           dosomethingBBB;
           if(j>17)
        {
           j=0;
           dosomethingCCC;
        }
        }



如果各位大神有好的思路也可以说一下,非常感谢!






最佳答案

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

设几个全局变量作为标志位,定时器中断判断设置标志,主程序根据标志位处理,这种方式好一点,不要在中断里做过多的事情。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3874
金钱
3874
注册时间
2017-3-7
在线时间
1690 小时
发表于 2020-12-17 16:24:02 | 显示全部楼层
设几个全局变量作为标志位,定时器中断判断设置标志,主程序根据标志位处理,这种方式好一点,不要在中断里做过多的事情。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-12-18 01:31:28 | 显示全部楼层
仿真找问题,啥都明白了
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-18 09:07:07 | 显示全部楼层
有没有大佬稍加指点一下的
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-18 14:57:25 | 显示全部楼层
a5820736 发表于 2020-12-18 08:57
设几个全局变量作为标志位,定时器中断判断设置标志,主程序根据标志位处理,这种方式好一点,不要在中断里 ...

非常感谢您。
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-18 15:01:40 | 显示全部楼层
a5820736 发表于 2020-12-18 08:57
设几个全局变量作为标志位,定时器中断判断设置标志,主程序根据标志位处理,这种方式好一点,不要在中断里 ...

如果用设标志位方法的话,就回到了第一个问题

现在F103设定的TIM3一秒进一次中断,然后
if(HAL_TIM_Base_Start_IT(&htim3)!=HAL_OK)
                                                  {
                                                      while(1);
                                                  }

但是while(1)里面的代码好像并没有执行,是因为1s太短了吗?
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3874
金钱
3874
注册时间
2017-3-7
在线时间
1690 小时
发表于 2020-12-18 16:33:13 | 显示全部楼层
lyy26655 发表于 2020-12-18 15:01
如果用设标志位方法的话,就回到了第一个问题

这个函数是初始化的时候调用的吗?
你看它的判断条件,定时器开启失败才会进去执行,所以正常情况进不去是对的啊?
所以不知道你这个问题何在?
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2020-12-21 11:40:18 | 显示全部楼层
每次进中断都重新初始化i和j=0
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-24 09:11:37 | 显示全部楼层
ricefat 发表于 2020-12-21 11:40
每次进中断都重新初始化i和j=0

谢谢您!
回复

使用道具 举报

0

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2020-5-19
在线时间
76 小时
发表于 2020-12-28 11:19:05 | 显示全部楼层
ricefat 发表于 2020-12-21 11:40
每次进中断都重新初始化i和j=0

静态局部变量跳出函数后再次进入不会重新初始化为0,静态局部变量存储区域是静态区。局部变量存储在栈中,所以退出函数后局部变量内存就被释放了。
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2021-1-1 21:48:15 | 显示全部楼层
鲁班7号 发表于 2020-12-28 11:19
静态局部变量跳出函数后再次进入不会重新初始化为0,静态局部变量存储区域是静态区。局部变量存储在栈中 ...

他的代码里面每次进中断都会重新初始化那两个静态变量为0
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 10:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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