设置一位与将逻辑一位写入之间有什么区别?

奥克斯

我正在研究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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Lua为什么将除法截断为一位?

来自分类Dev

检查模具位,然后写入另一位

来自分类Dev

将数字增加一位

来自分类Dev

倒数最后一位

来自分类Dev

如何左移一位?

来自分类Dev

哪个一位整数的有效位更高?

来自分类Dev

如何显示文件中最后一位为一位的所有行

来自分类Dev

更新位向量的一位

来自分类Dev

将输出写入控制台中的同一位置

来自分类Dev

如何检查整数中是否只设置了一位?

来自分类Dev

msysgit版本的最后一位是什么意思?

来自分类Dev

在所有成员之间生成二进制一位更改

来自分类Dev

SQL将位列聚合为一位结果

来自分类Dev

断词将下一位李推倒

来自分类Dev

将多个图像放置在同一位置

来自分类Dev

将'.0'添加到一位整数

来自分类Dev

标识同一位置的所有节点

来自分类Dev

一位用户拥有多张卡(php,mysql)

来自分类Dev

为什么python将这两个变量存储在同一位置?

来自分类Dev

将float转换为至少有一位小数的字符串(javascript)

来自分类Dev

有输出时,将仍然缓冲的标准输入向下移动一位

来自分类Dev

将最大的数字放在列表的第一位时,没有给出正确的答案

来自分类Dev

将两个读者“合并”为一位具有特殊条件的作家

来自分类Dev

将所有元素放在同一位置

来自分类Dev

有输出时,将仍然缓冲的标准输入向下移动一位

来自分类Dev

获取数字的最后一位

来自分类Dev

翻转字节的最后一位

来自分类Dev

异常类型:一位用户的SIGTRAP

来自分类Dev

a ^ b ^ c的最后一位