gpt4 book ai didi

c - 如何读取/写入 unsigned char 的特定位

转载 作者:太空宇宙 更新时间:2023-11-04 01:53:06 24 4
gpt4 key购买 nike

我想根据下表读取/写入一个无符号字符: enter image description here

例如我有以下变量:

unsigned char hsi_div = 0x01; /* HSI/2 */
unsigned char cpu_div = 0x05; /* Fmaster/32 */

我想将 hsi_div 写入位 4,3,将 cpu_div 写入位 2,1,0(假设整个字符都命名为 CLK_DIVR):

CLK_DIVR |= hsi_div << 4; //not correct!
CLK_DIVR |= cpu_div << 2; //not correct!

假设我想回读寄存器以确保我做的是正确的:

if( ((CLK_DIVR << 4) - 1) & hsi_div) ) { /* SET OK */ }
if( ((CLK_DIVR << 2) - 1) & cpu_div) ) { /* SET OK */ }

我的位运算有问题吗!?我没有得到正确的行为。

最佳答案

我假设 CLK_DIVR 是一个硬件外设寄存器,它应该是 volatile。此类寄存器应设置为尽可能少的写入。你改变了所有可写位,所以就

 CLK_DIVR = (uint8_t)((hsi_div << 3) | (cpu_div << 0));

注意使用固定宽度的字体。这使得它不再是一个 8 位寄存器。根据摘录,高位是只读的,因此写入时不会更改。强制转换可防止编译器发出截断警告,这是建议始终启用的警告之一(包含在 gcc 的 -Wconversion 中)。

移位计数实际上是字段开始的位(最低位)。 0 的移位计数表示“无移位”,因此不需要移位运算符。我仍然用它来澄清我的意思是该字段从位 0 开始。让编译器优化,专心编写可维护的代码。


注意:您的代码位或寄存器中已有的任何内容。 Bit-or 只能置位,不能清零。此外,类次计数错误。


不确定,但如果摘录是针对 ARM Cortex-M CPU(STM32Fxxxx?),则减少外部总线周期变得更加相关,因为 ARM 可能需要相当多的周期才能进行访问。

关于c - 如何读取/写入 unsigned char 的特定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39734319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com