【问题标题】:Under frequency causing data corruption on ARM CortexM0+ based SoC?频率过低会导致基于 ARM CortexM0+ 的 SoC 上的数据损坏?
【发布时间】: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 中?

标签: c arm embedded soc


【解决方案1】:

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

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

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

正常的时钟切换过程是:

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

【讨论】:

  • 嗨@Clifford,感谢您的回答。您能否建议或分享有关任何硬件平台的信息,这些平台遵循这些步骤来切换 PLL 频率?
  • @SSR :我不确定您要什么;时钟切换序列将在软件中实现,而不是在硬件中。鉴于您已经拥有硬件,我不确定其他示例将如何提供帮助。如果您只是明确说明您使用的是什么 SoC,那会简单得多,因此无需如此笼统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多