S3C2440 Timer初始化方法

2020-01-15来源: eefocus关键字:S3C2440  Timer  初始化方法

s3c2410提供了5个16位的Timer(Timer0~Timer4),其中Timer0~Timer3支持Pulse Width Modulation—— PWM(脉宽调制 )。Timer4是一个内部定时器(internal timer),
PCLK是Timer的信号源,我们通过设置每个Timer相应的Prescaler和Clock Divider把PCLK转换成输入时钟信号传送给各个Timer的逻辑控制单元(Control Logic),事实上每个Timer都有一个称为输入时钟频率(Timer input clock Frequency)的参数,这个频率就是通过PCLK,Prescaler和Clock Divider确定下来的,每个Timer 的逻辑控制单元就是以这个频率在工作。下面给出输入时钟频率的公式:


Timer input clock Frequency = PCLK / {prescaler value+1} / {clock divider }
{prescaler value} = 0~255
{ clock divider } = 2, 4, 8, 16


然而并不是每一个Timer都有对应的Prescaler和Clock Divider,从上面的原理图我们可以看到Timer0,Timer1共用一对Prescaler和Clock Divider,Timer2,Timer3,Timer4共用另一对Prescaler和Clock Divider,s3c2410的整个时钟系统模块只存在两对Prescaler和Clock Divider。


我曾经在讨论watchdog的文章中提到,watchdog也是一种定时器,他的工作就是在一个单位时间内对一个给定的数值进行递减和比较的操作,而我们这篇文章讨论的定时器他的工作内容和watchdog在本质上是一样的。定时器在一个工作周期(Timer input clock cycle)内的具体工作内容主要有3个。分别是:


1.对一个数值进行递减操作
2.把递减后的数值和另一个数值进行比较操作
3.产生中断或执行DMA操作


在启用Timer之前我们会对Timer进行一系列初始化操作,这些操作包括上面提到的设置Prescaler和Clock Divider,其中还有一个非常重要的就是要给Timer两个数值,我们分别称之为Counter(变量,用于递减)和Comparer(定值,用于比较),Counter会被Timer 加载到COUNT BUFFER REGISTER(TCNTB),而Comparer会被Timer 加载到和COMPARE BUFFER REGISTER(TCMPB),每个Timer都有这样两个寄存器。当我们设置完毕启动Timer之后,Timer在一个工作周期内所做的就是先把TCNTB中的数值(Counter)减1,之后把TCNTB中的数值和TCMPB中的数值(Comparer)进行对比,若Counter已经被递减到等于Comparer,发生计数超出,则Timer产生中断信号(或是执行DMA操作)并自动把Counter重新装入TCNTB(刷新TCNTB以重新进行递减)。以上就是Timer的工作原理。


下面我们结合代码具体说明如何对Timer0进行初始化并开启它。


首先我假设我的PCLK是50700000Hz

// define Timer register
#define rTCFG0 (*(volatile unsigned int *)0x51000000)
#define rTCFG1 (*(volatile unsigned int *)0x51000004)
#define rTCON (*(volatile unsigned int *)0x51000008)
#define rTCNTB0 (*(volatile unsigned int *)0x5100000C)
#define rTCMPB0 (*(volatile unsigned int *)0x51000010)
#define rTCNTO0 (*(volatile unsigned int *)0x51000014)
#define rTCNTB1 (*(volatile unsigned int *)0x51000018)
#define rTCMPB1 (*(volatile unsigned int *)0x5100001C)
#define rTCNTO1 (*(volatile unsigned int *)0x51000020)
#define rTCNTB2 (*(volatile unsigned int *)0x51000024)
#define rTCMPB2 (*(volatile unsigned int *)0x51000028)
#define rTCNTO2 (*(volatile unsigned int *)0x5100002C)
#define rTCNTB3 (*(volatile unsigned int *)0x51000030)
#define rTCMPB3 (*(volatile unsigned int *)0x51000034)
#define rTCNTO3 (*(volatile unsigned int *)0x51000038)
#define rTCNTB4 (*(volatile unsigned int *)0x5100003C)
#define rTCNTO4 (*(volatile unsigned int *)0x51000040)

void timer0_config()
{
/*
                Timer0的prescaler由rTCFG0 的 0~7 bit决定
                Prescaler=119
*/
                rTCFG0=119        
/*
                Timer0的divider value由TCFG1的 0~3 bit决定,设置为3表示divider value = 1/16
                rTCFG1的第20~23bit用于决定Timer计数超出后所采取的响应,我们使用了中断模式(20~23bit全部为0),
                即计数超出后产生中断
*/
                rTCFG1=3;
        
                rTCNTB0=26406;
                rTCMPB0=0;
}


由于我们的PCLK是50700000Hz, 根据Timer input clock Frequency的计算公式我们如下计算Timer0的时钟输入频率:


prescaler value = 119
divider value = 1/16
PCLK= 50700000
Timer input clock Frequency =50700000/ (119+1)/(1/16)=26406


也就是说通过设置prescaler和divider value之后,Timer0的工作频率为26406,也就是说一秒内Timer0会进行26406次递减和比较操作,假设我们现在是要让Timer0每1秒产生一次中断的话,我们应该设置Counter=26406和Camparer=0,既:

rTCNTB0=26406;
rTCMPB0=0;

