[STM32L0] 一个关于延时的怪问题

[复制链接]
1855|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 的问题.
sjnh 发表于 2016-2-17 09:06 | 显示全部楼层
中断、主程序都操作的用volatile
huangcunxiake 发表于 2016-2-17 09:09 | 显示全部楼层
楼主可以单独写个定时器的程序,里面搞个闪灯,看看到底工作不。在外初始化的时候比如是灭的,进入定时器后就拉高点亮
huangcunxiake 发表于 2016-2-17 09:09 | 显示全部楼层
进去定时器后,还要清理标志重启定时器的。你看看是不是进入了,但是没有退出重置。
zhoupxa 发表于 2016-2-17 15:47 | 显示全部楼层
本帖最后由 zhoupxa 于 2016-2-17 15:48 编辑
airwill 发表于 2016-2-17 09:04
对, 如果确定定时器工作正常了, 那应该是upstartadcn 没有设置 volatile 的问题.

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

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

while(upstartadcn[0]<3);

应该优化后, 刚开始从 upstartadcn[0] 读入寄存器后, 一直用寄存器跟 3 比较, 不再读取 upstartadcn[0], 于是就卡在这里了.
zhoupxa 发表于 2016-2-17 17:16 | 显示全部楼层
airwill 发表于 2016-2-17 16:33
不使用volatile修饰, 呵呵, 看看编译器的目标代码.

while(upstartadcn[0]

哦,问题症结应该在这里,受教了
以往在程序中也有这样的用法,可是没出过这种问题啊
 楼主| 自民 发表于 2016-2-18 08:05 | 显示全部楼层
问题解决,谢谢
原因不使用volatile修饰
前功尽弃 发表于 2016-2-18 08:06 | 显示全部楼层
有仿真器的话,单步调试看看两个变量的值有没有在发生变化;没有的话,用串口输出的变量的值看看
仙女山 发表于 2016-2-18 17:03 | 显示全部楼层
首先,是不是全局变量
再者,定时器工作了吗?
史迪威将军 发表于 2016-2-18 20:05 | 显示全部楼层
是不是定时器没有工作啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

195

帖子

2

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