2

我正在开发SoC基于 ARM Cortex M0+ 的测试板。它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

4

1 回答 1

3

Cortex-M0+ 没有定义一个 PLL——这是特定于部分的,所以由于你没有透露具体的部分,所以很难给出具体的建议。

通常,在 PLL 频率更改之后,有必要在切换到 PLL 时钟并继续执行之前等待实现 PLL 锁定 - 在您的示例中,内存访问发生PLL 正在使用且不稳定并且毫无疑问仍然实现锁定。

根据时钟源的具体部分和性质,PLL 锁定可能需要几十微秒。通常 PLL 会有一个状态寄存器,在切换到 PLL 时钟 之前应该轮询它的锁定状态。

正常的时钟切换过程是:

  1. 切换到主固定频率振荡器
  2. 设置 PLL 配置
  3. 等待 PLL 锁定
  4. 切换到 PLL 振荡器
于 2017-03-01T20:45:43.620 回答