找回密码
 立即注册
查看: 287|回复: 17

AI8051U使用STC配置小工具使用PLL设置的问题

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:18
  • 最近打卡:2026-01-14 15:00:51
已绑定手机

9

主题

30

回帖

263

积分

中级会员

积分
263
发表于 2026-1-12 09:04:23 | 显示全部楼层 |阅读模式
想测试TFPU的加速效果。在代码只默认下载用的40M时钟时,添加TFPU和不添加TFPU有明显的加速提升。用使用STC配置小工具钩上PLL时钟后。反而不能运行。求助      /*---------------------------------------------------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/*---------------------------------------------------------------------*/

/*************  功能说明    **************

本例程基于AI8051U为主控芯片的实验箱进行编写测试.

使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。

edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。

程序使用P0口来演示跑马灯,输出低驱动。

下载时, 选择时钟 24MHZ (用户可自行修改频率).

******************************************/


#include "stdio.h"
#include "intrins.h"
#include <AI8051U.H>
#include "math.h"



typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

volatile float xdata sint1 = 155.1432;
volatile float xdata sint2 = 1.0546;
volatile float xdata xsint;

void UartPutc(unsigned char dat)
{
    SBUF = dat;
    while(TI == 0);
    TI = 0;
}

char putchar(char c)
{
    UartPutc(c);
    return c;
}

//==========================================================================
void Uart1Init(void)        //115200bps@40.000MHz
{
    P3M0  &=~ 0X01;
        P3M1  &=~ 0X02;
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x04;                //定时器时钟1T模式
        T2L = 0xA9;                        //设置定时初始值
        T2H = 0xFF;                        //设置定时初始值
        AUXR |= 0x10;                //定时器2开始计时
        //ES = 1;                 //串口中断允许
}
//=============================================================================
void Uart1Send(u8 dat)
{
         SBUF = dat ; //
         while(TI==0)
           {;}
     TI = 0;  
}

void uart1_send_bytes_to_str(unsigned char *p,unsigned int length) //          // 串口 4 发CR数组里的数据,可以设置长度
{
         unsigned char code zi[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};         
     unsigned int i = 0;
         unsigned char tempH  ;
         unsigned char tempL  ;
         while(i<length)
          {
                        
                 tempH = zi[(*(p+i))>>4];
                 tempL = zi[(*(p+i)&0x0f)];
                       
             Uart1Send(tempH);
                 Uart1Send(tempL);       
                 Uart1Send(' ');       
             i++;                       
         }
}

//======================================================================================

void  delay_ms(u8 ms);
/****************  外部函数声明和外部变量声明 *****************/

void Timer1_Init(void)                //625微秒@40.000MHz
{
        AUXR |= 0x40;                        //定时器时钟1T模式
        TMOD &= 0x0F;                        //设置定时器模式
        TL1 = 0x58;                                //设置定时初始值
        TH1 = 0x9E;                                //设置定时初始值
        TF1 = 0;                                //清除TF1标志
        TR1 = 1;                                //定时器1开始计时
        ET1 = 1;                                //使能定时器1中断
}


//void Clock_Init(void)
//{
//        HSCLKDIV = 0x01;
//        CLKSEL &= ~(3<<2);
//        CLKSEL |= (1<<2);
//        CLKSEL |= (1<<6);                //PLL->高速IO
//        IRC48MCR = 0x80;                //启动内部48M USB时钟
//        while(!(IRC48MCR&1));
//        IRCBAND &= ~(3<<6);
//        IRCBAND |= (2<<6);
//}

void Clock_Init(void)
{
        HSCLKDIV = 0x01;
        USBCLK |= (1<<7);                //打开PLL功能
        USBCLK &= ~(3<<5);
        USBCLK |= (2<<5);
        CLKSEL |= (1<<7);
        CLKSEL &= ~(3<<2);
        CLKSEL |= (1<<2);
        CLKSEL |= (1<<6);                //PLL->高速IO
        IRC48MCR = 0x80;                //启动内部48M USB时钟
        while(!(IRC48MCR&1));
        IRCBAND &= ~(3<<6);
        IRCBAND |= (2<<6);
}



/******************** 主函数 **************************/
void main(void)
{
        u16 i ;
       
    WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
   // EAXFR = 1; //扩展寄存器(XFR)访问使能
        EAXSFR(); //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度
   
       
        Clock_Init();
       
       
    P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
       
        Uart1Init();

        P34 = 1;

        printf("test tpfu\n");
    while(1)
    {
               
                P33 = 0 ;
       
                for(i=0;i<640;i++)
                {
                  xsint = sint1 * sint2 ;  //实测性能提升1倍多
                }
               
                P33 = 1;
                delay_ms(10);
    }
}

//========================================================================
// 函数: void  delay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================

void Delay1ms(void)        //@40.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        _nop_();
        i = 9998UL;
        while (i) i--;
}



void  delay_ms(u8 ms)
{
     u16 i;
    for(i=0;i<ms;i++)
        {
       Delay1ms()        ;//@40.000MHz
        }
}

//============================================================

不使用时钟初始化能正常工作。小工具配置如下


截图202601120905527771.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:18
  • 最近打卡:2026-01-14 15:00:51
已绑定手机

9

主题

30

回帖

263

积分

中级会员

积分
263
发表于 2026-1-12 09:07:11 | 显示全部楼层
主程序加了时钟初始化后,反而不能运行
void Clock_Init(void)
{
        HSCLKDIV = 0x01;
        USBCLK |= (1<<7);                //打开PLL功能
        USBCLK &= ~(3<<5);
        USBCLK |= (2<<5);
        CLKSEL |= (1<<7);
        CLKSEL &= ~(3<<2);
        CLKSEL |= (1<<2);
        CLKSEL |= (1<<6);                //PLL->高速IO
        IRC48MCR = 0x80;                //启动内部48M USB时钟
        while(!(IRC48MCR&1));
        IRCBAND &= ~(3<<6);
        IRCBAND |= (2<<6);
}
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:18
  • 最近打卡:2026-01-14 15:00:51
已绑定手机

9

主题

30

回帖

263

积分

中级会员

积分
263
发表于 2026-1-12 09:08:41 | 显示全部楼层
测试发现选择这个PLL时钟就不能运行,不选PLL时钟的时钟初始化可以运行
截图202601120908399518.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:18
  • 最近打卡:2026-01-14 15:00:51
已绑定手机

9

主题

30

回帖

263

积分

中级会员

积分
263
发表于 2026-1-12 09:10:35 | 显示全部楼层
使用AI8051U 32位模式
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2026-03-20 21:53:40

844

主题

1万

回帖

2万

积分

管理员

积分
22719
发表于 2026-1-12 19:58:01 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:18
  • 最近打卡:2026-01-14 15:00:51
已绑定手机

9

主题

30

回帖

263

积分

中级会员

积分
263
发表于 2026-1-13 09:08:10 | 显示全部楼层
今天搞明白了这个界面的信息。 按个界面配置可以工作了。昨天的配置把CPU内核时钟设成了120M了。所以不能运行。但是有个问题,我按个设置TFPU的速度,跟设置成40M的速度是一样的。通过在示波器界面测量前浮点数计数完P34脚的电平变化,可以以观测到这个设置TFPU速度没有起到加快的作用。120M 和40M是一样的。是哪里设弄错了吗?
截图202601130903578620.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:18
  • 最近打卡:2026-01-14 15:00:51
已绑定手机

9

主题

30

回帖

263

积分

中级会员

积分
263
发表于 2026-1-13 09:12:17 | 显示全部楼层
#include "stdio.h"
#include "intrins.h"
#include <AI8051U.H>
#include "math.h"

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

volatile float xdata sint1 = 155.1432;
volatile float xdata sint2 = 1.0546;
volatile float xdata xsint;

void UartPutc(unsigned char dat)
{
    SBUF = dat;
    while(TI == 0);
    TI = 0;
}

char putchar(char c)
{
    UartPutc(c);
    return c;
}

//==========================================================================
void Uart1Init(void)        //115200bps@40.000MHz
{
    P3M0  &=~ 0X01;
        P3M1  &=~ 0X02;
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x04;                //定时器时钟1T模式
        T2L = 0xA9;                        //设置定时初始值
        T2H = 0xFF;                        //设置定时初始值
        AUXR |= 0x10;                //定时器2开始计时
        //ES = 1;                 //串口中断允许
}
//=============================================================================
void Uart1Send(u8 dat)
{
         SBUF = dat ; //
         while(TI==0)
           {;}
     TI = 0;  
}

void  delay_ms(u8 ms);
/****************  外部函数声明和外部变量声明 *****************/

void Timer1_Init(void)                //625微秒@40.000MHz
{
        AUXR |= 0x40;                        //定时器时钟1T模式
        TMOD &= 0x0F;                        //设置定时器模式
        TL1 = 0x58;                                //设置定时初始值
        TH1 = 0x9E;                                //设置定时初始值
        TF1 = 0;                                //清除TF1标志
        TR1 = 1;                                //定时器1开始计时
        ET1 = 1;                                //使能定时器1中断
}



//void Clock_Init(void)  //120M TPFU
//{
//        HSCLKDIV = 0x01;
//        SPI_CLKDIV = 0x04;
//        I2S_CLKDIV = 0x02;
//        USBCLK |= (1<<7);                //打开PLL功能
//        USBCLK &= ~(3<<5);
//        USBCLK |= (2<<5);
//        CLKSEL |= (1<<7);
//        CLKSEL |= (1<<6);                //PLL->高速IO
//        IRC48MCR = 0x80;                //启动内部48M USB时钟
//        while(!(IRC48MCR&1));
//        IRCBAND &= ~(3<<6);
//        IRCBAND |= (2<<6);
//}

void Clock_Init(void) //TPFU 40M
{
        HSCLKDIV = 0x01;
        SPI_CLKDIV = 0x04;
        I2S_CLKDIV = 0x02;
        TFPU_CLKDIV = 0x03;
        USBCLK |= (1<<7);                //打开PLL功能
        USBCLK &= ~(3<<5);
        USBCLK |= (2<<5);
        CLKSEL |= (1<<7);
        CLKSEL |= (1<<6);                //PLL->高速IO
        IRC48MCR = 0x80;                //启动内部48M USB时钟
        while(!(IRC48MCR&1));
        IRCBAND &= ~(3<<6);
        IRCBAND |= (2<<6);
}



/******************** 主函数 **************************/
void main(void)
{
        u16 i ;
       
    WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
   // EAXFR = 1; //扩展寄存器(XFR)访问使能
        EAXSFR(); //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度
   
       
        Clock_Init();
       
       
    P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
       
        Uart1Init();

        P34 = 1;

        printf("test tpfu\n");
    while(1)
    {
               
                P33 = 0 ;
       
                for(i=0;i<640;i++)
                {
                  xsint = sint1 * sint2 ;  //实测性能提升1倍多
                }
               
                P33 = 1;
                delay_ms(10);
    }
}

//========================================================================
// 函数: void  delay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================

void Delay1ms(void)        //@40.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        _nop_();
        i = 9998UL;
        while (i) i--;
}



void  delay_ms(u8 ms)
{
     u16 i;
    for(i=0;i<ms;i++)
        {
       Delay1ms()        ;//@40.000MHz
        }
}

//============================================================
截图202601130909486524.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:18
  • 最近打卡:2026-01-14 15:00:51
已绑定手机

9

主题

30

回帖

263

积分

中级会员

积分
263
发表于 2026-1-13 09:13:14 | 显示全部楼层
有添加TFPU库
截图202601130913013873.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:18
  • 最近打卡:2026-01-14 15:00:51
已绑定手机

9

主题

30

回帖

263

积分

中级会员

积分
263
发表于 2026-1-13 09:22:27 | 显示全部楼层
不管怎么设置,不设置,直接屏蔽时钟初始化的代码,都是是这个时间。如何始TPFU时钟生效,求助!
截图202601130922199615.jpg

点评

[attachimg]128925[/attachimg] 修改后,时钟源是没问题的 只是TFPU外设需要这一句额外设置切换到120MHz DMAIR = 0x3f;  详情 回复 发表于 2026-1-13 16:16
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2026-03-20 21:53:40

844

主题

1万

回帖

2万

积分

管理员

积分
22719
发表于 2026-1-13 15:56:46 | 显示全部楼层

用最新 ISP 软件中的 AiCube 图形化配置,自动生成程序框架

截图202601131554101734.jpg


截图202601131555491332.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-24 08:32 , Processed in 0.115884 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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