如果我们要让Timer0每0.5秒产生一次中断,则我们应该设置Counter=26406/2和Camparer=0,既:
rTCNTB0=13203;
rTCMPB0=0;

如果我们要让Timer0每0.25秒产生一次中断,则我们应该设置Counter=26406/4和Camparer=0,既:
rTCNTB0=6601;
rTCMPB0=0;

初始化完Timer后我们要开启它。


void timer0_start()
{
/*
               Update TCNTB0 & TCMPB0
               rTCON寄存器的第1位是刷新Timer0的COUNT BUFFER REGISTER(TCNTB)和
                COMPARE BUFFER REGISTER(TCMPB),由于是第一次加载Counter和Comparer,
                所以我们需要手动刷新它们
*/
               rTCON|=1<<1;
/*
               置rTCON第0位为1,开启Timer0
               把rTCON第1位置为0,停止刷新TCNTB0 和 TCMPB0
               置rTCON第3位为1,设置Counter的加载模式为自动加载(auto reload),这样每当
               Timer计数超出之后(此时TCNTB的值等于TCMPB的值),Timer会自动把原来我们给
               定的Counter重新加载到TCNTB中
*/
        rTCON=0x09;        
}


附件:


关键字:S3C2440  Timer  初始化方法 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic485750.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:S3C2440 LED驱动
下一篇:S3C6410移植u-boot(一)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

S3C6410移植u-boot(一)
)board/samsung/smdk6410/config.tmp;/    fi    @$(MKCONFIG) smdk6410 arm arm1176 smdk6410 samsung s3c64xx    @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk步骤41、从U-boot根目录,进入nand_spl/board/samsung/cd nand_spl/board/samsung/2、新建目录smdk6410并将smdk6400下的所有
发表于 2020-01-15
S3C2440 LED驱动
[] = { S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT,};//file operations 结构体的ioctl()函数static int sbc2440_leds_ioctl( struct inode *inode,  struct file *file,  unsigned int cmd,  unsigned long arg){ switch(cmd) { case 0: case
发表于 2020-01-15
ARM S3C2410学习手记
1.S3C2410处理器介绍2410是三星公司的一款基于ARM920T内核的16/32位RISC嵌入式系统微处理器,主要面向手持设备和低功耗、高性价比的应用。频率达到203Mhz。ARM920T核由ARM9TDMI内核、存储管理单元(MMU)和高速缓存三部分组成。高速缓存由独立的16KB地址和16KB数据高速缓存组成。ARM920T有两个协处理器,CP14和CP15。CP14用于调试控制而CP15用于存储系统控制以及测试控制。资源包括有:◆1个LCD控制器(支持STN和TFT屏)。◆1个SDRAM控制器,1个NAND Flash控制器。◆3个通道的UART。◆4个通道的DMA。◆4个具有PWM功能的计时器和一个内部时钟。◆8通道
发表于 2020-01-13
S3C2410 bootloader ----VIVI阅读笔记
首先在移植前应该熟悉了解vivi的架构,启动过程,了解了原理性的东西之后,再去做移植比较好吧,我也新手进来公司的第1件事就是弄VIVI, 不过我是剪裁,移植主要部分是改bootload分区和kernel MTD分区,保证一致,其他的记不得了,GOOGLE里有非常丰富的关于vivi -0.1.4到s3c2410移植或者启动过程分析的资料. S3C2410 bootloader ----VIVI阅读笔记 (转)上 2007-06-14 13:06 建议读一读《嵌入式系统Boot Loader技术内幕》(詹荣开著),google一下就会找到一片。什么是Bootloader就不再这里废话了,看看
发表于 2020-01-09
BootLoader —— S3C2440
的流程图放上来:先从全局对整个工程有个大体的了解很重要,这样局部一条条的看更容易懂。由于程序实在太长,这里分几个部分逐步说明。一:串口配置。整个bootloader的交互环境全部是通过串口显示的,那么怎么样才能准确无误的显示出想要的字符呢?首先要知道的是:串口的CLK是挂在PCLK上的。波特率与PCLK有着密切的关系,因此正确设置PCLK,是和正确设置波特率有着千丝万缕的联系的。S3C2440内置两个PLL电路,即MPLL和UPLL。MPLL给FCLK,HCLK,PCLK提供时钟,UPLL给USB提供时钟。MPLL=FCLK=(2*m*Fin)/(p*2^s);m=M+8;p=P+2;M,P由寄存器MPLLCON设置。确定了FCLK
发表于 2019-12-26
单片机MSP430 - 定时器Timer_A
一、定时器Timer_A 介绍Timer_A是一个具有多路捕获/比较寄存器的16位定时/计数器,主要有TAxCTL,TAxR,TAxCCTLn,TAxIV,TAxEX0 几个寄存器。其中最主要的是TAxCTL寄存器,它决定Timer_A的输入时钟信号,Timer_A的工作模式,Timer_A的开启与停止,中断的申请等。中断可以来自定时器溢出或者任意的捕获/比较寄存器Timer_A的特征包括:具有4种工作模式的异步定时/计数器可选择配置的时钟源可配置的PWM输出功能异步输入和同步锁存二、Timer_A 操作1. 16位定时/计数器16位定时/计数寄存器TAxR,在每个时钟信号的上升沿做增一计数或减一计数。TAxR可以通过置位
发表于 2020-01-15
单片机MSP430 - 定时器Timer_A
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved