我正在尝试读取 Samd21 MCU 上给定 generic clock generator
的 clock source
值。
数据表说,如果我想读取 GENCTRL
寄存器(包含时钟源值),我需要“执行 8 位写入”然后读取寄存器。鉴于寄存器是 32 位的,我该怎么做?
恐怕,通过执行以下操作,我实际上是在更改 generic clock generator X
的配置:
GCLK->GENCTRL.reg = GCLK->GENCTRL.reg & 0xFFFFFFF0 | 0x0000000X
请记住,GENCTRL
的低 8 位保留用于通用时钟发生器的 ID。
波纹管是 datasheet 的一部分包含读取 GENCTRL
寄存器的指令。
最佳答案
ARM 寄存器是 32 位的。外设寄存器(通常)将按 4 字节偏移排列,但并不总是实现这意味着的所有 32 位。
当外设寄存器的高位“读为零,忽略写入”时,这一点最为明显。您可能偶尔会看到更新或功能更多的外围设备版本,其中一些未使用的位将来会被使用。
根据特定外设与内核的连接方式,通常可以对内存的任何区域执行字节、半字或字访问。如果支持,则只会更新相关字节。如果存在限制(例如,仅支持字节访问的 32 位 APB 总线),则应在文档中明确标识。使用 AA64 处理器,甚至可以同时写入两个寄存器!
请注意外设“知道”访问大小(至少信息存在于内部总线上),因此可以将字节访问指定为字的不同行为(即使这是一种最好避免的混淆行为)。总而言之,任何内存映射外设都更多地是总线的观察者,而不是内存的真正实现——设计者可以自由地使用完整的地址/数据/控制总线位组合,并实现位掩码、读/修改/写、访问锁、魔法值等。
关于c - 对 32 位寄存器执行 8 位写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55561688/