介绍arm9时钟与定时器

电子说

1.2w人已加入

描述

前言
这篇主要介绍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功能

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分