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中文手册第10章 PWM定时器

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

系统时钟和定时器

系统时钟和定时器 - 系统时钟和定时器 S3C2410/S3C2440 的时钟控制逻辑既可以外接晶振, 然后通过内部电路产生 时钟源;也可以直接使用外部提供的时钟源,它们通过...

S3C2410的看门狗定时器中断实验

S3C2410的看门狗定时器中断实验 - 看门狗定时器中断实验 实验 5 S3C2410 看门狗定时器中断实验 一、实验目的 掌握 S3C2410 看门狗定时器的工作原理和定时时间的计算...

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

脉宽调制定时器 PWM Timer S3C2410A 有 5 个 16 位定时器。其中定时器 0、...?? ?? while(dly--) ?? { ?? while(rTCNTO1>=time_val>>1); ?? ...

ARM9 S3C2410x中文datasheet资料(绝对完整版)10第十章 ...

ARM9 S3C2410x中文datasheet资料(绝对完整版)10第十章 PWM定时器_计算机硬件及...(TCNTO0) 寄存器 地址 名称 /W R 描述 值 :0 15 值 设置定时器 0 ...

看门狗定时器

(二) 看门狗的工作原理给出看门狗的基本的工作原理:见下两条: 1. 其基本原理...(三) S3C2410 的看门狗对于我们所使用的S3C2410 的看门狗定时器有两个功能: 1...

PWM定时器

PWM定时器 - PWM 定时器 班级:计算机 14-1 班学号: 140344801XX 姓名: 1.实验目的 (1) 熟悉了解 S3C2410 A PWM timer 的工作原理。 (2) ...

实验5-2 看门狗实验

实验5-2 看门狗实验 - 实验5-2 1、实验目的 看门狗定时器应用实验 了解 watchdog 的作用 掌握 S3C2410A 的watchdog 定时器的使用方法 2、实验内容 ...