硬件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 个。

相关推荐
Awh-19 小时前
ARM 裸机开发 DAY9 学习笔记
arm开发·笔记·学习
en.en..21 小时前
8086、x86、ARM 结构化详解
arm开发
sunoo-2291 天前
嵌入式Linux驱动学习笔记(第3-6天):从misc封装、platform总线到设备树、中断与单总线外设实战
linux·arm开发·驱动开发·笔记·单片机·学习
半杯咖啡半行码2 天前
STM32之ARM通用汇编指令详解:从指令格式到寻址方式
汇编·arm开发·stm32
szxinmai主板定制专家2 天前
基于RK3588+FPGA+AI的储能电站边缘网关,实现电力数据采集与智能预警
arm开发·人工智能·fpga开发·rk3576·半导体设备
XMAIPC_Robot2 天前
储能控制器产品化:ARM+FPGA整机高低温、EMC可靠性测试实战总结
arm开发·人工智能·fpga开发·arm+fpga·rk3588+fpga
半杯咖啡半行码2 天前
ARM交叉编译环境搭建与Qt源码编译移植全过程详解
arm开发
XMAIPC_Robot2 天前
FPGA+ARM联合调试避坑:储能电力采样数据同步、丢包问题定位与根治方案,应用于储能EMS、微网控制器中
arm开发·人工智能·fpga开发·rk3588+fpga·rk3576+fpga
幼儿园蛋小黄3 天前
从设备树到 ARM 驱动:嵌入式 Linux 驱动开发学习总结
linux·arm开发·驱动开发