【发布时间】:2017-03-02 05:22:06
【问题描述】:
我正在开发基于 ARM Cortex M0+ 的 SoC 测试板。 SoC 配备了 5 个内存库,并且能够进行电压和频率缩放。但我面临的问题是,当我在某个地址以低于默认频率(20.8 MHz)的频率将一些数据/值写入 r/w 寄存器时,会导致数据损坏,使得每个值都是写入多个寄存器地址,尽管一个地址有一个值。代码如下:
int main(void)
{
//AP_PLL->CLKREF_RM = 0x000104f6; //32768 * 0x4F6 => 41.7 MHz;
//AP_PLL->CLKREF_RM = 0x0001027b; //32768 * 0x27b => 20.8 MHz;
AP_PLL->CLKREF_RM = 0x00010140; //32768 * 0x4F6 = 10.8 MHz;
for (int i = 0; i < 200; i++)
{
*((unsigned int*) 0x1000 + i) = i;
}
return 0;
}
以 10 Mhz 运行时的输出:0L, 0L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 6L, 6L, 6L, 6L
预期输出:0L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L
【问题讨论】:
-
这些内存库是通过一些时间敏感的接口访问的吗?
-
这是什么芯片,手臂部分可能无关紧要,它是芯片中的东西。这是 SAMD21 吗?
-
20.8 听起来既奇怪又太快,不能作为默认频率 4、8、16 更典型。
-
不知道有什么pll,你可以塞进一些东西并改变频率,通常有一个带有投票点的程序来等待事情解决。
-
你在地址 0x1000 有 ram?在皮质-m 中?