找回密码
 立即注册
查看: 15|回复: 0

烦请大佬们有时间帮看下AI8051U,PLL配置问题

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:44
  • 最近打卡:2025-09-18 00:38:30
已绑定手机

2

主题

8

回帖

216

积分

中级会员

积分
216
发表于 12 小时前 | 显示全部楼层 |阅读模式
想使用高速SPI,在配置PLL时遇到了以下问题:
1.使用AICube配置PLL,系统时钟使用PLL分频为22.1184,
程序无法运行,表现为使用定时器0中断进行点亮LED无反应且USB也无法识别了。
0ca8d62fbdc6fb0d6bc517be63ad71a.png

c8e86a56b0e7aac0a8c37aaf3a0252a.png
2:通过 查看数据手册和时钟图进行配置后,系统能运行,
但是主时钟使用PLL/2 再使用CLKDIV/4,通过主时钟输出(MCLKODIV)2分在P5.6输出,
示波示测得频率是8.33MHz,
正常的频率不应该是:主时钟输入频率选择 PLL96M/2=48M,CLKDIV2分频后(48/2)=24,
主时钟2分频输出 24/2=12M, 示波器应该则得频率为12M才对啊!但是现在测得频率是8.33M。

以下是配置的程序:


////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CLK_Init(void)
{
//    CLK_SYSCLK_Divider(10);             //切换主时钟前先将系统时钟降频

//    HIRC_22M1184();                     //选择内部预置的频率
//        
#if 0
        IRCBAND                                //IRC频段选择寄存器 USB时钟选择寄存器 以及频段选择
        HIRCCR              //内部高速IRC控制寄存器
        IRCDB                                //IRC时钟恢复振荡到稳定需要等的时间
        IRCBAND             //IRC频段选择
        IRTRIM                                //IRC频率调整
        USBCLK                                //USB时钟选择寄存器   必须使用内部48M高速IRC
        CLKSEL                                //时钟选择寄存器
        CLKDIV                                //时钟分频寄存器
        
        IRC48MCR                        //内部48M振荡器控制寄存器
        HSCLKDIV                        //高速时钟分频寄存器
        SPI_CLKDIV                        //SPI 时钟分频寄存器
        
        HIRCCR   ENHIRC    //内部高速振荡器寄存器
        
        
        
        
**示例  *****选择22.1184MHz*****        
        CLKDIV = 0x04;               
        IRTRIM = CHIPID11;  //   CHIPID11; 是出厂时的专属校准值  
        VRTRIM = CHIPID13;
        IRCBAND &= ~0x03;
        IRCBAND |= 0x02;
         CLKDIV = 0x00;

*************选择48M***********
        IRC48MCR = 0x80;                //启动内部48M IRC
        while(!(ICR48MCR&1));   //等待时钟稳定
        CLKDIV = 0x02;                        //时钟2分频
        CLKSEL = 0x0C;                        //选择48M
        
        
#endif        
//        IRCBAND = 0X01;   //选择10MHZ 频段  6 10 27 47M
//        CLKDIV = 0x00;
//        
        // AI 8051U 最高工作频率为 42MHZ 高速SPI [5V < 33MHZ  3.3V < 20MHZ]
        P2SR |= 0xF8;      //  P2.7 6 5 4 3 开启快速IO模式

#define                T22M_ADDR        CHIPID11  //22.1184MHz
#define                VRT27M_ADDR        CHIPID23
        
//*****选择22.1184MHz*****        
//        CLKDIV = 0x04;                        // 选择输入 时钟进行分频给系统作为运行频率
        IRTRIM = T22M_ADDR;     //   CHIPID 是出厂时的专属校准值  
        VRTRIM = VRT27M_ADDR;        // 27 M 频段
//        IRCBAND &= ~0x03;
//        IRCBAND |= 0x02;
//         CLKDIV = 0x00;
        
        
        IRCBAND  |= 0x81;  //USB时钟 48M   频段10MHZ        
        USBCLK = 0x00;    //PLL  频段10MHZ           输入1分频 (8-16M)  不追频
//        CLKSEL |= 0x48;          //时钟选择寄存器 PLL 输出96M 为高速时钟源 主时钟PLL/2
    CLKSEL = 0x08;    //选择PLL 输出96M 至CLKDIV
        CLKSEL |= 0x40;
    CLKDIV        = 0x02;          //系统工作时钟分频寄存器 96 / 2 = 48 / 2 = 22.1184
        
        HSCLKDIV = 0x04;                        //高速时钟分频寄存器 96/4 = 24
        SPI_CLKDIV = 0x02;                        //SPI 时钟分频寄存器 24 / 2 = 12
        
        //        IRCBAND                   //IRC频段选择寄存器 USB时钟选择寄存器 以及频段选择
//        IRCBAND  |= 0x81;  //USB时钟 48M   频段10MHZ
        IRC48MCR |= 0x80;  //内部48M振荡器控制寄存器  使能48MHZ
        while(!(IRC48MCR&1));  //等待时钟稳定
        
        HIRCCR = 0x80;    //内部高速IRC控制寄存器 使能  需等 HIRCST ==1 时钟稳定
        while(!(HIRCCR&1));    // 等待时钟稳定

    USBCLK |= 0x80;   //使能PLL   倍频
        delay_ms(1);
        
        
        

        
        
        
        
//    CLK_MCLK_HIRC();                    //选择内部高精度HIRC作为PLL输入时钟
//    CLK_PLL_Output96MHz();              //选择PLL的96M作为PLL的输出时钟
//    CLK_PLL_PreDivider2();              //PLL输入时钟4分频
//    CLK_PLL_Enable();                   //启动PLL
//    delay_ms(1);                        //等待PLL锁频

//    CLK_MCLK2_PLLD2();                  //选择PLL的输出2分频时钟作为主时钟

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

//    CLK_SYSCLKO_SwitchP56();            //设置系统时钟输出端口: MCLKO (P5.6)
//    CLK_SYSCLKO_Divider(2);             //设置系统时钟分频系数

//    CLK_HSIOCK_PLL();                   //选择PLL输出时钟作为高速外设时钟源
//    CLK_HSIOCK_Divider(2);              //设置高速外设时钟预分频系数

//    CLK_SPICLK_Divider(1);              //设置SPI时钟预分频系数
//    CLK_I2SCLK_Divider(1);              //设置I2S时钟预分频系数
//    CLK_PWMACLK_Divider(1);             //设置PWMA时钟预分频系数
//    CLK_PWMBCLK_Divider(1);             //设置PWMB时钟预分频系数
//    CLK_TFPUCLK_Divider(1);             //设置TFPU时钟预分频系数

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



void main(void)
{
    //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
    // 在此添加用户主函数初始化代码
    //<<AICUBE_USER_MAIN_INITIAL_END>>

    SYS_Init();

    //<<AICUBE_USER_MAIN_CODE_BEGIN>>
    // 在此添加主函数中运行一次的用户代码
        
        MCLKOCR  =  0x82; //主时钟输出至P5.6 //  SYSclk/2  =8.33M  示波器500ns  
         
        
    //<<AICUBE_USER_MAIN_CODE_END>>

    while (1)
    {
        USBLIB_OUT_Done();              //查询方式处理USB接收的数据

        //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
        // 在此添加主函数中用户主循环代码
               
                        if(flag_200_ms)
                { flag_200_ms = 0; LED = !LED;

                }
//                delay_ms(300);
//                P2 = 0x80;
//                delay_ms(300);
//                P2 = ~P2;
               
        //<<AICUBE_USER_MAIN_LOOP_END>>
    }
}

////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
    EnableAccessXFR();                  //使能访问扩展XFR
    AccessCodeFastest();                //设置最快速度访问程序代码
    AccessIXramFastest();               //设置最快速度访问内部XDATA
    IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基

    P0M0 = 0x00; P0M1 = 0x00;           //初始化P0口为准双向口模式
    P1M0 = 0x00; P1M1 = 0x00;           //初始化P1口为准双向口模式
    P2M0 = 0x00; P2M1 = 0x00;           //初始化P2口为准双向口模式
    P3M0 = 0x00; P3M1 = 0x00;           //初始化P3口为准双向口模式
    P4M0 = 0x00; P4M1 = 0x00;           //初始化P4口为准双向口模式
    P5M0 = 0x00; P5M1 = 0x00;           //初始化P5口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;           //初始化P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;           //初始化P7口为准双向口模式

//        // AI 8051U 最高工作频率为 42MHZ 高速SPI [5V < 33MHZ  3.3V < 20MHZ]
//        P2SR |= 0xF8;      //  P2.7 6 5 4 3 开启快速IO模式
        
//        
//        CLKSEL &= ~0x80;
//        USBCLK &= 0x60;
//        USBCLK |= 0x00;  // 00 02 04 06  PLL输入分频
//        USBCLK |= 0x80;

    CLK_Init();                       //时钟模块初始化
    TIMER0_Init();                      //定时器0初始化
    USBLIB_Init();                      //USB库初始化

    //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_INITIAL_CODE_END>>

    EnableGlobalInt();                  //使能全局中断
}







回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-9-18 13:24 , Processed in 0.107567 second(s), 50 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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