《嵌入式linux应用程序开发完全手册》系统时钟和定时器学习笔记
2019-07-13 04:11发布
生成海报
系统时钟和定时器
一.系统时钟
(1) FCLK:用于CPU核
HCLK:用于AHB总线上设备:CPU核、存储器控制器、中断控制器、LCD控制器、DMA和USB主机模块
PCLK:用于APB总线上设备:WATCHDOG、IIS、I2C、PWM定时器、MMC接口、ADC、UART、GPIO、RTC和SPI
(2 )开发板时钟频率为12 MHZ,通过PLL提高系统时钟: S3C2440包括MPLL和UPLL,UPLL用于USB设备,MPLL用于FCLK、HCLK、PLCK,他们的设置方法类似。
(3 )上电→FCLK=Fin(外部输入时钟)→设置MPLL相关寄存器→等待(Lock Time:长短由寄存器LOCKTIME设定)→MPLL输出稳定,CPU工作在新的时钟FCLK下。
(4)设置MPLL需要设置下面几个重要寄存器:
LOCKTIME寄存器(LOCK TIME COUNT)用于设置lock time的长度。
MPLLCON(Main PLL Control)寄存器用于设置FCLK与Fin的倍数
CLKDIVN(CLOCK DIVIDER CONTROL)寄存器用于设置FCLK、HCLK、PCLK三者的比例
CAMDIVN某些时钟比例需要设置。
二. PWM(pulse width modulation)定时器
(1)S3C2440共有5个16位的定时器,其中定时器0、1、2、3有PWM功能,即它们都有一个输出引脚,可以通过定时器来控制引脚周期性的高、低电平变化;定时器4没有输出引脚。
(2)PLCK→2个8位预分频器(定时器0、1共用第一个定时器,2、3、4共用第二个);→第二级分频(输出2分频,4分频,8分频,16分频或者外部时钟TCLK0/TCLK1)。
这两次预分频都是通过设置TCFG0寄存器完成的。每个定时器工作在哪种频率下可以通过TCFG1寄存器来选择的。定时器内部控制逻辑的详细原理可参考数据文档。
定时器的使用主要涉及两个寄存器:
TCFG0寄存器:位[7:0],位[15:8]分别用于控制预分频器0,1;它们的值为0~255。经过分频器出来的时钟频率:PLCK/(TCFG0[7:0]+1或TCFG0[15:8]+1)。
TCFG1寄存器 :设定相应定时器为经过分频器出来的时钟频率的几分频。
定时器工作频率= PLCK/(TCFG0[7:0]或TCFG0[15:8]+1)/几分频
TCNTBn/TCMPBn寄存器:这两个寄存器都只用到位[15:0]。TCNTBn中保存定时器的初始计数值,TCMPBn中保存比较值。它们的在启动定时器时,被传到定时器内部寄存器TCNTn,TCMPn中。
TCNTOn寄存器:n为0~4,内部寄存器TCNTn在其工作时钟下不断减1计数,可以通过读取TCNTOn寄存器得知其值。
TCON寄存器:它的功能如下:A.第一次启动定时器时,手动将TCNTBn/TCMPBn寄存器的值装入内部寄存器TCNTn,TCMPn中。B.启动,停止定时器。C.决定在定时器计数到达0时是否自动装入初值 。D.决定定时器的管脚TOUTn的输出电平是否反转。
三. WATCHDOG定时器
(1)工作原理:PLCK→2个8位预分频器(输出16分频,32分频,64分频,128分频或者外部时钟TCLK0/TCLK1)
初始计数值写入 WTCNT→while(WTCNT==0)自动重新装载WTCNT=WTDAT,并可以产生中断信号,可以输出复位信号。WATDOG定时器工作频率=PCLK/(WTCON[15:8]+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函数用于设置MPLL,S3C2440一般输入时钟频率Fin为12MHZ,将FCLK,HCLK,PCLK分别设为200MHZ,100MHZ和50MHZ,三者比例为1:2:4。其中MPLLCON地址为0x4c000004,MDIV[19:12],PDIV[9:4],SDIV[1:0]。
代码如下:
(2)设置存储控制器
(3)初始化定时器0
(4)定时器中断
前面调用timer0_init函数后,定时器0就开始工作,调用init_irq函数使能定时器0中断,设置CPSR寄存器,开启IRQ中断后,每当定时器0计数达到0时就触发中断。
(5)ISP定时器0计数到达时就调用其服务程序:
定时器0的中断使用SRCPND,INTPND寄存器中的位10来表示,中断服务程序Timer0_Handle先判断是否定时器0的中断,若是则反转LED状态。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