硬件9 arm时钟树

中断优先级
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

  1. PLL、Prescaler、PFD的作用分别是什么?

PLL锁相环,用于生成高频的时钟信号,PFD相位分数分频器,用于比较输入参考时钟和反馈时钟之间的相位差频率差 ,并输出控制信号来调整振荡器频率。既可以倍频 也可以降频,Prescaler预分频器,用于降低频率

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

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

GICv2 架构可配置的范围最大是 256 个,而 i.MX6ULL 这颗芯片实际实现的优先级个数是 32 个。

相关推荐
武汉万象奥科3 小时前
万象奥科OpenHarmony 6.1 LTS适配完成,RK3576核心板再添新生态
arm开发·嵌入式硬件·物联网·rk3576·arm核心板
治愈系贝壳7 小时前
ARM --- day 6 时钟
linux·arm开发·学习
华清远见IT开放实验室1 天前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
执迷不悟8231 天前
ARM--按键/中断
arm开发
维基框架1 天前
汽车座舱开发上云 Google的Arm实例解决了什么实际问题
arm开发·人工智能·汽车
Discipline~Hai3 天前
ARM01-ARM体系架构
linux·c语言·arm开发·架构
weixin_446260853 天前
ARM++:面向深度伪造检测器的多域智能体协同可迁移对抗攻击框架
arm开发·人工智能
执迷不悟8233 天前
ARM--启动实现LED
arm开发
linux修理工4 天前
在 ARM 架构的 Armbian 系统上搭建 Strudel 开发环境
arm开发