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

小菜求教大伙关于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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版