我试图读取Samd21单片机上给定的clock source值。
数据表上说,如果我想读取generic clock generator寄存器(包含时钟源值),我需要“进行8位写入”,然后读取寄存器。如果寄存器是32位的,我该怎么做呢?
恐怕,通过执行以下操作,我实际上正在更改GENCTRL的配置:

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

请记住,generic clock generator X的较低8位是为通用时钟生成器的ID保留的。
下面是datasheet的一部分,包含读取GENCTRL寄存器的指令。
c - 对8位寄存器进行8位写入-LMLPHP

最佳答案

ARM寄存器是32位的。外围寄存器(通常)将以4字节偏移量排列,但并不总是实现这意味着的所有32位。
当外围寄存器的高位为“读为零,写忽略”时,这一点最为明显。您可能偶尔会看到更新的或功能更强大的外设版本,其中一些未使用的位将在将来使用。
根据特定外设与核心的连接方式,通常可以对内存的任何区域执行字节、半字或字访问。如果支持,则只更新相关字节。如果存在限制(例如仅支持字节访问的32位APB总线),则应在文档中明确标识。使用AA64处理器,甚至可以同时写入两个寄存器!
请注意,外围设备“知道”访问大小(至少信息存在于内部总线上),因此可以将字节访问的不同行为指定为单词(即使这是最好避免的混淆行为)。概括地说,任何内存映射外设与其说是内存的真正实现,不如说是总线的观察者——设计者可以自由地玩全地址/数据/控制总线位组合的把戏,实现位掩码、读/修改/写、访问锁、魔术值等。

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

10-13 07:34