我试图在Samd21 MCU上读取给定clock source
的generic clock generator
值。
数据表说,如果我想读取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处理器,甚至可以一次写入两个寄存器!
请注意外围设备“知道”访问大小(至少信息存在于内部总线上),因此可以为字节访问指定不同的行为作为单词(即使这是一种令人困惑的行为,最好避免)。概括地说,任何存储器映射的外设都更像是总线的观察者,而不是真正的存储器实现 - 设计人员可以自由地利用完整的地址/数据/控制总线位组合来实现技巧,并实现位掩码,读/修改/写,访问锁,魔术值等