中断优先级
GIC 控制器最多可以支持 256 个优先级,数字越小,优先级越高Cortex-A7 选择了 32 个优先级。在使用中断的时候需要初始化 GICC_PMR 寄存器,此寄存器用来决定使用几级优先级, GICC_PMR 寄存器只有低 8 位有效,这 8 位最多可以设置 256 个优先级,但是由于我们使用的Cortex-A7只有32个优先级,所以还不得不按照GIC手册第131页的说明对 GICC_PMR 进行设置。

数字越小中断优先级越高
//设置中断优先级
GIC_SetPriority(GPIO1_Combined_16_31_IRQn,0);
typedef void(*irq_handler_t)(void);
irq_handler_t interrupt_vector_table[160];
//注册中断函数
void system_interrupt_register(int num,irq_handler_t handle)
{
interrupt_vector_table[num]=handle;
}
//irq服务函数
void system_interrupt_handler(int num)
{
if(interrupt_vector_table[num] != NULL)
{
interrupt_vector_table[num]();
}
}
定义一个指向空的函数指针,定义一个成员为函数指针的数组,存放的是160个中断源。注册中断函数,将中断处理函数注册到向量表中,根据中断号,调用对应的处理函数。
时钟树
时钟树 是芯片内部所有时钟信号的分配网络,它从 PLL 产生的高频时钟出发,经过分频、开关、门控等处理,最终供给 CPU、总线、外设等各个模块。
晶振电路

PLL
PLL(Phase-Locked Loop,锁相环) 是芯片内部的一个关键电路模块,用来生成稳定的高频时钟信号 。它可以把一个低频的参考时钟(如 24MHz 晶振)倍频到更高的频率(如 800MHz、1GHz),供 CPU、总线、外设使用。

N为倍频因子,为整数
Prescaler
Prescaler(预分频器) 是一个用于降低信号频率的硬件模块,将高频时钟信号分频为较低频率的信号,供定时器、计数器等外设使用。

M为分频因子,为整数
PFD
PFD(Phase Frequency Detector,相位分数分频器) 是 PLL(锁相环)内部最核心的模块之一,用于比较输入参考时钟和反馈时钟之间的相位差 和频率差 ,并输出控制信号来调整振荡器频率。既可以倍频 也可以降频

结果大于1为倍频,小于1为降频。需要注意的是,虽然 N 和 M 必须为整数,但它们相除的结果可以是小数,从而实现对时钟频率的灵活调整
IMX6ULL时钟树



arm内核时钟配置

先配置旁路时钟,让片上系统的电平传进去,pll1输出暂时改为step_clk,让arm暂时工作在24mhz,防止内核因频率上升过快导致故障,然后配置好二分频和倍频因子,最后改为pll1_main
void clock_init(void)
{
unsigned int t=0;
//step_clk:soc_clk
CCM->CCSR &= ~(1<<8);
//将pll输出改为step
CCM->CCSR |=(1<<2);
t=CCM_ANALOG->PLL_ARM;
//选择24mhz
t &=~(3<<14);
//使能时钟输出
t |=(1<<13);
//先把DIV清0再写入倍数
t &=~(0x7F<<0);
t |=(88<<0);
CCM_ANALOG->PLL_ARM=t;
//设置2分频
CCM->CACRR |=(1<<0);
//pll输出改为pll1_mian
CCM->CCSR |=(1<<8);
}
system时钟配置
//2.PLL2:PFD0 PFD1 PFD2 PFD3
t=CCM_ANALOG->PFD_528;
//PFD清0
t &=~((0x3F<<0) |(0x3F<<8)|(0x3F<<16)|(0x3F<<24));
//使能
t &=~((1<<7) |(1<<15)|(1<<23)|(1<<31));
//设置pfd
t |=(27<<0)|(16<<8)|(24<<16)|(32<<24);
CCM_ANALOG->PFD_528=t;
USB时钟配置
//3.PLL3: PFD0 PFD1 PFD2 PFD3
t=CCM_ANALOG->PFD_480;
//PFD清0
t &=~((0x3F<<0) |(0x3F<<8)|(0x3F<<16)|(0x3F<<24));
//使能
t &=~((1<<7) |(1<<15)|(1<<23)|(1<<31));
//设置pfd
t |=(24<<0)|(12<<8)|(17<<16)|(19<<24);
CCM_ANALOG->PFD_480=t;
设置三个根时钟
//设置3个根时钟
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;
qs
- PLL、Prescaler、PFD的作用分别是什么?
PLL锁相环,用于生成高频的时钟信号,PFD相位分数分频器,用于比较输入参考时钟和反馈时钟之间的相位差 和频率差 ,并输出控制信号来调整振荡器频率。既可以倍频 也可以降频,Prescaler预分频器,用于降低频率
-
SOC时钟配置你做了哪些工作?
-
GIC支持多少个优先级?IMX6ULL中支持多少个优先级?
GICv2 架构可配置的范围最大是 256 个,而 i.MX6ULL 这颗芯片实际实现的优先级个数是 32 个。