c - 对 32 位寄存器执行 8 位写入

标签 c memory-management arm cpu-registers

我正在尝试读取 Samd21 MCU 上给定 generic clock generatorclock source 值。

数据表说,如果我想读取 GENCTRL 寄存器(包含时钟源值),我需要“执行 8 位写入”然后读取寄存器。鉴于寄存器是 32 位的,我该怎么做?

恐怕,通过执行以下操作,我实际上是在更改 generic clock generator X 的配置:

GCLK->GENCTRL.reg = GCLK->GENCTRL.reg & 0xFFFFFFF0 | 0x0000000X

请记住,GENCTRL 的低 8 位保留用于通用时钟发生器的 ID。

波纹管是 datasheet 的一部分包含读取 GENCTRL 寄存器的指令。

Datasheet

最佳答案

ARM 寄存器是 32 位的。外设寄存器(通常)将按 4 字节偏移排列,但并不总是实现这意味着的所有 32 位。

当外设寄存器的高位“读为零,忽略写入”时,这一点最为明显。您可能偶尔会看到更新或功能更多的外围设备版本,其中一些未使用的位将来会被使用。

根据特定外设与内核的连接方式,通常可以对内存的任何区域执行字节、半字或字访问。如果支持,则只会更新相关字节。如果存在限制(例如,仅支持字节访问的 32 位 APB 总线),则应在文档中明确标识。使用 AA64 处理器,甚至可以同时写入两个寄存器!

请注意外设“知道”访问大小(至少信息存在于内部总线上),因此可以将字节访问指定为字的不同行为(即使这是一种最好避免的混淆行为)。总而言之,任何内存映射外设都更多地是总线的观察者,而不是内存的真正实现——设计者可以自由地使用完整的地址/数据/控制总线位组合,并实现位掩码、读/修改/写、访问锁、魔法值等。

关于c - 对 32 位寄存器执行 8 位写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55561688/

相关文章:

c - 根据长度崩溃对静态数组中的字符串进行排序? |错误分配/访问|

java - 我怎样才能让 JavaFX 在树莓派 3 上工作

linux - 早期启动调度极其脆弱

python - 变量赋值存储在内存中的什么位置?

c - c中的windows异步串口通信

C 编程 ScanF 多输入一文件

c - 类型 'ssize_t' 无法解析 eclipse cdt

c++ - 知道在执行期间访问了哪些内存页面

c - 如何在 arm 内联汇编中访问本地 C 变量?

c - 如何在 glibc 中检测到双重释放?