Embedded 如何仅将寄存器的一部分更改为一个数字(示例是这样做的错误?)

Embedded 如何仅将寄存器的一部分更改为一个数字(示例是这样做的错误?),embedded,microcontroller,binary-operators,Embedded,Microcontroller,Binary Operators,例如,我想将数字32写入寄存器的16-24位。该寄存器的长度为100位,其余或部分寄存器包含不应写入的“保留位”(根据数据表),或者说它包含我不想更改的其他值(以前的设置) 如果只有几个位,我就可以用R&=~(1来设置它们中的每一位,这里有一个了解原理的函数: unsigned SetSomeBits(unsigned Var, unsigned StartBitNumber, unsigned NumberOfBits, unsigned Value2Set) { unsigned Mas

例如,我想将数字32写入寄存器的16-24位。该寄存器的长度为100位,其余或部分寄存器包含不应写入的“保留位”(根据数据表),或者说它包含我不想更改的其他值(以前的设置)


如果只有几个位,我就可以用
R&=~(1来设置它们中的每一位,这里有一个了解原理的函数:

unsigned SetSomeBits(unsigned Var, unsigned StartBitNumber, unsigned NumberOfBits, unsigned Value2Set)
{
  unsigned Mask = (1<<NumberOfBits)-1; //With NumberOfBits=3 Mask becomes 0b000111 
  Mask <<= StartBitNumber;
  //Mask contains now 0 at do-not-touch  bit positions
  //Mask contains now 1 at to-be-changed bit positions

  Var &= ~Mask; //Zero out the to-be-changed bits

  return Var | (Value2Set<<StartBitNumber); //Set the requested bits
}
unsigned SetSomeBits(unsigned Var、unsigned StartBitNumber、unsigned NumberOfBits、unsigned Value2Set)
{
无符号掩码=(1)
例如,我想将数字32写入寄存器的16-24位。此寄存器的长度为100位,其余或部分寄存器包含不应写入的“保留位”(根据数据表)。或者说,它包含我不想更改的其他值(以前的设置)

您希望执行。在本例中,您感兴趣的是将位16-24设置为特定值。假设这些值为零,您可以这样做:

my_register |= (32 << 16);
my_register &= ~(0xFF << 16); //Clear bits 16-24
my_register |= (0x20 << 16); //Set bits 16-24 to 32

my_register |=(32使用a?你能详细说明一下吗?你的意思是使用&~(我想归零的位)和|=我想保留的位?那会花费很长时间,而且非常烦人。(等等,我可以制作一个函数,将我的数字转换成二进制,基本上|=实际数字和&=相反的数字,这就是你的意思)我不知道,在你的情况下,这到底意味着什么(我已经多年没有做过任何汇编了),但位掩码的意义是一次设置几个位。请参阅我链接到的维基百科文章。我将为此制作一个宏。我只是好奇,因为有这么多示例(甚至一些地方的官方CMSI)忽略它,然后立即设置注册表,保留位为0)。另外,我在做C!我只是在“根据数据表”使用cortex-m微控制器-给出一个线索,什么是部件,什么是工具链?哦,谢谢:)我大部分都是在1或2个地方看到的。还有来自供应商的库(CMSIS时钟初始化等)这就解释了原因。他们可能知道这没关系。你没有处理这个寄存器是一个不太可能的100位值这一事实,这就引出了一个问题,即它是如何寻址或访问的,以及由什么数据类型。这个不太可能的约束使得这个问题在没有进一步信息的情况下无法回答。然而,它似乎是一个虚构的解释注意,从技术上讲,这种方法仍然是“写入不应该写入的保留位”-只是使用它们以前拥有的值,这可能与硬件实现有关,也可能与硬件实现无关。C语言中根本没有“单位写入”-在某些汇编语言中,这是可能的。
my_register &= ~(0xFF << 16); //Clear bits 16-24
my_register |= (0x20 << 16); //Set bits 16-24 to 32