导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    D1-h裸机下修改主频无效

    其它全志芯片讨论区
    3
    8
    264
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • L
      LiuQingchang LV 4 最后由 编辑

      
      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裸机主频配置流程的大佬指点一下,是否忽略了什么配置,谢谢。

      B 1 条回复 最后回复 回复 引用 分享 0
      • A
        awwwwa LV 8 最后由 编辑

        主频很低,大概3MHz 是GPIO翻转的主频吗?
        核心最低主频是24MHz,不可能低到3M的

        D1-H 的 GPIO 是通过 APB 连到 CPU 的,其运行速率与CPU不是同步的

        L 3 条回复 最后回复 回复 引用 分享 0
        • L
          LiuQingchang LV 4 @awwwwa 最后由 编辑

          @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左右,很低,我怀疑时钟寄存器有什么地方忽略了什么配置。

          1 条回复 最后回复 回复 引用 分享 0
          • L
            LiuQingchang LV 4 @awwwwa 最后由 编辑

            @awwwwa

                    for (volatile uint32_t k = 0; k < 3000000; k++) {
                        __asm__("nop");
                    }
                    gpio_reverse(LIGHT_BLUE);     
            

            这个是每3,000,000个时钟信号,翻转一次小灯,我看小灯也就大概一秒多一点翻转一次,可以推测主频就3M左右。

            1 条回复 最后回复 回复 引用 分享 0
            • L
              LiuQingchang LV 4 @awwwwa 最后由 编辑

              @awwwwa 您有什么方法可以用示波器测量输出频率吗?

              A 1 条回复 最后回复 回复 引用 分享 0
              • A
                awwwwa LV 8 @LiuQingchang 最后由 编辑

                @liuqingchang cpu主频一般不采用外设测量,一般是看寄存器和coremark综合评估

                1 条回复 最后回复 回复 引用 分享 0
                • B
                  bacteria LV 2 @LiuQingchang 最后由 编辑

                  @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.

                  1 条回复 最后回复 回复 引用 分享 0
                  • B
                    bacteria LV 2 最后由 编辑

                    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?

                    1 条回复 最后回复 回复 引用 分享 0
                    • 1 / 1
                    • First post
                      Last post

                    Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

                    行为准则 | 用户协议 | 隐私权政策