ARMday06-IMX6ULL-CCM clock tree
📅 2026/7/24 19:21:35
👁️ 阅读次数
📝 编程学习
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(); }
编程学习
技术分享
实战经验