繁体   English   中英

对 32 位寄存器进行 8 位写入

[英]Do a 8-bit write to a 32-bit register

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

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

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

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

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

Bellow 是数据表的一部分,其中包含读取GENCTRL寄存器的指令。

数据表

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM