你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

小菜求教大伙关于stm32定时器问题

[复制链接]
adersonl 提问时间:2014-12-12 01:28 /
最近呢,在做一块小板子,用到了一个rtc模块,为了不使整个程序阻塞起来我使用了一路基本定时器200ms定时读取rtc的值,原本没有什么问题,但是rtc内部带有一个温度传感器,我想顺便也读了吧,考虑到温度不需要实时更新,所以我在定时器中断里设了两个标志变量(定时器10ms中断一次)变量A是读取rtc的标志变量,变量B为温度读取的标志变量,两个变量都在中断函数中自加,并在while(1)中不停的查询两个变量的值,当A为20时,首先清除A的值为0并读取rtc的数据显示到液晶,当B为500时读取温度传感器的值并更新显示到液晶,现在出现的问题是,温度传感器的值正常更新,可是rtc的显示不走时,大体程序如下
while(1)
{
if A == 20
//更新rtc显示到液晶,且A清0
ifB == 50
//更新温度显示到液晶,且B清0
}
A,B兼在中断函数中自加,求解现在为什么只B==50这部分代码会被执行,A==20的代码不执行,调试发现A的值一直自加直到溢出,求解各位大大们,这是怎么回事
手机码字,不便之处请大家多多见谅

收藏 评论10 发布时间:2014-12-12 01:28

举报

10个回答
那片清茶 回答时间:2014-12-12 08:34:23
把关于A的函数贴出来看看。。
adersonl 回答时间:2014-12-12 09:19:39
那片清茶 发表于 2014-12-12 08:34
把关于A的函数贴出来看看。。

A的函数就是从rtc里读取时分秒年然后显示到显示,不太好发啊,这函数有400多行
那片清茶 回答时间:2014-12-12 09:31:46
adersonl 发表于 2014-12-12 09:19
A的函数就是从rtc里读取时分秒年然后显示到显示,不太好发啊,这函数有400多行  ...

那你的意思就是A的值乱了,,
wyy0313 回答时间:2014-12-12 09:46:00
本帖最后由 wyy0313 于 2014-12-12 09:48 编辑

应该把判断定时“if A == 20”和“ifB == 50”放在中断里面,判断成立然后设置标志,主程序里判断标志然后执行,判断定时不放在中断就改为“if A >= 20”和“ifB >= 50”
adersonl 回答时间:2014-12-12 10:04:20
wyy0313 发表于 2014-12-12 09:46
应该把判断定时“if A == 20”和“ifB == 50”放在中断里面,判断成立然后设置标志,主程序里判断标志然后 ...

对头,对头,您这个方法确实人效,原因是为何呢
wyy0313 回答时间:2014-12-12 10:08:37
在主程序里执行更新温度显示到液晶时,定时器还在运行,等你运行完温度显示到液晶,再去判断A时,A已经大于20了。
adersonl 回答时间:2014-12-12 10:09:52
那片清茶 发表于 2014-12-12 09:31
那你的意思就是A的值乱了,,

调试时能看到A值会一直加,直到溢出,也就是说,if A==20这话不起作用了
wenyangzeng 回答时间:2014-12-12 12:05:41
你在定时器中断中进行ADC转换不合理,会出现ADC未结束,定时器又进入下一次中断。其实你只要在主程序中判断定时器送出的标志位,如果为1就清除并进行ADC转换,或者在定时器中断中启动ADC,在主函数中读取ADC值,实际上我们没有必要每次中断都去读取ADC值的。
奔跑小蜗牛 回答时间:2014-12-14 12:40:11
中断速度快,主程序从上往下执行过程中会错过中断数值的更新,主程序还没来得及判断定时中断的到达数值,却又被新一次中断给更新了,那就识别不到了。“if A == 20”和“ifB == 50”放在中断里面,设置一个成功的标志,主程序识别成功标志就可以了,这样才会有时效性嘛。。
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版