OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 20836|回复: 15

硬件调试中遇到的问题,,帮忙看看

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-8
在线时间
0 小时
发表于 2013-8-8 10:54:17 | 显示全部楼层 |阅读模式
刚开始学习硬件调试,难免出现问题,自己已经搞了4天了,还是弄不出来,麻烦大家看看,可能就是些小问题,谢谢。(用的是原子的板子和程序)
1,用JTAG硬件调试时,为什么左边窗口中的sec值一直不变,一直是107.37418250?
2,u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;

这个AD函数中的延时5ms只是为了取均值是吗,我注释掉没问题吧,我想让AD采集快点
3,第3个问题也是最头疼的问题,我设置TIM3中断函数为5MS进入一次,然后在函数中加了这条语句data=Get_Adc_Average(ADC_Channel_1,10);即
读取AD值,可是程序运行一会就一直在这条语句中执行,就是不停的在

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
这几条语句中执行,就是读取完成一次AD值之后紧接着又等待转换结束,转换结束后data赋完值后又回到等待转换结束的这条语句,完全不回到main函数中
的while主循环了,就在中断函数中不出来,这是怎么回事?
请各位帮忙看看,我知道程序调试应该自己慢慢搞,但是4天过去了一点效果没有,新手不懂得太多了,很可能就是一个什么小问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-8 11:02:24 | 显示全部楼层
回复【楼主位】maixiaoxin:
---------------------------------
1,硬件仿真,这个值不会变.除非你用JTAG TRACE功能,就可以看时间了.
2,可以.
3,是不是没有清除中断标志位?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-8
在线时间
0 小时
 楼主| 发表于 2013-8-8 11:16:11 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
第3个问题,我开始也想过是不是清楚中断标志位的问题,我用的你的那个程序,里面的
TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
语句应该是清除中断标志位了吧。程序有的,我没删。
我还想是不是这条语句data=Get_Adc_Average(ADC_Channel_1,10); 耗时很多,刚完成,5ms的中断又开始了,所以就不停的进中断取AD,中断取AD。。。可是这条语句如果上面u16 Get_Adc_Average(u8 ch,u8 times)函数里的delay_ms(5)注释掉的话,也就用不了多少时间了啊,软件仿真显示只用了52us,所以我的设想也不成立。
还有我想中断设成5ms会不会进来的太快,我改成50ms,果然就可以了,可是我的这个程序就要求程序快速扫描的,慢了不行的,原子哥,还有可能什么问题呢?谢谢了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-8 11:23:48 | 显示全部楼层
回复【3楼】maixiaoxin:
---------------------------------
硬件仿真看下是什么情况吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-8
在线时间
0 小时
 楼主| 发表于 2013-8-9 10:27:00 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥你好,程序运行时有时候LCD会突然卡住不动,硬件调试单步运行发现变量值是变化的,LCD刷新的语句也是执行的,就是屏幕上的内容不再变化了,led小灯单步运行时也是闪烁的,有没有人出现过这种情况,怎么回事呢?谢谢啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-9 10:50:12 | 显示全部楼层
回复【5楼】maixiaoxin:
---------------------------------
那不应该不更新才对啊.
你直接用我们的例程测试的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-8
在线时间
0 小时
 楼主| 发表于 2013-8-9 16:04:34 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥你好,用的是你的程序,我自己根据需要做的改动,你的程序部分都没有动,是我改动部分出现的问题,但是我改动的部分和屏幕显示又没什么关系,硬件调试也不知道怎么回事。纠结
还有个问题,也是我硬件调试发现的,在main函数中有你程序原先的adcx=Get_Adc_Average(ADC_Channel_1,10);语句,我在TIM3中断函数中有加入了函数data=Get_Adc_Average(ADC_Channel_1,10);中断设置每5ms进来一次,硬件仿真单步执行时发现,运行一会儿到主函数里的data=Get_Adc_Average(ADC_Channel_1,10);语句时,先是正常的跳到u16 Get_Adc_Average(u8 ch,u8 times)和u16 Get_Adc(u8 ch)中求AD值,可是值返回的时候却没有调回主函数中继续执行,而是莫名其妙的跳到中断函数中的data=Get_Adc_Average(ADC_Channel_1,10);的下一句执行,好像调用完成后返回值没有返回主函数中原先调用它的函数adcx=Get_Adc_Average(ADC_Channel_1,10);而是返回到了中断函数中的data=Get_Adc_Average(ADC_Channel_1,10);,这是怎么回事呢?实在搞不懂。谢谢帮忙。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-9 18:09:04 | 显示全部楼层
回复【7楼】maixiaoxin:
---------------------------------
表示云里雾里啊...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-8
在线时间
0 小时
 楼主| 发表于 2013-8-9 19:10:14 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
就是一个程序中有两处调用了Get_Adc_Average(ADC_Channel_1,10)这条语句,出现的现象是运行其中一条时返回值返回到另一条中去了,不知道还能不能听懂?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-9 20:58:06 | 显示全部楼层
被打断了吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-8
在线时间
0 小时
 楼主| 发表于 2013-8-10 10:06:24 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
这两条语句分别在main函数中和中断函数中,中断函数为5ms执行一次,你是说,运行主函数里的这条语句时刚好中断时间到,被打断,然后就不停的中断中运行不回主函数了是吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-10 10:14:43 | 显示全部楼层
也不会不停的在中断运行了,中断里面跑完了就会回到主函数的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-8
在线时间
0 小时
 楼主| 发表于 2013-8-10 11:08:04 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
我这边出现的情况就是中断程序结束后会跳到while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束。  语句中等待,一直等到再次进入中断程序(等了5ms),中断程序完成后还是回到while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束。 这条语句中等待,就这样再也回不到主函数。我在想一直在这条语句中等待只有一种可能就是AD转换没有开启,那他才会在这条语句中一直等待,等待转换结束标志置位。可是AD转换没有开启程序是如何进入while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束。   这条语句的呢,不解。上面我说的在主函数和中断函数中都用了Get_Adc_Average(ADC_Channel_1,10)这条语句会产生这样的效果吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-10 12:38:24 | 显示全部楼层
这应该是个bug了...
就像延时函数一样的,你用的是同一个ADC,
main函数ADC本来要转换通道1,有个死循环等待转换完成.
但是ADC还没转换完成,来了个中断,在中断里面同样ADC要转换通道1,所以之前转换了一半(假设)的处理全部丢弃,重新开始转换,等到转换完成,结束转换.
再退回到main函数的ADC转换,这样由于ADC都已经转换完成了,你再去死循环等待,那就永远无法退出了,只能等待下一次中断,在中断里面继续转换....如此循环了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-8-8
在线时间
0 小时
 楼主| 发表于 2013-8-10 15:07:19 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
应该就是这个原因,这样说来中断函数应该怎么用呢,就是我怎么保证中断不会打断主函数里的ADC的转换过程呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-10 17:45:55 | 显示全部楼层
回复【15楼】maixiaoxin:
---------------------------------
转换前关中断,转换完再开中断.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 06:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表