2440 时钟设置

首先需要知道时钟的概念:
1、是用来同步系统信号;
就举例来说:
如果你cpu用i2c传输一个数据给从机设备,那么你传输数据时从设备怎么知道数据有没有到达,多久检测一次数据线??这个就需要时钟同步,起的作用就是我cpu传输一位数据就有一位时钟触发从设备;
2、
2440soc这么多器件时钟是如何分配??
目的
配置cpu时钟为 400M AHB 100M APB 50M

2440系统时钟分配:
晶振->锁相环(主MPLL)->分频得到 Fclk Hclk Pclk ;
在这里插入图片描述
2440时钟:
Operating Frequency
· Fclk Up to 400MHz cpu运行时钟
· Hclk Up to 136MHz 给AHB总线上挂载的设备提供时钟
· Pclk Up to 68MHz 给APH总线挂载的设备停工时钟;

时钟来源:

在这里插入图片描述
由上图可知:
时钟来源可以有两个:
1、外部引脚提供时钟信号 EXTCLK
2、晶振提供时钟信号 XTIpll
经过OM[3:2]配置数据那种时钟源如下图(使用的板子是将OM[3:2]都接地,所以是晶振(12M)提供时钟):
在这里插入图片描述
3、经过主锁相环(MPLL)->FCLK(给cpu ARM920T)->HDIVN->HCLK AHB总线
主锁相环(MPLL)->FCLK(给cpu ARM920T)->->PDIVN->PCLK APB总线
Usb锁相环(UPLL)单独给usb评率配置;

如何设置cpu等其他外围器件的时钟?
1、步骤
(1)OM硬件接地已经确定;需要配置MPLL,配置MPLL需要用到P:M:S看下什么是PMS
这个是锁相环PLL 晶振输入对应输出评率时 MPS的取值对应表;
如我们晶振12M要输出FCLK400M M:P:S=92:1:1
在这里插入图片描述
利用公式:
Mpll = (2 * m * Fin) / (p * 2S)
m = (MDIV + 8), p = (PDIV + 2), s = SDIV
得到对应的MPLL值写入MPLLCON寄存器;
在这里插入图片描述
(2)配置HDIVN PDIVN 是在CLKDIVN寄存器中
在这里插入图片描述
我们目的是配置cpu时钟为 400M , AHB=100M , APB=50M
通过配置HDIVN配置为10,确定CADMIVN==0 得到HCLK
通过配置PDIV配置为1 得到PCLK

之后就是代码了:


.text
.global _start
_start:
	/* 关闭看门狗 */
	ldr r0, =53000000
	ldr r1, =0
	str r1,[r0]


/* 设置 CLKDIVN=0x4C000014  HCLK =FCLK/4  PCLK=HCLK/2
 * HDIVN[2:1] =10  PDIVN[0] = 1
*/
	ldr r0, =0x4C000014  //吧0x4C000014存入r0 
	ldr r1, =0x5
	str r1, [r0]              //r1的值0x5写入0x4C000014

/* 设置锁定时间 locktime 0x4C000000  默认锁定时间 */
	ldr r0, =0x4C000000
	ldr r1, =0xFFFFFFFF
	str r1, [r0]
/* 设置cpu 工作模式 */	
	mrc p15,0,r0,c1,c0,0
	orr r0,r0,#0xc0000000
	mcr p15,0,r0,c1,c0,0
/*设置锁相环输出频率为 400M */
	ldr r0, =0x4C000004
	ldr r1, =(92<<12)|(1<<4)|(1<<0)
	str r1, [r0]

	/* 设置内存: sp 栈 */
	/* 分辨是nor/nand启动
	 * 写0到0地址, 再读出来
	 * 如果得到0, 表示0地址上的内容被修改了, 它对应ram, 这就是nand启动
	 * 否则就是nor启动
	 */
	/*mov r1, #0
	ldr r0, [r1] /* 读出原来的值备份 */
	str r1, [r1] /* 0->[0] */ 
	ldr r2, [r1] /* r2=[0] */
	cmp r1, r2   /* r1==r2? 如果相等表示是NAND启动 */
	*/
	ldr sp, =0x4096 /* 先假设是nor启动 */
	
	b main
	moveq sp, #4096  /* nand启动 */
	streq r0, [r1]   /* 恢复原来的值 */
	
halt:
	b halt
		

c代码测试程序: 通过不同的频率查看led闪烁的时间间隔;


/* 配置输出方式寄存器*/
#define GPFCON   (*(volatile unsigned int *)0x56000050)  
#define GPFDAT   (*(volatile unsigned int *)0x56000054)  

void delay(int cnt)
{
	while(cnt--);
}

int main(void)
{
	
	GPFCON = 0x500;
	
		GPFDAT =0;
		delay(100000);
		GPFDAT =0xF0;
		
				delay(100000);
		GPFDAT =0;
		delay(100000);
		GPFDAT =0xF0;	
		return 0;

}
all:
	arm-linux-gcc -c -o led_on.o led_on.c
	arm-linux-gcc -c -o clock.o clock.S
	arm-linux-ld -Ttext 0 clock.o led_on.o -o led_on.elf
	arm-linux-objcopy -O binary -S led_on.elf led_on.bin
	arm-linux-objdump -D led_on.elf > led_on.dis
clean:
	rm *.bin *.o *.elf *.dis
	
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LTC2440是一款高精度的24位模数转换器芯片,其驱动程序主要用于控制和配置LTC2440芯片,以便在嵌入式系统中进行模数转换操作。 LTC2440驱动程序的主要功能包括:初始化LTC2440芯片、配置转换参数、读取转换结果和处理转换数据。 首先,在初始化阶段,驱动程序需要通过与LTC2440芯片通信,设置相关寄存器和引脚,并进行芯片的初始化。这一步骤通常包括选择转换模式、设置参考电压、配置时钟等。 其次,驱动程序需要根据应用的需求,配置转换参数。这些参数包括转换增益、采样率、滤波器等。配置参数的目的是为了提高转换精度和系统性能,在不同的应用场景下可以根据需求进行调整。 然后,驱动程序可以读取LTC2440芯片转换的结果。通过读取转换结果,可以获得通过模拟输入信号转换获得的数字数据。读取转换结果后,通常会进行一些数据处理,包括校准、滤波和其他算法,以获得最终的有效数据。 最后,驱动程序还可以提供一些额外的功能,如中断处理、数据缓存、错误处理等。这些功能可以增强系统的稳定性和可靠性,并方便开发者进行进一步的数据处理和分析。 总之,LTC2440驱动程序是一个关键的组件,用于控制和管理LTC2440芯片的模数转换操作。通过合理配置和使用驱动程序,可以实现高精度的模数转换,满足各种应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值