如何设置TFPU时钟源为PLL时钟96MHz / 120MHz | 已在完善演示程序的说明
最近写了一个包含浮点运算的函数void calc_ccr2(void),在AI8051U上跑,目标运算时间不大于15US。通过 P02 = ~P02;
calc_ccr2();
P02 = ~P02;
用逻辑分析仪抓取运算时间。
使用30MHZ的系统时钟:
1,用C251的软件库,耗时61us
2,用论坛里老许的STC32G_MDU32.LIB库函数,耗时53.4us
3,使用AI8051U_32_TFPU_V1.0.LIB硬件库函数,耗时17us。
想着设置TFPU时钟源为96MHZ,烧录时设置频率为24MHZ。代码为:
#define CKMS 0x80
#define PCKI_MSK 0x60
#define PCKI_D1 0x00
#define PCKI_D2 0x20
#define PCKI_D4 0x40
#define PCKI_D8 0x60
void main(void)
{
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
//选择PLL输出时钟
CLKSEL &= ~CKMS; //默认选择PLL的96M作为PLL的输出时钟
#define FOSC 24000000UL
//选择PLL输入时钟分频,保证输入时钟为12M
USBCLK &= ~PCKI_MSK;
#if (FOSC == 12000000UL)
USBCLK |= PCKI_D1; //PLL输入时钟1分频
#elif (FOSC == 24000000UL)
USBCLK |= PCKI_D2; //PLL输入时钟2分频
#elif (FOSC == 48000000UL)
USBCLK |= PCKI_D4; //PLL输入时钟4分频
#elif (FOSC == 96000000UL)
USBCLK |= PCKI_D8; //PLL输入时钟8分频
#else
USBCLK |= PCKI_D1; //默认PLL输入时钟1分频
#endif
//启动PLL
USBCLK |= 0x80;//ENCKM; //使能PLL倍频
delay(); //等待PLL锁频
//DMAIR = 0x3e; //选择 系统时钟 为TFPU时钟源
DMAIR = 0x3f; //选择 PLL时钟 为TFPU时钟源
InitGpio(); //初始化GPIO工作模式
while(1)
{
...
...
...
}
}
烧录时设置频率为24MHZ,结果抓取运算时间为37us.
问:该如何设置 系统时钟 为30MHZ, TFPU时钟 为96MHZ ?
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=10791
CPU 跑 36.864MHz
36.864MHz / 4 给 PLL时钟输入 = 9.216MHz
9.216MHz * 12 = 110.592MHz
本帖最后由 DebugLab 于 2024-9-13 23:35 编辑
系统时钟24MHz,PCKI 2分频 或 系统时钟48MHz,PCKI 4分频,PLL*8,12MHz*8=96MHz
或
系统时钟16MHz,PCKI 2分频 或 系统时钟32MHz,PCKI 4分频,PLL*12,8MHz*12=96MHz
我一楼的代码就是按照上面的代码写的,可惜不成功。 DebugLab 发表于 2024-9-13 15:02
系统时钟40MHz,PCKI 4分频,PLL * 12
10MHz * 12 = 120MHz
10MHz * 8 =96MHz
这个方案比较好,可怎么实现? DebugLab 发表于 2024-9-13 15:02
系统时钟40MHz,PCKI 4分频,PLL * 12
10MHz * 12 = 120MHz
10MHz * 8 =96MHz
不是12*8=96吗? 杨为民 发表于 2024-9-13 20:52
这个方案比较好,可怎么实现?
经过反复确认,1楼的代码能够实现96Mhz的PLL时钟,。
问题是: 代码的运行时间反而变慢 。......... 好无语呀!
可能 异步时钟切换需要消耗一定时间,而不是无缝快速切换。
将主频改为35Mhz, 取消PLL时钟。TFPU使用系统时钟,抓取的运行时间为14us。
结帖。 DebugLab 发表于 2024-9-13 23:06
谢谢