S3C2440开发板裸机程序系列03--定时器

本文详细介绍了S3C2440微处理器的时钟系统和定时器配置方法,包括如何设置定时器频率、工作模式,并通过一个具体的定时器应用实例展示了如何控制LED灯的亮灭。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.  S3C244时钟系统

与时钟有关的关键词:

Fin – 外部输入的晶振频率,TQ2440外接晶振是12MHz;
FCLK – 用于CPU核,即CPU核的频率;
HCLK – 用于AHB(Advanced High Performance Bus)总线上的设备,包括存储控制器,LCD控制器,DMA等;
PCLK – 用于APB(Advanced Peripheral Bus)总线上的低速设备,包括定时器,UART,ADC等

模式控制引脚OM3和OM2的组合关系决定了S3C2440的时钟源。

S3C2440有2个锁相环(PLL): MPLL提供给FCLK、HCLK、PCLK,UPLL专用于USB模块。

设置FCLK、HCLK、PCLK使用到2个控制寄存器:MPLLCON和CLKDIVN。




前面的例子代码中,启动代码option.inc中定义了相关参数。

可知,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz

2.  定时器原理

S3C2440有5个16位定时器,其中定时器0、1、2和3具有PWM功能,定时器4是无输出引脚的内部定时器。

定时器0和1公用一个预分频器,定时器2、3、4公用另外一个预分频器。时钟分频器可以再次进行5种不同分频信号的分频。

2.1 设置定时器频率

TCFG0 – 控制定时器频率,8位可编程预分频器


TCFG1 – 控制定时器频率,多路开关

如设置Timer0的输入频率为62.5kHz,则

50MHz / 62.5kHz =800 ==> TCFG1为8分频,TCFG0为99(99+1=100)

rTCFG0 &=~(0xFF);
rTCFG0 |= 99;
rTCFG1 &=~(Ox0F);
rTCFG1 |= 2;

2.2 设置定时器工作模式

TCON寄存器 (以定时器1为例)--- 控制定时器工作模式及开启状态

PWM定时器内部原理:

TCMPn和TCNTn是内部寄存器,不用设置。
TCNTBn(Timer Count Buffer register)是装入初始值。
TCMPBn(Timer Compare Buffer register)是装入比较值。
TCON[9]=1时,将TCNTB1和TCMPB1的值分别装入内部的TCNT1和TCMP1。
TCON[8]=1时,TCNT1进行减1计数,当TCNT1=TCMP1时,TOUT1取反。

启动一个定时器:

当定时器减1计数为0时,SRCPND(Source Pending)相应位将置1,通过检测相应位来判断定时时间到。(默认定时器中断为屏蔽,所以定时器中断没有打开)。清除定时器中断标志的方法是,再次向SRCPND相应位写入1。

SRCPND

3.     定时器应用

定时器1设置为62.5kHz,用它来定时Led,每秒Led1亮灭一次,且Led1亮时Beep响。

timer.h 

#ifndef __TIMER_H__
#define __TIMER_H__

extern void Timer1_Init(void);

#endi

timer.c 

#include "2440addr.h"

void Timer1_Init(void)
{
	rTCFG0 &= ~(0xFF);
	rTCFG0 |= 99;			//Prescaler0 = 99
	rTCFG1 &= ~(0xF<<4);
	rTCFG1 |= (2<<4);		//MUX1 = 1/8
	
	rTCNTB1 = 62500;	//Timer1  1sec中断1次
	rTCON |= (1<<9);
	rTCON = (9<<8);		//Timer1 on
}

Main.c

#include "led.h"
#include "common.h"
#include "key.h"
#include "beep.h"
#include "timer.h"

int Main()
{
	int flag = 0;
	
	Led_Init();
	Key_Init();
	Beep_Init();
	Timer1_Init();
	while(1)
	{
		if(rSRCPND & (1<<11)){
			flag = !flag;
			rSRCPND |= (1<<11);
		}
		
		if(1==flag){
			LED01_ON;
			Beep_On();
		}else{
			LED01_OFF;
			Beep_Off();
		}
	}
	return 0;
}
完整的定时器程序代码: 点击打开链接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值