我正在研究Atmel ATMega的TWI,并且示例代码使我感到困惑。它说必须通过向其写入逻辑1来清除中断标志TWINT,所以我想在C中这样发送START条件
TWCR |= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
但是在示例代码中它是这样的
TWCR = (1<<TWINT)|(1<<TWSTA|(1<<TWEN)
在Atmel页面上还说TWCR |=(1<<TWINT)
清除中断标志http://www.atmel.com/webdoc/AVRLibcReferenceManual/FAQ_1faq_intbits.html的方法是错误的,因此在设置和写入之间的区别是什么?使用错误TWCR |=(1<<TWINT)
我正在使用Atmel 2549 8位微控制器的数据表。示例代码摘自24.6节
如何正确写入寄存器取决于具体情况。您所指的链接涉及中断标志寄存器,该中断标志寄存器通过写入1清除。
假设您有REG
带有两个标志的8位寄存器。您想清除lsb标志。如果你写
#define FLAG0 0x01
#define FLAG1 0x02
...
REG = FLAG0;
然后,这将转换为机器代码“在REG中,将值1写入位0”,这将正确清除该标志。
如果您这样做REG |= FLAG0
,则程序将首先读取寄存器并将读取的值存储在一个临时位置。假设该寄存器的值均为0x03,两个标志均置位。您的代码会将0x01写入此临时位置,但由于按位或,它还将保留其他不相关标志的值。因此,您最终将值0x03写回REG
,同时清除了所需的标志和不相关的标志。
中断标志寄存器非常微妙,因为它们可以通过各种奇怪的逻辑来实现,而这些奇怪的逻辑不能与C编程一起很好地实现,例如“通过写入1清除”或“通过读取带有标志集的清除”。因此,我强烈建议您始终反汇编清除此类标志的C代码,并检查其实际作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句