对32位寄存器进行8位写操作

问题描述 投票:1回答:1

我试图在Samd21 MCU上读取给定clock sourcegeneric clock generator值。

数据表说,如果我想读取GENCTRL寄存器(包含时钟源值),我需要“进行8位写操作”并随后读取寄存器。考虑到寄存器是32位,我怎么能这样做呢?

我担心,通过执行以下操作,我实际上正在改变generic clock generator X的配置:

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

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

贝娄是datasheet的一部分,包含阅读GENCTRL登记册的说明。

Datasheet

c memory-management arm cpu-registers
1个回答
1
投票

ARM寄存器为32位。外设寄存器(通常)将以4字节偏移排列,但并不总是实现所暗示的所有32位。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.