s3c2440_Clock Timer

2024-06-11 16:18
文章标签 timer clock s3c2440

本文主要是介绍s3c2440_Clock Timer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2440时钟模块能够产生3种时钟,分别为:FCLK、PCLK、HCLK。

FCLK:Frame Clock 帧时钟,供CPU使用。

HCLK:给AHB高性能总线上的设备使用:存储控制器、中断控制器、LCD控制器、DMA、DM9000和USB模块。

PCLK:给APB外围总线上的设备使用:ADC、UART、GPIO、RTC、看门狗、IIC、IIS、PWM定时器、MMC接口和SPI串行外设接口。

s3c2440系统时钟设置步骤:

(1)启动MPLL,即配置MPLLCON,设置主频值。MDIV[19:12]、PDIV[9:4]、SDIV[1:0]。这三个值的设定可以参考2440芯片手册里面的经典值。具体的计算公式是:


(2)设置分频比:配置CLKDIVN和CAMDIVN对应的位,由芯片手册可知当HCLK和FCLK不等时,即CLKDIVN的HDIVN位不为00时,cpu需要从快总线模式切换到异步总线模式,这时候就需要嵌入一段汇编指令了。


(3)以上寄存器都设置好了之后设置锁定时间LOCKTIME寄存器,它的初始值是0xFFFFFFFF,一般使用初始值。


系统时钟就是这样设置。


定时器Timer主要有两个用途:脉宽调制PWM功能和触发时间中断。2440有5个16位Timer,其中Timer0-3用作PWM,Timer4没有输出引脚用作内部定时器,Timer0还可以用作死区生成器驱动大电流设备。5个定时器都可以触发时间中断。

Timer用于PWM功能时涉及的寄存器有:配置寄存器TCFGn,控制寄存器TCON,计数缓存寄存器TCNTBn,比较缓存寄存器TCMPBn,计数观察寄存器TCNTOn;触发时间中断时还要中断相关的寄存器,比如中断等待寄存器SRCPND和INTPND(用于清中断),中断屏蔽寄存器INTMSK(开关功能)。

下面是定时器0中断的设置步骤:

(1)设置Timer0预先输入的时钟频率(使用预分频器0),可以理解为一级减频。


(2)设置Timer0最终的使用频率(用到的是MXU多路转换器),理解成二级减频。

(3)频率设置好了,现在就是要考虑定时多久(数多少次)的问题了。只需往数数缓存寄存器TCNTB0里面填数值,当你Timer0正常工作后它会自动送入16位的递减计数器中。【数数的相关的事还涉及一个比较缓存寄存器TCMPBn:用来设置脉宽调制,当递减计数器的值和TCMPBn匹配时,定时器控制逻辑将输出电平反转,这个寄存器明显是在使用PWM时候用】

(4)是时候使能Timer0了,配置TCON的Bit[4:0]。首次开始计时当然要手动update一下数数缓存寄存器,然后关掉手动update,用auto update,并使能Timer0

(5)以上是定时器的初始化,因为要用时间中断功能,所以接着使能Timer0中断,将INTMSK寄存器对应位置0即可。

(6)定义中断处理函数。首先要看看INTOFFSET的值,确定是发生了Timer0中断,进入处理,处理完了清中断,依次将SRCPND和INTPND置位。


看代码时间:启动文件和外部中断例程序基本一样,这里不再赘述。

init.c文件:初始化Timer0,设置中断函数

#define rWTCON      (*(volatile unsigned *)0x53000000)#define rLOCKTIME   (*(volatile unsigned *)0x4c000000)
#define rMPLLCON    (*(volatile unsigned *)0x4c000004)
#define rCLKCON     (*(volatile unsigned *)0x4c00000c)
#define rCLKSLOW    (*(volatile unsigned *)0x4c000010)
#define rCLKDIVN    (*(volatile unsigned *)0x4c000014)
#define rCAMDIVN    (*(volatile unsigned *)0x4c000018)
#define rTCFG0      (*(volatile unsigned *)0x51000000)
#define rTCFG1      (*(volatile unsigned *)0x51000004)
#define rTCON       (*(volatile unsigned *)0x51000008)
#define rTCNTB0     (*(volatile unsigned *)0x5100000c)
#define rTCMTB0     (*(volatile unsigned *)0x51000010)#define rINTOFFSET     (*(volatile unsigned *)0x4A000014)
#define rSRCPND        (*(volatile unsigned *)0x4A000000)
#define rINTPND        (*(volatile unsigned *)0x4A000010)
#define rINTMSK	       (*(volatile unsigned *)0x4A000008)#define rGPBDAT        (*(volatile unsigned *)0x56000014)
#define rGPBCON        (*(volatile unsigned *)0x56000010)
#define rGPBUP         (*(volatile unsigned *)0x53000018)void disable_watch_dog(void)
{rWTCON = 0;
}void clock_init(void)
{rLOCKTIME = 0xFFFFFFFF;rCLKDIVN = 0x03;//ratio=1:2:4,FCLK=200M,HCLK=100M,PCLK=50M__asm__ ("mrc p15,0,r1,c1,c0,0\n""orr r1,r1,#0xc0000000\n""mcr p15,0,r1,c1,c0,0\n");rMPLLCON = ((0x5c<<12)|(0x01<<4)|(0x02));//MPLL_200M
}void timer0_init(void)
{rTCFG0 = 99;rTCFG1 = 0x03;rTCNTB0 = 31250;//1s triggerrTCON |= (1<<1);rTCON =0x09;
}void timer0_irq_init(void)
{rINTMSK &= (~(1<<10));
}void gpio_init(void)
{rGPBUP &= ~(0xf<<5);//enable pull up funtionrGPBCON &= ~(0xff<<10);rGPBCON |= (1<<10)|(1<<12)|(1<<14)|(1<<16);//set gpio5-8 to outputrGPBDAT &= ~(0xf<<5);//light up all of the leds
}void Timer0_Handle(void)
{if(rINTOFFSET==10)//ensure the timer0 then deal with it{rGPBDAT = ~(rGPBDAT & (0xf<<5));//opposite the leds status}rSRCPND = 1<<rINTOFFSET;rINTPND = rINTPND;
}




