现在的位置: 首页 > 综合 > 正文

《嵌入式linux应用程序开发完全手册》系统时钟和定时器学习笔记

2013年10月14日 ⁄ 综合 ⁄ 共 3959字 ⁄ 字号 评论关闭

系统时钟和定时器

 

 

.系统时钟

(1) FCLK:用于CPU

      HCLK:用于AHB总线上设备:CPU核、存储器控制器、中断控制器、LCD控制器、DMAUSB主机模块

PCLK:用于APB总线上设备:WATCHDOGIISI2CPWM定时器、MMC接口、ADCUARTGPIORTCSPI

 

(2 )开发板时钟频率为12 MHZ,通过PLL提高系统时钟: S3C2440包括MPLLUPLLUPLL用于USB设备,MPLL用于FCLKHCLKPLCK,他们的设置方法类似。

(3 )上电→FCLK=Fin(外部输入时钟)设置MPLL相关寄存器→等待(Lock Time:长短由寄存器LOCKTIME设定)→MPLL输出稳定,CPU工作在新的时钟FCLK下。

(4)设置MPLL需要设置下面几个重要寄存器:

LOCKTIME寄存器(LOCK TIME COUNT)用于设置lock time的长度。

      MPLLCONMain PLL Control)寄存器用于设置FCLKFin的倍数

      CLKDIVNCLOCK DIVIDER CONTROL)寄存器用于设置FCLKHCLKPCLK三者的比例

       CAMDIVN某些时钟比例需要设置。

. PWMpulse width modulation)定时器

 (1)S3C2440共有516位的定时器,其中定时器0123PWM功能,即它们都有一个输出引脚,可以通过定时器来控制引脚周期性的高、低电平变化;定时器4没有输出引脚。

2PLCK28位预分频器(定时器01共用第一个定时器,234共用第二个);→第二级分频(输出2分频,4分频,8分频,16分频或者外部时钟TCLK0/TCLK1)。

       这两次预分频都是通过设置TCFG0寄存器完成的。每个定时器工作在哪种频率下可以通过TCFG1寄存器来选择的。定时器内部控制逻辑的详细原理可参考数据文档。

       定时器的使用主要涉及两个寄存器:

TCFG0寄存器:位[70],位[158]分别用于控制预分频器01;它们的值为0~255。经过分频器出来的时钟频率:PLCK/TCFG0[70]+1TCFG0[158]+1)。

TCFG1寄存器 :设定相应定时器为经过分频器出来的时钟频率的几分频。

定时器工作频率= PLCK/TCFG0[70]TCFG0[158]+1/几分频

TCNTBn/TCMPBn寄存器:这两个寄存器都只用到位[15:0]TCNTBn中保存定时器的初始计数值,TCMPBn中保存比较值。它们的在启动定时器时,被传到定时器内部寄存器TCNTnTCMPn中。

TCNTOn寄存器:n0~4,内部寄存器TCNTn在其工作时钟下不断减1计数,可以通过读取TCNTOn寄存器得知其值。

TCON寄存器:它的功能如下:A.第一次启动定时器时,手动将TCNTBn/TCMPBn寄存器的值装入内部寄存器TCNTnTCMPn中。B.启动,停止定时器。C.决定在定时器计数到达0时是否自动装入初值 D.决定定时器的管脚TOUTn的输出电平是否反转。

 

. WATCHDOG定时器

 

1)工作原理:PLCK28位预分频器(输出16分频,32分频,64分频,128分频或者外部时钟TCLK0/TCLK1

   初始计数值写入 WTCNTwhile(WTCNT==0)自动重新装载WTCNT=WTDAT,并可以产生中断信号,可以输出复位信号。WATDOG定时器工作频率=PCLK/WTCON[158]+1/几分频。大部分功能都在WTCON中设定

2)其相关寄存器:

WTCON:用于设置预分频系数,选择工作频率,决定是否使能中断,是否启用WATDOG功能等,其寄存器具体操作可见数据手册。

WTDAT用以决定WATCHDOG定时器的超时周期。

WTCNT在启动WATDOG定时器前,必须往这个寄存器写入初始计数值,启动定时器后,它做减1操作,当计数器值达到0时,如果中断被使能的话,就发出中断,如果WATCHDOG功能被使能的话就发出复位信号,装载WTDAT寄存器的值并重新计数。

. MPLL的定时器实验

首先启动MPLL,提高系统时钟,初始化存储控制器,使SDRAM工作在新的HCLK下,然后将定时器0设为0.5s产生一次,在中断程序里改变LED状态。

1)设置/启动MPLL

clock_init函数用于设置MPLLS3C2440一般输入时钟频率Fin12MHZ,FCLKHCLK,PCLK分别设为200MHZ,100MHZ50MHZ,三者比例为1:2:4。其中MPLLCON地址为0x4c000004MDIV[19:12],PDIV[9:4],SDIV[1:0]

代码如下:

 

  

 

 

 

2)设置存储控制器

 

   

 

 

 

3)初始化定时器0 

 

 

4)定时器中断

前面调用timer0_init函数后,定时器0就开始工作,调用init_irq函数使能定时器0中断,设置CPSR寄存器,开启IRQ中断后,每当定时器0计数达到0时就触发中断。

 

 

5ISP定时器0计数到达时就调用其服务程序:

 

 

定时器0的中断使用SRCPND,INTPND寄存器中的位10来表示,中断服务程序Timer0_Handle先判断是否定时器0的中断,若是则反转LED状态。

 

 

 

 

 

 

 

 

抱歉!评论已关闭.