[新品上市]

极海单片机定时器的问题

[复制链接]
323|12
手机看帖
扫描二维码
随时随地手机跟帖
比神乐|  楼主 | 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关键字修饰试试

谢谢,果然好使。

使用特权

评论回复
比神乐|  楼主 | 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循环里不能只有一条判断语句,否则会出错。至于为什么?既然你不是学生,你自己应该知道为什么 
zchong| | 2023-3-16 16:25 | 显示全部楼层
volatile走起?

使用特权

评论回复
评论
专注于嵌入式 2023-3-17 12:05 回复TA
对的,这是基本的常识,要加的。因为他的循环里只有一条判断语句,那么会一直持续不停地判断,这个时候中断里一直在修改这个变量,然后冲突了。这个时候只要不是持续判断就没事。比如加一个小的的延迟再判断也可以解决这个问题。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则