ARMday06-IMX6ULL-CCM clock tree

📅 2026/7/24 19:21:35 👁️ 阅读次数 📝 编程学习
ARMday06-IMX6ULL-CCM clock tree

SOC时钟配置你做了哪些工作

首先在时钟树上配置arm线,arm线不能直接运行,因为24Mhz到996Mhz会导致死机等故障所以通过MMU先在另一条线上配置好后通过MMU切换到主线路上

然后配置PLL下的PFD,有两个型号528和480,他们分别有四个不同频率的分支需要单独配置,配置完后根据时钟图从左向右通过查手册依次配置三个根时钟

GIC支持多少个优先级?IMX6ULL中支持多少个优先级?

GIC 优先级字段为 8bit(0~255),最多 256 个优先级(8 位全部实现)。

IMX6ULL:32

.MX6ULL 搭载 Cortex-A7 内核,集成GICv2 中断控制器,NXP 硬件实际仅实现了5 位有效优先级位

时钟配置所需:

PLL:锁相环(倍频)

Prescaler:预分频器(分频)

PFD:phased fraction divder 相位分数分频器(倍频/降频)

配置arm-soc上-时钟树时按照芯片手册时钟树如图所示:

先配置ARM clocks

配置时需注意arm-clocks上,先配置step_clk osc_clk线 再由MUX切换到pll1_main_clk运行

不能直接从 24MHz 切 996MHz PLL,必须走过渡 step_clk 中转

直接跨大频率切换会产生时钟毛刺,导致 ARM 寄存器、流水线逻辑时序违规,程序跑飞、死机

2.配置PFD_528和PFD_480按照固定频率根据手册置位

设置完毕后从左至右通过MMU配置三个根时钟

至此配置完毕。

完整代码

void clock_init(void) { unsigned int t=0; CCM->CCSR &=~(1<<8); CCM->CCSR|=(1<<2); //单独配置arm-clock t=CCM_ANALOG->PLL_ARM; t&=~(3<<14); t|=(1<<13); t&=~(0x7F<<0); t|=(88<<0); CCM_ANALOG->PLL_ARM=t; CCM->CACRR|=(1<<0); //回到原路 CCM->CCSR&=~(1<<2); //配置PFD_528 t=CCM_ANALOG->PFD_528; t&=~((0x3F<<0)|(0x3F<<8)|(0x3F<<16)|(0x3F<<24)); t&=~((1<<7)|(1<<15)|(1<<23)|(1<<31)); t|=(27<<0)|(16<<8)|(24<<16)|(32<<24); CCM_ANALOG->PFD_528=t; 配置PFD_480 t=CCM_ANALOG->PFD_480; t&=~((0x3F<<0)|(0x3F<<8)|(0x3F<<16)|(0x3F<<24)); t&=~((1<<7)|(1<<15)|(1<<23)|(1<<31)); t|=(12<<0)|(16<<8)|(17<<16)|(19<<24); CCM_ANALOG->PFD_480=t; t=CCM->CBCMR; t&=~(3<<18); t|=(1<<18); CCM->CBCMR=t; t=CCM->CBCDR; t&=~(1<<25); t&=~(7<<10)|(3<<8); t|=(2<<10)|(1<<8); CCM->CBCDR=t; t=CCM->CSCMR1; t&=~(1<<6); t&=~(0x3F<<0); CCM->CSCMR1=t; // 使能外设时钟 enable_clock(); }