本文主要记录如何在RT1170上面实现高温降频,首先要说一点就是为什么高温降频.即需要求的来源:
第一,CPU DCDC输出在高温情况下没有办法满足要求。
第二,温度过高会影响CPU的寿命,影响产品的生命周期。
调整CPU的频率,需要将core clk 切换至其他时钟源,然后在修改对应时钟源,修改且稳定后,再切换至修改频率后的原时钟源。其实对应的内核电压也要调整的。和我们在其它SOC上遇到的DVFS功能本质上是一样的。动态调频高压。如下图所示,这上编写代码依据。
NA
static void kCLOCK_Root_M7_800MHz(void){ const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN = { .postDivider = kCLOCK_PllPostDiv2, /* Post divider, 0 - DIV by 2, 1 - DIV by 4, 2 - DIV by 8, 3 - DIV by 1 */ .loopDivider = 133, /* DIV_SELECT */ }; clock_root_config_t rootCfg = {0}; CLOCK_InitArmPll(&armPllConfig_BOARD_BootClockRUN); rootCfg.mux = kCLOCK_M7_ClockRoot_MuxArmPllOut; rootCfg.div = 1; CLOCK_SetRootClock(kCLOCK_Root_M7, &rootCfg); /* 24MHz * 133 / 2 / 2 / 1 = 798 MHz */}static void kCLOCK_Root_M7_600MHz(void){ const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN = { .postDivider = kCLOCK_PllPostDiv4, /* Post divider, 0 - DIV by 2, 1 - DIV by 4, 2 - DIV by 8, 3 - DIV by 1 */ .loopDivider = 200, /* DIV_SELECT */ }; clock_root_config_t rootCfg = {0}; CLOCK_InitArmPll(&armPllConfig_BOARD_BootClockRUN); rootCfg.mux = kCLOCK_M7_ClockRoot_MuxArmPllOut; rootCfg.div = 1; CLOCK_SetRootClock(kCLOCK_Root_M7, &rootCfg); /* 24MHz * 200 / 4 / 2 / 1 = 600 MHz */}static void kCLOCK_Root_M7_16MHz(void){ clock_root_config_t rootCfg = {0}; rootCfg.mux = kCLOCK_M7_ClockRoot_MuxOscRc16M; rootCfg.div = 1; CLOCK_SetRootClock(kCLOCK_Root_M7, &rootCfg);}int32_t misc_fn(int32_t argc, char** argv) { int duty_cycle =0; int cpu_freq = 0; if(argc == 2){ if(strstr(argv[1],"wdog1_init") != NULL){ PRINTF("wdog1_init init\r
"); bsp_wdog1_init(); }else if(strstr(argv[1],"wdog1_feed") != NULL){ bsp_feed_wdog1(); }else if(strstr(argv[1],"tempsensor_init") != NULL){ bsp_tempsensor_init(); }else if(strstr(argv[1],"tempsensor_dump") != NULL){ bsp_dump_tempsensor(); }else if(strstr(argv[1],"dump_cmd") != NULL){ lwshell_dump_cmd(); }else if(strstr(argv[1],"cpu_load") != NULL){ extern void CPU_Task(void* parameter); CPU_Task(NULL); }else if(strstr(argv[1],"reset") != NULL){ NVIC_SystemReset(); }else if(strstr(argv[1],"xPortGetFreeHeapSize") != NULL){ PRINTF("mem free: %d \r
",xPortGetFreeHeapSize()); }else if(strstr(argv[1],"dump_freq") != NULL){ extern void bsp_dump_main_root_clock_info(void); bsp_dump_main_root_clock_info(); }else if(strstr(argv[1],"freq_600m") != NULL){ DCDC_SetVDD1P0BuckModeTargetVoltage(DCDC, kDCDC_1P0BuckTarget1P0V); kCLOCK_Root_M7_16MHz(); kCLOCK_Root_M7_600MHz(); }else if(strstr(argv[1],"freq_800m") != NULL){ DCDC_SetVDD1P0BuckModeTargetVoltage(DCDC, kDCDC_1P0BuckTarget1P125V); kCLOCK_Root_M7_16MHz(); kCLOCK_Root_M7_800MHz(); }else{ misc_cmd_usage(); } } }测试的log
shell->>>misc freq_600mshell->>>_600mshell->>>misc dump_freqkCLOCK_CpuClk clock 600000000 kCLOCK_ArmPll clock 600000000 kCLOCK_SysPll1 clock 1000000000 kCLOCK_SysPll2 clock 528000000 kCLOCK_SysPll3 clock 480000000 kCLOCK_SysPll2Out clock 528000000 kCLOCK_SysPll2Pfd1 clock 327724128 kCLOCK_SysPll3Pfd0 clock 664615368 kCLOCK_Root_Semc clock 163862064 kCLOCK_Root_Flexspi1 clock 132000000 shell->>>misc freq_800mshell->>>_800mshell->>>misc dump_freqkCLOCK_CpuClk clock 798000000 kCLOCK_ArmPll clock 798000000 kCLOCK_SysPll1 clock 1000000000 kCLOCK_SysPll2 clock 528000000 kCLOCK_SysPll3 clock 480000000 kCLOCK_SysPll2Out clock 528000000 kCLOCK_SysPll2Pfd1 clock 327724128 kCLOCK_SysPll3Pfd0 clock 664615368 kCLOCK_Root_Semc clock 163862064 kCLOCK_Root_Flexspi1 clock 132000000 希望对各位读者帮助。
欢迎订阅
“嵌入式实操”一个分享开发实践经验的地方。
文章会同时发布到我的CSDN主页(嵌入式实操的博客_CSDN博客-05-RT1170 开发,06--Am335x,01--RT1052 Aworks 开发领域博主)、今日头条号 平台上。
| 留言与评论(共有 0 条评论) “” |