打印
[新品上市]

极海单片机定时器的问题

[复制链接]
1030|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 回复TA
你要加一个延迟再判断。 
地板
比神乐|  楼主 | 2023-3-16 13:47 | 只看该作者
居云生 发表于 2023-3-16 11:52
看一下tick是咋定义的,可以加一个volatile关键字修饰试试

谢谢,果然好使。

使用特权

评论回复
5
比神乐|  楼主 | 2023-3-16 13:50 | 只看该作者
专注于嵌入式 发表于 2023-3-16 13:13
一看就是学生,定时器反转的我没有这样写的。而且while循环里一直判断某个变量也是不对的 ...

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

使用特权

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

使用特权

评论回复
评论
专注于嵌入式 2023-3-17 12:05 回复TA
对的,这是基本的常识,要加的。因为他的循环里只有一条判断语句,那么会一直持续不停地判断,这个时候中断里一直在修改这个变量,然后冲突了。这个时候只要不是持续判断就没事。比如加一个小的的延迟再判断也可以解决这个问题。 
7
tpgf| | 2023-4-10 16:54 | 只看该作者
break语句能跳出多少层嵌套啊

使用特权

评论回复
8
qcliu| | 2023-4-10 17:08 | 只看该作者
比神乐 发表于 2023-3-16 13:47
谢谢,果然好使。

加一个volatile关键字就好使 这是什么原理呢

使用特权

评论回复
9
drer| | 2023-4-11 10:21 | 只看该作者
volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改

使用特权

评论回复
10
比神乐|  楼主 | 2023-4-11 10:26 | 只看该作者
qcliu 发表于 2023-4-10 17:08
加一个volatile关键字就好使 这是什么原理呢

不清楚

使用特权

评论回复
11
coshi| | 2023-4-11 10:48 | 只看该作者
遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问

使用特权

评论回复
12
kxsi| | 2023-4-11 11:24 | 只看该作者
当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据

使用特权

评论回复
13
wiba| | 2023-4-11 11:59 | 只看该作者
一般说来,volatile用在如下的几个地方:

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

427

主题

3387

帖子

7

粉丝