本帖最后由 hitzjh 于 2021-4-19 18:31 编辑
这句代码应该是选择滴答计时器SysTick的时钟源时使用的,时钟源由CTRL寄存器中CLKSOURCE位(第三位)的值决定,分两种情况:
(1)使用外部八分频时钟源时需要将该位赋值为0,为了保证寄存器其他位的值不受影响,采用将SysTick->CTRL寄存器的值和0xFFFFFFFB按位与后赋值(即&=)的方法:SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8,这也是楼主疑问的地方。下面解释为什么这样操作(个人理解):因为0xFFFFFFFB的二进制表示法中,只有第3位是0,其余位全为1,那么CTRL寄存器和该数与运算后,CTRL寄存器中和1对应的位都保持不变(和1与运算,结果等于本身),而第三位结果为0,实现选择外部八分频时钟源的目的。
(2)使用内核HCLK时钟时,需要将第三位置为1,同理,为了保证寄存器其他位的值不受影响,采用采用将SysTick->CTRL寄存器的值和0x00000004按位或后赋值(即|=)的方法:SysTick->CTRL |= SysTick_CLKSource_HCLK。0x00000004的二进制表示法中,只有第3位是1,其余位全为0,那么CTRL寄存器和该数或运算后,CTRL寄存器中和0对应的位都保持不变(和0或运算,结果等于本身),而第三位结果为1,实现选择内核HCLK时钟的目的。
总结:如果要将寄存器某位置为0,就将该寄存器与一个对应位为0,其余位全为1的数进行&=(对应位与运算后赋值)的方法;如果要将寄存器某位置为1,就将该寄存器与一个对应位为1,其余为全为0的数进行|=(对应位或运算后赋值)的方法。 |