找回密码
 立即注册
查看: 47|回复: 1

SPI使用HPLL2 时钟问题,如果是普遍情况希望改进,或在规格书中说明一下

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-04-15 10:51:06
已绑定手机

2

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2026-4-15 10:51:06 | 显示全部楼层 |阅读模式
SPI使用HPLL2 时钟,经过测试发现
HPLL1  不启用
HPLL2   启用
SPI时钟没有输出
HPLL1   启用
HPLL2   启用
SPI时钟有输出
SPI使用HPLL1 时钟,
HPLL1   启用
SPI时钟有输出

特别注意如果使用HPLL1  后,不断电动情况下
再次启用HPLL2   关闭HPLL1  后编译下载,程序
可以正常运行,但是重新上电后,就没有输出了


使用的测试函数如下

////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CLK_Init(void)
{
    CLK_I2S1CLK_Divider(1);             //设置I2S1时钟预分频系数
    CLK_I2S2CLK_Divider(1);             //设置I2S2时钟预分频系数
    CLK_SPI1CLK_Divider(1);             //设置SPI1时钟预分频系数
    CLK_SPI2CLK_Divider(6);             //设置SPI2时钟预分频系数
    CLK_SPI3CLK_Divider(40);            //设置SPI3时钟预分频系数
    CLK_PWMACLK_Divider(1);             //设置PWMA时钟预分频系数
    CLK_PWMBCLK_Divider(1);             //设置PWMB时钟预分频系数
    CLK_PWMCCLK_Divider(1);             //设置PWMC时钟预分频系数
    CLK_PWMDCLK_Divider(1);             //设置PWMD时钟预分频系数
    CLK_PWMECLK_Divider(1);             //设置PWME时钟预分频系数
    CLK_PWMFCLK_Divider(1);             //设置PWMF时钟预分频系数
    CLK_TFPUCLK_Divider(1);             //设置TFPU时钟预分频系数

    CLK_SYSCLK_Divider(10);             //切换主时钟前先将系统时钟降频

    HIRC_48M();                         //选择内部预置的频率

    CLK_MCLK_HIRC();                    //选择内部高精度HIRC作为主时钟
    CLK_MCLK2_BYPASS();                 //旁路MCLK2,直接使用MCLK选择

//    CLK_HPLL1_BASECLK();                //选择内部基本时钟BASECLK作为HPLL1输入时钟
//    CLK_HPLL1_PreDivider(8);            //设置HPLL1的输入时钟预分频系数(分频后的频率必须为6MHz左右)
//    CLK_HPLL1_Lock312MHz();             //选择HPLL1的锁频目标频率
//    CLK_HPLL1_Enable();                 //启动HPLL1

    CLK_HPLL2_BASECLK();                //选择内部基本时钟BASECLK作为HPLL2输入时钟
    CLK_HPLL2_PreDivider(8);            //设置HPLL2的输入时钟预分频系数(分频后的频率必须为6MHz左右)
    CLK_HPLL2_Lock312MHz();             //选择HPLL2的锁频目标频率
    CLK_HPLL2_Enable();                 //启动HPLL2
    delay_ms(1);                        //等待PLL锁频

    CLK_SYSCLK_Divider(1);              //设置系统时钟分频系数

//    CLK_HSI2SCK_HPLL1D2();              //选择HPLL1的输出2分频时钟作为高速I2S时钟源
    CLK_HSIOCK_HPLL2D2();               //选择HPLL2的输出2分频时钟作为高速外设时钟源
               
//    CLK_HSIOCK_HPLL1();                 //选择HPLL1的输出时钟作为高速外设时钟源

    //<<AICUBE_USER_CLOCK_INITIAL_BEGIN>>
    // 在此添加用户初始化代码  
    //<<AICUBE_USER_CLOCK_INITIAL_END>>
}

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:671
  • 最近打卡:2026-04-30 08:59:31
已绑定手机

52

主题

2608

回帖

9093

积分

论坛元老

积分
9093
发表于 2026-4-15 15:11:04 | 显示全部楼层
高速外设默认使用HPLL时钟,只使能HPLL2时钟的话,切换到HPLL2前要先使能HPLL,切换完再关闭HPLL。
可参考实验箱例程包里面的PLL时钟配置过程:
  1.     WTST = 2;           //通过WTST增加等待时钟控制Flash读取速度在33MHz以内, 主时钟:480MHz/2/3=80MHz, 读Flash速度:80MHz/(1+2)=26.7MHz
  2.     HPLLCR |= 0x80;     //使能HPLL(高速外设默认使用HPLL时钟,切换到HPLL2前要先使能HPLL,切换完再关闭HPLL)
  3.                         //首先需要将HIRC主频调节到48MHz
  4.     HPLL2CR &= ~0x10;   //选择HPLL2输入时钟源为HIRC
  5. //    HPLL2CR |= 0x10;    //选择HPLL2输入时钟源为IRCM
  6.     HPLL2PDIV = 8;      //设置HPLL2输入时钟预分频为8(HPLL输入频率必须为6MHz)
  7. //    HPLL2CR |= 0x00;    //HPLL2=6MHz*52=312MHz
  8. //    HPLL2CR |= 0x01;    //HPLL2=6MHz*54=324MHz
  9. //    HPLL2CR |= 0x02;    //HPLL2=6MHz*56=336MHz
  10. //    HPLL2CR |= 0x03;    //HPLL2=6MHz*58=348MHz
  11. //    HPLL2CR |= 0x04;    //HPLL2=6MHz*60=360MHz
  12. //    HPLL2CR |= 0x05;    //HPLL2=6MHz*62=372MHz
  13. //    HPLL2CR |= 0x06;    //HPLL2=6MHz*64=384MHz
  14. //    HPLL2CR |= 0x07;    //HPLL2=6MHz*66=396MHz
  15. //    HPLL2CR |= 0x08;    //HPLL2=6MHz*68=408MHz
  16. //    HPLL2CR |= 0x09;    //HPLL2=6MHz*70=420MHz
  17. //    HPLL2CR |= 0x0a;    //HPLL2=6MHz*72=432MHz
  18. //    HPLL2CR |= 0x0b;    //HPLL2=6MHz*74=444MHz
  19. //    HPLL2CR |= 0x0c;    //HPLL2=6MHz*76=456MHz
  20. //    HPLL2CR |= 0x0d;    //HPLL2=6MHz*78=468MHz
  21.       HPLL2CR |= 0x0e;    //HPLL2=6MHz*80=480MHz
  22. //    HPLL2CR |= 0x0f;    //HPLL2=6MHz*82=492MHz
  23.     HPLL2CR |= 0x20;    //高速外设时钟选择 HPLL2/2
  24.     HPLL2CR |= 0x80;    //使能HPLL2
  25.     HPLLCR &= ~0x80;    //关闭HPLL(高速外设默认使用HPLL时钟,切换到HPLL2前要先使能HPLL,切换完再关闭HPLL)
  26.    
  27.     CLKDIV = 3;         //系统时钟 = 主时钟源/2 = HPLL2/2/3 = 80MHz
  28.     CLKSEL = 0x08;      //选择HPLL2/2作为主时钟源
复制代码
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-1 10:31 , Processed in 0.120037 second(s), 48 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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