频率过低导致ARM CortexM0和x2B上的数据损坏;基于SoC?

频率过低导致ARM CortexM0和x2B上的数据损坏;基于SoC?,c,arm,embedded,soc,C,Arm,Embedded,Soc,我正在研制一个基于ARM Cortex M0+的SoC测试板。SoC配备5个内存组,能够进行电压和频率缩放。但我面临的问题是,当我以低于默认频率(20.8 MHz)的频率向某个地址的r/w寄存器写入某些数据/值时,会导致数据损坏,导致每个值都被写入多个寄存器地址,尽管一个地址有一个值。代码如下所示: int main(void) { //AP_PLL->CLKREF_RM = 0x000104f6; //32768 * 0x4F6 => 41.7 MHz; //A

我正在研制一个基于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;
}
int main(无效)
{
//AP_PLL->CLKREF_RM=0x000104f6;//32768*0x4F6=>41.7 MHz;
//AP_PLL->CLKREF_RM=0x0001027b;//32768*0x27b=>20.8MHz;
AP_PLL->CLKREF_RM=0x00010140;//32768*0x4F6=10.8 MHz;
对于(int i=0;i<200;i++)
{
*((无符号整数*)0x1000+i)=i;
}
返回0;
}
以10 Mhz频率运行时的输出:
0L、0L、1L、1L、1L、2L、2L、3L、4L、4L、4L、4L、4L、5L、5L、6L、6L、6L


预期输出:
0L、1L、2L、3L、4L、5L、6L、7L、8L、9L、10L

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

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

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

正常的时钟切换过程是:

  • 切换到主固定频率振荡器
  • 设置PLL配置
  • 等待PLL锁定
  • 切换到PLL振荡器

  • 这些内存库是通过时间敏感接口访问的吗?这是什么芯片?arm部分可能与此无关,它是芯片中的某个东西。这是SAMD21吗?20.8听起来既奇怪又太快,不适合作为默认频率。4,8,16更为典型。不知道pll,您可以插入一些内容并更改频率,通常有一个程序,带有轮询点以等待事情解决。您的ram地址为0x1000?在cortex-m?嗨,Clifford,谢谢你的回答。你能建议或分享任何遵循这些步骤切换PLL频率的硬件平台的信息吗?@SSR:我不知道你想要什么;时钟开关序列应在软件中实现,而不是在硬件中实现。鉴于您已经有了硬件,我不确定其他示例会有什么帮助。如果您只是明确说明您使用的是什么SoC,这将简单得多,因此不需要非常笼统。