kl800.com省心范文网

s3c2410的定时器工作原理及应用--To


s3c2410 提供了 5 个 16 位的 Timer(Timer0~Timer4),其中 Timer0~Timer3 支持 Pulse Width Modulation—— PWM(脉宽调制 )。Timer4 是一个内部定时器 (internal timer),他没有输出引脚(output pins)。 下面是 Timer 的工作原理图。 见《S3C2410-第十章 PWM 及定时器.pdf》图 10-1. 如图所示,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。 定时器在一个工作周期(Timer input clock cycle)内的具体工作内容主要有 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; } 要使你的 Timer 能够正常的工作,除了调用 timer0_config()和 timer0_start()之外,还必 须设置 Timer 的中断服务例程并取消对 Timer 的中断的屏蔽.这些操作可以参考 <<s3c2410 中断处理过程>>


赞助商链接

S3C2410的PWM定时器中断实验

S3C2410 PWM 定时器的工作原理和定时时间的计算方法...// must change from 0x200 to 0x800 59 SRCPND...

s3c2410试题

{R2-R9} 块拷贝寻址 BL SUBR 相对寻址 七、S3C2410 微处理器,假设 PCLK=40MHZ,(20 分) 1、若需要得到 1MHZ 的定时器输入时钟频率,时钟分频值为 8,则预...

关于S3C2410时钟与启动方式

This feature can be used to change the CPU ...。 S3C2410 CPU 默认的工作主频为 12MHz,使用 PLL...在映射过程完成后.nandflash 控制器将 pc 指针直接...

S3C2410中文手册第10章 PWM定时器

S3C2410中文手册第10章 PWM定时器_计算机硬件及网络_IT/计算机_专业资料。S3C2410...(TCNTO0)寄存器名称 TCNTO0 地址 0X51000014 R/W R 描述 定时器 0 计...

S3C2410中的PWM(脉宽调制)定时器介绍

S3C2410PWM(脉宽调制)定时器介绍_计算机软件及应用_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档 S3C2410PWM(脉宽调制)定时器介绍_计算机软件...

嵌入式系统原理及应用 第四章习题

} 9、S3C2410X 的中断控制器的工作过程是怎样的?...to exit.\n”); Uart_Getch( ); //等待按键...(volatile unsigned *)0x51000000) //定时器配置...

arms32410东莞理工钟国斌资料S3C2410中文手册第10章_PW...

脉宽调制定时器 PWM Timer S3C2410A 有 5 个 16...核心过程:通过设置 TCFG0 和 TCFG1 来设置定时器...? { ?? while(rTCNTO1>=time_val>>1); ??...

S3C2410A芯片及其应用(嵌入式大作业)

图 1 S3C2410A 内部功能原理图 此外 S3C2410A 还集成了以下片上外设: (1)...功能的定时器 (7) I/O 口 (8) 4 通道 16 位定时器/PWM 发生器 (9) ...

S3C2410 TFT LCD显示原理分析

S3C2410 TFT LCD显示原理分析_信息与通信_工程科技_专业资料。S3C2410 TFT LCD显示原理分析S3C2410 TFT LCD 显示原理分析 1、系统结构框图 2、LCD 控制器由 REG...

大工16秋《嵌入式原理与开发》在线测试2满分答案

大工 16 秋《嵌入式原理与开发》在线测试 2 一、单选题(共 10 道试题,共 30 分。 ) 1. S3C2410X 定时器有()个 16 位的定时器,定时器 0-3 具有脉宽...