野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10346|回复: 5

SPIFlash启动和XIP运行时的时钟初始化问题

[复制链接]
发表于 2018-10-23 12:38:36 | 显示全部楼层 |阅读模式
请问当系统ROM从外部FlexSPI连接的SPI Nor Flash启动时,从头部读取flash的memconfig数据后,初始化时钟使用的哪路PLL时钟?以及是怎么设定的Mux和Div呢?主要是想后面用户程序在设定配置PLL的时候避开原来的配置以免修改错参数,导致意外的跑飞,谢谢!
回复

使用道具 举报

发表于 2018-10-23 13:18:26 | 显示全部楼层
从火哥提供的NXP官方 Flashloader代码里我扣出来了这些代码, 看起来是PFD480_PFD0, 具体看代码

[mw_shl_code=c,true]// FLEXSPI clock configuration, safe frequency: 30MHz
    CCM->CSCMR1 = ((CCM->CSCMR1 &
                    ~(CCM_CSCMR1_FLEXSPI_CLK_SEL_MASK | CCM_CSCMR1_FLEXSPI_PODF_MASK | CCM_CSCMR1_PERCLK_PODF_MASK |
                      CCM_CSCMR1_PERCLK_CLK_SEL_MASK)) |
                   CCM_CSCMR1_FLEXSPI_CLK_SEL(3) | CCM_CSCMR1_FLEXSPI_PODF(7) | CCM_CSCMR1_PERCLK_PODF(1));


void flexspi_clock_config(uint32_t instance, uint32_t freq, uint32_t sampleClkMode)
{
    uint32_t pfd480 = 0;
    uint32_t cscmr1 = 0;
    uint32_t frac = 0;
    uint32_t podf = 0;

    typedef struct _flexspi_clock_param
    {
        uint8_t frac;
        uint8_t podf;
    } flexspi_clock_param_t;

    const flexspi_clock_param_t k_sdr_clock_config[kFlexSpiSerialClk_200MHz + 1] = {
        // Reserved, 30MHz     50MHz     60MHz        75MHz    80MHz       100MHz   133MHz       166MHz   200MHz
        { 0, 0 }, { 34, 8 }, { 22, 8 }, { 24, 6 }, { 30, 4 }, { 18, 6 }, { 14, 6 }, { 17, 4 }, { 26, 2 }, { 22, 2 }
    };
    const flexspi_clock_param_t k_ddr_clock_config[kFlexSpiSerialClk_200MHz + 1] = {
        // Reserved, 30MHz,  50MHz,       60MHz,      75MHz,   80Mhz,   100MHz,      133MHz,   166MHz,     200MHz
        { 0, 0 }, { 24, 6 }, { 22, 4 }, { 12, 6 }, { 30, 2 }, { 18, 3 }, { 22, 2 }, { 33, 1 }, { 26, 1 }, { 22, 1 }
    };

    do
    {
        if ((sampleClkMode != kFlexSpiClk_SDR) && (sampleClkMode != kFlexSpiClk_DDR))
        {
            break;
        }

        pfd480 = CCM_ANALOG->PFD_480 & (~CCM_ANALOG_PFD_480_PFD0_FRAC_MASK);
        cscmr1 = CCM->CSCMR1 & (~CCM_CSCMR1_FLEXSPI_PODF_MASK);

        // Note: Per ANALOG IP Owner's recommendation, FRAC should be even number,
        //       PODF should be even nubmer as well if the divider is greater than 1

        const flexspi_clock_param_t *flexspi_config_array = NULL;
        if (sampleClkMode == kFlexSpiClk_SDR)
        {
            flexspi_config_array = &k_sdr_clock_config[0];
        }
        else
        {
            flexspi_config_array = &k_ddr_clock_config[0];
        }

        if (freq >= kFlexSpiSerialClk_30MHz)
        {
            if (freq > kFlexSpiSerialClk_200MHz)
            {
                freq = kFlexSpiSerialClk_30MHz;
            }

            frac = flexspi_config_array[freq].frac;
            podf = flexspi_config_array[freq].podf;

            pfd480 |= CCM_ANALOG_PFD_480_PFD0_FRAC(frac);
            cscmr1 |= CCM_CSCMR1_FLEXSPI_PODF(podf - 1);

            FLEXSPI->MCR0 |= FLEXSPI_MCR0_MDIS_MASK;
            flexspi_clock_gate_disable(instance);

            if (pfd480 != CCM_ANALOG->PFD_480)
            {
                CCM_ANALOG->PFD_480 = pfd480;
            }
            if (cscmr1 != CCM->CSCMR1)
            {
                CCM->CSCMR1 = cscmr1;
            }
            flexspi_clock_gate_enable(instance);
            FLEXSPI->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK;
        }
        else
        {
            // Do nothing
        }
    } while (0);
}[/mw_shl_code]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-23 13:19:15 | 显示全部楼层
感谢,那我也去扣一下那块代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-23 13:38:28 | 显示全部楼层
顺便问一下,这个代码的话是不是因为是固化在ROM里面的,我们是没办法去修改的吧,或者换句话说,如果代码是跑在spi flash上的话, PFD480_PFD0这个频率以及后面的PFD设定在应用代码里就不能碰了,否则就直接跑飞了,是么?
回复 支持 反对

使用道具 举报

发表于 2018-10-23 13:47:00 | 显示全部楼层
knight_hu 发表于 2018-10-23 13:38
顺便问一下,这个代码的话是不是因为是固化在ROM里面的,我们是没办法去修改的吧,或者换句话说,如果代码 ...

改也是可以改的,只是我的理解是改CLOCK的代码不能在FLASH里,得复制到RAM里执行,而且在改时钟的时候得关中断,得避免DMA等其他master访问FLASH,要不然可能有未期望的行为发生
回复 支持 反对

使用道具 举报

发表于 2018-10-23 13:54:58 | 显示全部楼层
helloeagle 发表于 2018-10-23 13:18
从火哥提供的NXP官方 Flashloader代码里我扣出来了这些代码, 看起来是PFD480_PFD0, 具体看代码

[mw_shl ...

厉害了                    
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 11:18 , Processed in 0.034304 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表