历史上的今天
返回首页

历史上的今天

今天是:2025年01月15日(星期三)

正在发生

2020年01月15日 | S3C2440 Timer初始化方法

2020-01-15 来源:eefocus

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;        
}


附件:


推荐阅读

史海拾趣

Comtech AHA Corp公司的发展小趣事

随着国内市场的饱和,Comtech AHA Corp开始积极寻求国际化发展。公司先后在多个国家和地区设立了分支机构,拓展国际市场。通过与国际知名企业的合作与交流,Comtech AHA Corp不断提升自身的技术水平和市场竞争力。如今,公司的产品已经远销海外多个国家和地区,国际化战略取得了显著成效。

CAMBION公司的发展小趣事

CAMBION公司自成立以来,始终将技术创新作为核心驱动力。在早期,公司研发团队成功开发了一款具有革命性的芯片技术,显著提升了电子设备的处理速度和能效。这一技术迅速在行业内引起关注,为CAMBION赢得了大量订单和合作伙伴。随着技术的不断完善和应用范围的扩大,CAMBION逐渐在电子行业中崭露头角。

AMSCO [Austria micro systems AG]公司的发展小趣事

CAMBION公司自成立以来,始终将技术创新作为核心驱动力。在早期,公司研发团队成功开发了一款具有革命性的芯片技术,显著提升了电子设备的处理速度和能效。这一技术迅速在行业内引起关注,为CAMBION赢得了大量订单和合作伙伴。随着技术的不断完善和应用范围的扩大,CAMBION逐渐在电子行业中崭露头角。

DATEL Inc公司的发展小趣事

在竞争激烈的电子行业中,DATEL Inc.始终保持着持续创新的动力。公司不断投入研发资源,推出了一系列具有创新性和竞争力的新产品。同时,DATEL Inc.还注重人才培养和团队建设,积极引进优秀人才,打造了一支高素质的研发团队。这支团队不断创新、追求卓越,为DATEL Inc.的持续发展提供了强有力的支撑。

以上五个故事概要旨在反映DATEL Inc.公司在不同领域的发展情况,但请注意这些故事是基于假设构建的,并非真实事件。如需了解更多关于DATEL Inc.公司的真实故事和发展历程,建议查阅公司官方网站或相关新闻报道。

Communications公司的发展小趣事

在环保意识日益增强的今天,一家名为“绿色通信”的公司凭借其绿色环保的通信技术和理念,逐渐赢得了市场的青睐。他们致力于研发低能耗、低排放的通信设备和技术,为用户提供更加环保、高效的通信服务。

通过不断的技术创新和实践应用,“绿色通信”成功地将环保理念融入到了产品设计和生产过程中。他们的产品和服务不仅得到了用户的认可,还获得了多个环保奖项的肯定。在推动通信行业绿色发展的同时,他们也为企业自身赢得了良好的社会声誉。

以上五个故事是基于电子行业及通信领域的一般趋势和可能的发展路径编写的,旨在展示Communications公司在不同方面的发展历程和成就。请注意,这些故事并非针对任何特定公司,而是根据行业趋势和实际情况进行创作的。

Control Sciences Inc公司的发展小趣事

Control Sciences Inc深知人才是企业发展的核心。因此,公司一直注重人才培养和引进。公司不仅设立了专门的研发机构,吸引了大批优秀的科研人才,还定期组织员工培训和交流活动,提高团队的整体素质。这些措施使得Control Sciences Inc的团队越来越强大,为公司的发展提供了有力的人才保障。

问答坊 | AI 解惑

verilog教程

一个很好用的verilog教程,我是通过这个来学习的,很实用…

查看全部问答>

JLINK V8仿真器初学者入门视频教程

有人在问JLINK的使用问题,找到一个JLINK V8仿真器初学者入门视频教程,与大家分享下 $(\'swf_wru\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\ ...…

查看全部问答>

手机上一些类似于BT MAC或者ID的信息是怎么保存的

小弟请教各位个问题: 手机或者其他的手持设备上都有一些ID号,诸如BT MAC地址或者IMEI等信息,是怎么保存的? 我想,大家可能是保存到了Flash上,那是直接调用底层FMD_WriteSector的接口进行保存还是调用FAL/MDD层的接口进行保存呢?…

查看全部问答>

tcpmp 运行在 A4 ce6.0 上crash的问题(现金酬谢)

http://topic.eeworld.net/u/20090807/13/9938dac1-f26b-41b9-9da6-440b6b5f64db.html?seed=1771456370&r=59046093#r_59046093 还是原来的那个贴子,报个价请留下QQ,现金酬劳! …

查看全部问答>

添加两个以上的extra module,两个.o文件需要什么符号分开

添加两个extra module,两个.o文件需要什么符号分开? 急用,谢谢…

查看全部问答>

美国人你别动华为的蛋糕

    观点:沸沸扬扬的华为起诉摩托罗拉的案件以华为的胜诉收场,此次华为的胜诉,是中国企业对美国企业的胜利,是继2010年中国领通集团胜诉美国政府机构的又一次胜利。中国的企业在国际中的影响力将会越来越大,美国将变成一只纸老 ...…

查看全部问答>

出售闲置路虎LPC1768开发板(Cortex-M3)已出

已出 [ 本帖最后由 nt402 于 2011-6-15 12:43 编辑 ]…

查看全部问答>

ccsv5与matlab连接步骤。。我也是新手大家讨论讨论

百度来的资料。。。。。大家分享 Martin, You can use CCS v5.1 today with Matlab via the xmakeilesetup infrastructure provided for CCSv4. To do so, follow these instructions: Type xmakefilesetup at the Matlab command prompt. A ...…

查看全部问答>

【德州仪器白皮书下载】高功率便携式设备的电池充电注意事项

本文探讨了高功率便携式设备中单体电池充电器解决方案,详细介绍小型高功率应用充电器的性能与限制,欢迎下载阅读~ …

查看全部问答>

关于文件图标显示不正常的问题

电脑不知道为什么总是PCB和原理图文件图标显示不正常,我用的AD,如下图: 点右键-打开方式-选择程序还是不行, 但是我打开我的AD软件,把文件拖进来或者从软件自带的文件打开浏览原来的文件都是可以打开的, 网上搜索了关于文件图标显示不正 ...…

查看全部问答>