[新品上市] 极海单片机定时器的问题

[复制链接]
1587|19
 楼主| 比神乐 发表于 2023-3-16 10:59 | 显示全部楼层 |阅读模式
我的单片机是AP32F103VC,我写了个定时器让IO口反转的程序
void Delay(unsigned char d)
{
        TMR_Enable(TMR1);
        tick=0;
        while(1)
        {
                if(tick>=d)
                        break;
        }
        TMR_Disable(TMR1);
}

用了定时器中断,发现tick大于d时,无法跳出while循环。
我试了所有的优化方式,都不行。
请问高手,如何解决?谢谢!
居云生 发表于 2023-3-16 11:52 | 显示全部楼层
看一下tick是咋定义的,可以加一个volatile关键字修饰试试
专注于嵌入式 发表于 2023-3-16 13:13 | 显示全部楼层
一看就是学生,定时器反转的我没有这样写的。而且while循环里一直判断某个变量也是不对的

评论

你要加一个延迟再判断。  发表于 2023-3-16 13:13
 楼主| 比神乐 发表于 2023-3-16 13:47 | 显示全部楼层
居云生 发表于 2023-3-16 11:52
看一下tick是咋定义的,可以加一个volatile关键字修饰试试

谢谢,果然好使。
 楼主| 比神乐 发表于 2023-3-16 13:50 | 显示全部楼层
专注于嵌入式 发表于 2023-3-16 13:13
一看就是学生,定时器反转的我没有这样写的。而且while循环里一直判断某个变量也是不对的 ...

我看你还不如学生呢!那个tick是在定时器中断里自加的。加延迟就不准了

评论

@专注于嵌入式 :你以为什么的单片机都有nop语句吗?  发表于 2023-3-17 17:20
@专注于嵌入式 :那要看具体情况,有时候会出错,有时候不会。  发表于 2023-3-17 17:19
我之前在遇到过这个问题  发表于 2023-3-17 12:00
你加几个NOP肯定就对了  发表于 2023-3-17 11:59
while循环里不能只有一条判断语句,否则会出错。至于为什么?既然你不是学生,你自己应该知道为什么  发表于 2023-3-17 11:57
zchong 发表于 2023-3-16 16:25 | 显示全部楼层
volatile走起?

评论

对的,这是基本的常识,要加的。因为他的循环里只有一条判断语句,那么会一直持续不停地判断,这个时候中断里一直在修改这个变量,然后冲突了。这个时候只要不是持续判断就没事。比如加一个小的的延迟再判断也可以解决这个问题。  发表于 2023-3-17 12:05
tpgf 发表于 2023-4-10 16:54 | 显示全部楼层
break语句能跳出多少层嵌套啊
qcliu 发表于 2023-4-10 17:08 | 显示全部楼层
比神乐 发表于 2023-3-16 13:47
谢谢,果然好使。

加一个volatile关键字就好使 这是什么原理呢
drer 发表于 2023-4-11 10:21 | 显示全部楼层
volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改
 楼主| 比神乐 发表于 2023-4-11 10:26 | 显示全部楼层
qcliu 发表于 2023-4-10 17:08
加一个volatile关键字就好使 这是什么原理呢

不清楚
coshi 发表于 2023-4-11 10:48 | 显示全部楼层
遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问
kxsi 发表于 2023-4-11 11:24 | 显示全部楼层
当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据
wiba 发表于 2023-4-11 11:59 | 显示全部楼层
一般说来,volatile用在如下的几个地方:

1) 中断服务程序中修改的供其它程序检测的变量需要加 volatile;
2) 多任务环境下各任务间共享的标志应该加 volatile;
3) 存储器映射的硬件寄存器通常也要加 volatile 说明,因为每次对它的读写都可能由不同意义
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部