电子说
前言
这篇主要介绍arm9时钟与定时器方面,根据s3c2440手册第七章的内容来看,涉及到不少的知识点,power管理、时钟、usb时钟、camera等,接下来只介绍时钟方面,其余部分以后再说
简介
系统时钟是整个电路的心脏,了解系统时钟结构对于后面学习定时器,UART等使用具有非常重要的作用,总体来说,与s3c2440处理器有关的时钟主要有4种: FIN, FCLK, HCLK和PCLK 1.FIN:外部输入晶振频率 2.FCLK: 主要用于CPU核 3.HCLK:主要用于与AHB总线互连的设备(如存储控制器, LCD控制器, 中断控制器及DMA等)上 4.PCLK:主要用于与APB总线互连的低速设备(如定时器, UART, ADB等)上
图解时钟
s3c2440处理器系统时钟分为两个部分, 外部有时钟输入引脚,内部用2个锁相环将外部输入时钟倍频到处理器工作说需要的时钟, 外部时钟频率太高容易受到外部的干扰,因此一般外部时钟频率比较低, 如下图:
■CLKDIVN:用于控制FCLK, HCLK和PCLK之间的比例关系
// LOCKTIME = 0x00ffffff; // 使用默认值即可,在下面会讨论CLKDIVN = 0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1/* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */__asm__("mrc p15, 0, r1, c1, c0, 0\n" /* 读出控制寄存器 */ "orr r1, r1, #0xc0000000\n" /* 设置为“asynchronous bus mode” */"mcr p15, 0, r1, c1, c0, 0\n" /* 写入控制寄存器 */); MPLLCON = ((0x5c<<12)|(0x04<<4)|(0x01))
上面代码注释中,关于LOCKTIME的赋值,这个又是怎么回事儿呢,还是根据手册
1
2
3
4
5
6
7
8
9
10
定时器 由上面可知,定时器是ABP总线设备,在PCLK的时钟频率下工作,s3c2440有5个16位定时器,定时器0,1,2,3有脉冲调制(PWM)功能, 因此这4个定时器也被称为PWM定时器,定时器4是一个内部定时器,无外部输出引脚,定时器的时钟源虽然是PCLK,但是还得通过内部的两个分频器分频后, 才能得到想要的工作频率,然后输出作为定时器的工作的时钟,定时器0,1公用一个分频器,其他3个定时器公用另一个分频器,如下图
定时器的工作原理描述,以定时器0为例: 1.首先,将TCMPB0,TCNTB0附初值 2.然后,设置定时控制器TCON,将TCON的第1位置1(手动更新位), 这样TCMPB0,TCNTB0赋值给TCMPB0,TCNTB0 3.启动定时器–>设置TCON第3位为1(当TCNT0的值减到0时,TCMPB0的值会自动加载到寄存器TCMP0和TCNT0中), 第0位为1(开启定时器) 4.此时,定时器会减1计数, 即TCNT0进行减1计数, 当TCMP0与TCNT0相等时, TOUT0翻转 之后介绍一下相关的寄存器在手册中的定义: ■TCON:对于定时器0来讲:
定时器的分频 前面提到了定时器0的使用方法,但是没有提到其最终的工作所需要频率(1s中能记多少个数)
void timer0_init(void) { TCFG0 = 99; // 预分频器0 = 99 TCFG1 = 0x02; // 选择8分频 TCNTB0 = 62500; // 1秒钟触发一次中断 TCMPB0 = 0; TCON |= (1<<1); // 手动更新(将TCNTB0,TCMPB0更新入TCNT0, TCMP0) TCON = 0x09; // 自动加载,清“手动更新”位,启动定时器0 }
PWM功能 对于定时器0来讲,上面的例子中TCNT0 1s内减到0,则TOUT0反转(电平变化), 但是定时器0还有个特性,就是如果TCNT0减到与比较值TCMP0相等,则TOUT0也发生反转,也就是说上面的例子将 TCMPB0 改成31250后,则TCNT0从62500减到31250(与TCMP0相等)TOUT0发生一次反转(用时0.5s),TCNT0减到0又发生反转(用时0.5s),这样,1s内发生两次反转,如此循环,输出引脚0.5s反转一次,即占空比50%(波形0.5秒为高电平,0.5秒为低电平这样循环的波形)
void timer0_init(void) { TCFG0 = 99; // 预分频器0 = 99 TCFG1 = 0x02; // 选择8分频 TCNTB0 = 62500; // 1秒钟触发一次中断 TCMPB0 = 31250; TCON |= (1<<1); // 手动更新(将TCNTB0,TCMPB0更新入TCNT0, TCMP0) TCON = 0x09; // 自动加载,清“手动更新”位,启动定时器0 }
注意,如果将上面代码TCMPB0=31250,改为别的值,比如TCNTB0 /4,则输出的波形一定发生变化(比如0.25秒为高电平,0.75s为低电平这样循环的波形),即占空比也发生变化,这就是所谓的PWM功能
全部0条评论
快来发表一下你的评论吧 !