请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

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

[技术讨论] 定时器中断回调函数读取全局变量的问题!求助

[复制链接]

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2023-5-14 16:07:26 | 显示全部楼层 |阅读模式
本帖最后由 Conice 于 2023-5-14 16:14 编辑

配置:设置了两个定时器TIM1和TIM4更新中断函数,一个频率4kHz,另一个是180kHz,并定义了一个全局变量flag。在4kHz这个定时器更新中断回调函数中,对flag进行操作,进入一次中断变为0,再进入一次变为1,如此循环;180kHz这个定时器更新中断回调函数读取flag进行判断操作。这两个定时器我配置了主从模式,可以同步触发。

问题:按理说180kHz定时器更新中断回调函数进入45次,就应该进入一次4kHz定时器更新中断回调函数,从而flag变化一次。但是,我在对180kHz这个定时器更新中断回调函数进行断点调试的时候,进入了很多次中断,为什么flag一直不变。我在两个中断回调函数中各自定义了一个累加的全局变量,来读取进入中断的次数,45倍的关系能对上,说明两个定时器进入中断的次数没问题。但是为什么flag在180kHz这个定时器更新中断回调函数一直不变?找不到原因。我在flag前面加了volatile这个也不行,请大神指点。万分感谢
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2023-5-15 09:02:22 | 显示全部楼层
硬汉哥,能帮答疑一下吗
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2023-5-15 10:10:08 | 显示全部楼层
你应该debug一下,为啥进入中断flag没有0和1不断变化,是不是01变化的逻辑有问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
发表于 2023-5-15 11:49:15 | 显示全部楼层
临时对变量前后加个开关中断,是否还有问题,还有问题就应该是你的程序问题了。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2023-5-16 08:06:40 | 显示全部楼层
eric2013 发表于 2023-5-15 11:49
临时对变量前后加个开关中断,是否还有问题,还有问题就应该是你的程序问题了。

是这样操作的吗?
// 全局变量
int globalVariable = 0;

// 中断控制器开关变量
volatile int interruptEnabled = 1;

void TIM_IRQHandler(void)
{
    // 禁用中断
    __disable_irq();
   
    // 临时开关中断
    if (interruptEnabled)
    {
        // 读取全局变量
        int temp = globalVariable;
        
        // 处理全局变量
        // ...
        
        // 修改全局变量
        globalVariable = temp + 1;
    }
   
    // 启用中断
    __enable_irq();
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
发表于 2023-5-17 11:24:41 | 显示全部楼层
Conice 发表于 2023-5-16 08:06
是这样操作的吗?
// 全局变量
int globalVariable = 0;

可以的,你试试效果。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 02:39 , Processed in 0.169459 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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