嵌入式实操-基于RT1170 支持DVFS(二十八)

本文主要是通过迁移的思维,记录本人初次使用NXP MCUXpresso SDK API进行BSP开发


本文主要记录如何在RT1170上面实现高温降频,首先要说一点就是为什么高温降频.即需要求的来源:
第一,CPU DCDC输出在高温情况下没有办法满足要求。
第二,温度过高会影响CPU的寿命,影响产品的生命周期。

1. 首先查看CPU的时钟树


调整CPU的频率,需要将core clk 切换至其他时钟源,然后在修改对应时钟源,修改且稳定后,再切换至修改频率后的原时钟源。其实对应的内核电压也要调整的。和我们在其它SOC上遇到的DVFS功能本质上是一样的。动态调频高压。如下图所示,这上编写代码依据。

2. SDK api 应用

2.1 引脚配置

NA

2.2 时钟配置

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);}

2.4 验证测试

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  

4. 总结

希望对各位读者帮助。

欢迎订阅
嵌入式实操”一个分享开发实践经验的地方。
文章会同时发布到我的CSDN主页(嵌入式实操的博客_CSDN博客-05-RT1170 开发,06--Am335x,01--RT1052 Aworks 开发领域博主)、今日头条号 平台上。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章