D1-h裸机下修改主频无效
-
static void set_pll_cpux_axi(void) { uint32_t val; /* Select cpux clock src to osc24m, axi divide ratio is 3, system apb clk ratio is 4 */ //切换CPU时钟源 write32(D1_CCU_BASE + CCU_RISCV_CLK_REG, (0 << 24) | (3 << 8) | (1 << 0)); sdelay(1); /* Disable pll gating */ //关PLL输出门 val = read32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG); val &= ~(1 << 27); write32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG, val); /* Enable pll ldo */ //使能PLL_LDO val = read32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG); val |= (1 << 30); write32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG, val); sdelay(5); /* Set default clk to 1008mhz */ //配置PLL_CPU倍频系数 val = read32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG); val &= ~((0x3 << 16) | (0xff << 8) | (0x3 << 0)); val |= (41 << 8); write32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG, val); /* Lock enable */ //PLL锁使能 val = read32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG); val |= (1 << 29); write32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG, val); /* Enable pll */ //使能PLL val = read32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG); val |= (1 << 31); write32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG, val); /* Wait pll stable */ //等待PLL稳定 while(!(read32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG) & (0x1 << 28))); sdelay(20); /* Enable pll gating */ //使能PLL输出门 val = read32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG); val |= (1 << 27); write32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG, val); /* Lock disable */ //关PLL锁 val = read32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG); val &= ~(1 << 29); write32(D1_CCU_BASE + CCU_PLL_CPU_CTRL_REG, val); sdelay(1); /* Set and change cpu clk src */ //切换时钟源为PLL_CPU val = read32(D1_CCU_BASE + CCU_RISCV_CLK_REG); val &= ~(0x07 << 24 | 0x3 << 8 | 0xf << 0); val |= (0x05 << 24 | 0x1 << 8); write32(D1_CCU_BASE + CCU_RISCV_CLK_REG, val); sdelay(1); }
这是我的修改主频函数
while(1) { for (volatile uint32_t k = 0; k < 3000000; k++) { __asm__("nop"); } gpio_reverse(LIGHT_BLUE); }
这是测试函数,利用小灯翻转速度直观的。
★ CPU 频率测试程序 (LED + mcycle) ★
RISCV_CLK_REG = 0x05000100
PLL_CPU_CTRL = 0xCA002900
CPU_AXI_CFG_REG = 0x00000300我在执行循环前打印出了三个寄存器内容,如上,内容修改成功,但是主频很低,大概3MHz,不管怎么修改寄存器内容或者修改时钟源都不行,都很低。
有什么懂D1裸机主频配置流程的大佬指点一下,是否忽略了什么配置,谢谢。 -
主频很低,大概3MHz 是GPIO翻转的主频吗?
核心最低主频是24MHz,不可能低到3M的D1-H 的 GPIO 是通过 APB 连到 CPU 的,其运行速率与CPU不是同步的
-
@awwwwa 我是这样计算的。开一个毫秒定时器
TMR0_CTRL_REG &=~(0xFF<<0); //reset TMR0_CTRL_REG &=~(0x1<<7); //Periodic mode TMR0_CTRL_REG |=((0x6<<4)|(0x1<<2)); //64 pre-scale,OSC24M TMR0_INTV_VALUE_REG=(uint32_t)(375*time_ms); TMR0_CTRL_REG |=(0x1<<1); //Reload TMR0_CTRL_REG |=(0x1<<0); //start
然后在while循环中两秒计算进行了多少次时钟。
min = gTime[1]; while(gTime[1]-min <=2) { min64++; __asm__("nop"); } printf("1 秒内 mcycle 增加 cycles="); print_uint64(min64); printf("CPU 实际主频 ≈ %d MHz\n", min64 / 2000000ULL); min64 = 0;
最后根据计数算出来的主频就在3M左右,很低,我怀疑时钟寄存器有什么地方忽略了什么配置。
-
for (volatile uint32_t k = 0; k < 3000000; k++) { __asm__("nop"); } gpio_reverse(LIGHT_BLUE);
这个是每3,000,000个时钟信号,翻转一次小灯,我看小灯也就大概一秒多一点翻转一次,可以推测主频就3M左右。
-
@awwwwa 您有什么方法可以用示波器测量输出频率吗?
-
@liuqingchang cpu主频一般不采用外设测量,一般是看寄存器和coremark综合评估
-
@liuqingchang Should you even write anything to CPU_AXI_CFG_REG?
I thought this register is for the ARM core, which is not present in D1, but is present in the base design from which D1 and T113 are derived. -
CPU_AXI_CFG_REG is not active on D1?
It's for ARM core which is present in the original silicon design from D1 and T113 are derived?
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号