打印
[STM32L0]

一个关于延时的怪问题

[复制链接]
1483|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
自民|  楼主 | 2016-2-17 08:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC, dc, ps, ST, AD
unit8_t   upstartadcn[2];

在定时器里设置
upstartadcn[0]++;
upstartadcn[1]++;

在主程序里
int main(void)
{
初始化设置


while(upstartadcn[0]<3);
while(upstartadcn[1]<2);

while(1)
{

}
}

程序会停在
while(upstartadcn[0]<3);
while(upstartadcn[1]<2);
不运行下去,定时器设置都没问题,不知道为什么
沙发
yklstudent| | 2016-2-17 08:39 | 只看该作者
先确定中断执行了没有

使用特权

评论回复
板凳
huangcunxiake| | 2016-2-17 09:00 | 只看该作者
定时器工作了吗,另外那个类型设置为volatile

使用特权

评论回复
地板
airwill| | 2016-2-17 09:04 | 只看该作者
对, 如果确定定时器工作正常了, 那应该是upstartadcn 没有设置 volatile 的问题.

使用特权

评论回复
5
sjnh| | 2016-2-17 09:06 | 只看该作者
中断、主程序都操作的用volatile

使用特权

评论回复
6
huangcunxiake| | 2016-2-17 09:09 | 只看该作者
楼主可以单独写个定时器的程序,里面搞个闪灯,看看到底工作不。在外初始化的时候比如是灭的,进入定时器后就拉高点亮

使用特权

评论回复
7
huangcunxiake| | 2016-2-17 09:09 | 只看该作者
进去定时器后,还要清理标志重启定时器的。你看看是不是进入了,但是没有退出重置。

使用特权

评论回复
8
zhoupxa| | 2016-2-17 15:47 | 只看该作者
本帖最后由 zhoupxa 于 2016-2-17 15:48 编辑
airwill 发表于 2016-2-17 09:04
对, 如果确定定时器工作正常了, 那应该是upstartadcn 没有设置 volatile 的问题.

应该不必使用volatile修饰吧,只要是全局变量就好了
可能是其他问题,看样子是中断没有工作

使用特权

评论回复
9
airwill| | 2016-2-17 16:33 | 只看该作者
zhoupxa 发表于 2016-2-17 15:47
应该不必使用volatile修饰吧,只要是全局变量就好了
可能是其他问题,看样子是中断没有工作 ...

不使用volatile修饰, 呵呵, 看看编译器的目标代码.

while(upstartadcn[0]<3);

应该优化后, 刚开始从 upstartadcn[0] 读入寄存器后, 一直用寄存器跟 3 比较, 不再读取 upstartadcn[0], 于是就卡在这里了.

使用特权

评论回复
10
zhoupxa| | 2016-2-17 17:16 | 只看该作者
airwill 发表于 2016-2-17 16:33
不使用volatile修饰, 呵呵, 看看编译器的目标代码.

while(upstartadcn[0]

哦,问题症结应该在这里,受教了
以往在程序中也有这样的用法,可是没出过这种问题啊

使用特权

评论回复
11
自民|  楼主 | 2016-2-18 08:05 | 只看该作者
问题解决,谢谢
原因不使用volatile修饰

使用特权

评论回复
12
前功尽弃| | 2016-2-18 08:06 | 只看该作者
有仿真器的话,单步调试看看两个变量的值有没有在发生变化;没有的话,用串口输出的变量的值看看

使用特权

评论回复
13
仙女山| | 2016-2-18 17:03 | 只看该作者
首先,是不是全局变量
再者,定时器工作了吗?

使用特权

评论回复
14
史迪威将军| | 2016-2-18 20:05 | 只看该作者
是不是定时器没有工作啊?

使用特权

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

本版积分规则

47

主题

195

帖子

2

粉丝