这篇关于s3c2440_Clock Timer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051663

相关文章

4.15 版本内核调用 init_timer()函数出错

linux/include/linux/timer.h4.15 之前版本struct timer_list {14 /*15 * All fields that change during normal runtime grouped to the16 * same cacheline17 */18 struct hl

s3c2440---中断控制器

一、概述 S3C2440A 中的中断控制器接受来自 60 个中断源的请求。提供这些中断源的是内部外设,如 DMA 控制器、 UART、IIC 等等。 在这些中断源中,UARTn、AC97 和 EINTn 中断对于中断控制器而言是“或”关系。 当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求 ARM920T 内核的 FIQ 或 IRQ。 仲裁步骤由硬件优先级逻辑决定

java AWT 绘图,实现弹球游戏,有实现keylistener,timer功能

Timer(int delay, ActionListener listener):每间隔delay毫秒,系统自动触发ActionListener监听器里的事件处理器(actionPerformed()方法)。 package javaAWT;import java.awt.Canvas;import java.awt.Color;import java.awt.Dimension;imp

Timer和ScheduledThreadPoolExecutor

文章来源: https://blog.csdn.net/u013332124/article/details/79603943 在jdk自带的库中,有两种技术可以实现定时任务。一种是使用Timer,另外一个则是ScheduledThreadPoolExecutor。下面为大家分析一下这两个技术的底层实现原理以及各自的优缺点。 一、Timer 1. Timer的使用

s3c2440---PWM使用之蜂鸣器驱动移植

一、蜂鸣器驱动介绍 1.1.什么是蜂鸣器               蜂鸣器是一种简单的声响发生器,常用于电子产品中作为警示或提醒作用。其基本原理是通过交替改变直流电的电压方向来产生声音,一般使用交替电流产生声音会比较稳定。 1.2.蜂鸣器的类别 1.有源蜂鸣器 1)结构原理 有源蜂鸣器内部自带振荡源,只需接通电源即可发声。内部电路会自动产生一定频率的振荡信号,从而驱动蜂鸣器发声。

嵌入式S3C2440:控制LED灯

发光二极管接口(左端)应为低电平   以LED1为例 LED1的接口为GPB5 void led_init(void){//配置GPB5功能为输出GPBCON &= ~(0x3 << 10);GPBCON |= (0x1 << 10); //使GPB5输出高电平(关灯)GPBDAT |= (1 << 5);}void led_on(void){GPBDAT &= ~(1 <

Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用

1. SoundPool 用于快速重复的播放短音频 [java]  view plain copy public class MainActivity extends Activity {       private SoundPool soundPool;       private int soundId;          @Override       protec

S3C2440芯片手册词汇

2016年4月26日 small die size​ Instruction Interface  界面、接口   Touch Screen Interface, Camerainterface, IIC-BUS Interface。 a memory complier  存储器单元 CMOS standard cells  CMOS 标准宏单元 adopt 采用 arc

Angle Between Hands of a Clock

Given two numbers, hour and minutes, return the smaller angle (in degrees) formed between the hour and the minute hand. Answers within 10-5 of the actual value will be accepted as correct. Example 1

Android开发Timer计时器的操作实例

本文内容讲的是Android开发中Timer计时器如何实现。实际上Timer和TimerTask都是JDK自带的功能,两个类结合可以实现定时任务执行一次,或者定期重复执行任务。 下面模拟一个Android开发Timer计时器实例:   1、新建一个项目:Lesson34_Timer2、MainActivity.java代码如下:   package basic.android.timer