频繁导致基于ARM CortexM0 +的SoC数据损坏?

时间:2017-03-01 17:59:21

标签: c arm embedded soc

我正在开发基于ARM Cortex M0 +的SoC测试板。 SoC配备5个存储体,能够进行电压和频率调节。但是我面临的问题是,当我在某个地址写入某些数据/值到某个地址且频率低于默认频率(20.8 MHz)时,会导致数据损坏,导致每个值都存在写入多个寄存器地址,尽管一个地址有一个值。代码如下:

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

1 个答案:

答案 0 :(得分:3)

Cortex-M0 +没有定义PLL - 这是部分特定的,因此,由于您没有泄露特定部分,因此很难具体建议。

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

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

正常的时钟切换过程是:

  1. 切换到主固定频率振荡器
  2. 设置PLL配置
  3. 等待PLL锁定
  4. 切换到PLL振荡器