ARM9(S3C2440)时钟与定时器

ARM9定时器理解和寄存器的配置 1、理解51单片机的定时器工作原理: 单片机内部的计时功能是通过计数器的计数来实现的。每产生一个脉冲,则计数器加1。单片机中,计数器的脉冲周期 :T = 12/f (其中f 为晶振的频率),例如晶振的频率是12Mhz,则12/12*1000000 = 1 us ,即每微妙计数器加1。 2、ARM9计数器的理解 如何才能得到精确的定时呢?那就要靠TCFG0和TC 阅读详情

      时钟概念

一、时钟脉冲:一个按一定电压幅度,一定时间间隔连续发出的脉冲信号。

二、时钟频率:单位时间(如一秒)内产生的时钟脉冲个数。

           时钟作用

         时钟信号时时序逻辑(如一些芯片要一定的延时时间才能工作)的基础,它用于决定逻辑单元中的状态何时更新。数字芯片中众多的晶体管都工作在开关状态,他们的导通和关断动作无不是按照时钟信号的节奏进行的。

            (1)时钟产生-----晶振

        优点:性能稳定,频率稳定,准确。

        缺点:频率仅由晶体决定,通常是特定晶体被制成客户所需要的振荡器,导致成本,周期较长,不利于快速上市,而且难以获得非标准的频率。

            (2)时钟产生-----PLL

        PLL(锁相环)合成器是一种更为复杂的系统时钟源。通用PLL合成器需要一个外部晶体并包含一个能够对晶体的特定频率加倍或分频的集成锁相环(PLL)电路。

        

 

     S3C2440有两个PLL:MPLL与UPLL.

     (1)、UPLL专用于USB设备。

     (2)、MPLL用于CPU及其他外围器件。

      通过MPLL会产生三个部分的时钟频率:FCLK,HCLK,PCLK.

     FCLK用于CPU核,HCLK用于AHB(Advanced High-performance Bus:常用语高速外设),PCLK用于APB(Advanced Peripheral Bus:常用语低速外设)总线的设备(比如UART).

 

 

(1)、上电几毫秒后,(按下复位键(可以不需要这一步,系统自动复位)),外部晶振输出稳定,FCLK=外部晶振频率(12MHZ),nRESET信号恢复高电平后,

               CPU开始执行命令。

(2)、在设置MPLL几个寄存器后,需要等待一段时间(Lock Time),MPLL的输出才稳定。在这段时间内,FCLK停止震动,CPU停止工作。Lock Tine的长短

               由寄存 器LOCKTIME设定。

(3)、Lock Time之后,MPLL输出正常,CPU工作在新的FCLK(如400MHZ)下。

 

        寄存器

      S3C2440的时钟频率寄存器:

(1)、LOCKTIME寄存器

(2)、MPLLCON寄存器

(3)、CLKDIVN寄存器

 

 

 

      MPLLCON

 

  该寄存器用于设置FCLK与Fin (如我们的外部晶振为12MHz,那么Fin就是12MHz) 的倍数。公式如下:

    MPLL(FCLK) = ( 2*m*Fin ) / (p * 2^s)

   其中:m=MDIV+8 ,   p=PDIV+2, s=SDIV 

 

 

    CLKDIVN

 

该寄存器用于设置FCLK,HCLK,PCLK三者之间的比例。

 

                  

 

 

                          定时器

 

 

 

定时器部件的时钟源为PCLK,首先通过两个8位的预分频器降低频率:定时器0、1共用第一个预分频器,定时器2、3、4共用第二个预分频器。预分频器的输出将进入第二级分频器,它们输出5中频率的时钟:2分频、4分频、8分频、16分频或者外部TCLK0\TCLK1,每个定时器的工作时钟也可以从这5种频率中选择。

 

定时器驱动流程:初始化--------------->启动

 

(1)、定时器初始化

          1、定时器时钟频率 (如定时器时钟频率为50hz,则每秒减去50)

          2、设置定时器计数器 (如计数值为100,时钟频率为50hz,则定时器在2秒后超时)

          3、设置中断处理函数  (定时器超时或产生中断要处理的函数)

 

 

注意:(本例使用定时器0)

 

            定时器时钟频率:

 

          设置定时器计数器

 

通过设置TCON寄存器可以装载定时器计数值,并启动定时器。(设置第四位从新加载定时器)。

 

 

             定时器工作流程

1、程序初始化,设置TCMPBn,TCNTBn这两个寄存器,他们表示定时器n的比较值、初始计数值。

2、随之设置TCON寄存器启动定时器n,这时,CMPBn,TCNTBn的值将被装入其内部寄存器TCMPn、TCNTn中。在定时器n的工作频率下,TCNTn开始减一计数,其值可

       以通过TCNTO0寄存器得知。

3、当TCNTn的值等于TCMPn的值时,定时器n的输出管脚TOUTn反转;TCNTn继续减一计数。

 

 

代码:定时器控制LED.

主要代码为:


#define GLOBAL_CLK  1
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"

void Timer0_init(void);
static void __irq IRQ_Timer0_Handle(void);
void Set_Clk(void);
static void cal_cpu_bus_clk(void);
void Led1_init(void);
void Led1_run(void);

/*延时函数*/
void delay(int times)
{
    int i,j;
    for(i=0;i<times;i++)
       for(j=0;j<400;j++);
}

/*主函数*/
void Main(void)
{ 
    /*系统时钟设置*/
    Set_Clk();

    /*LED初始化*/
    Led1_init();
   
    /*定期器初始化*/
    Timer0_init();
   
    while(1);
} 
    
/*定时器初始化*/    
void Timer0_init(void)
{
 
  //Timer 0 init
  rTCFG0 = 49;                          //pclk/(49+1)
  rTCFG1 = 0x03;                     //16分频为62500HZ ,每秒减去62500,现在我们控制led每隔0.5秒闪烁一次,
                                                  //则: rTCNTB0 = 62500/2;         
  rTCNTB0 = 62500/2;          //TCNTB0[15:0]=计数值 
  rTCMPB0 = 0;
       
  rTCON =0x09;                      //将计数值装入TCNTB0、TCMPB0
 
  ClearPending(BIT_TIMER0);
  pISR_TIMER0 = (U32)IRQ_Timer0_Handle;
  EnableIrq(BIT_TIMER0);
}

/*定时器中断处理函数*/   
static void __irq IRQ_Timer0_Handle(void)
{


    ClearPending(BIT_TIMER0);   //为了下次继续产生中断
    Led1_run();
    
}

/*系统时钟设置函数*/
void Set_Clk(void)
{
 int i;
 U8 key;
 U32 mpll_val = 0 ;
 i = 2 ;              //don't use 100M!
                   //boot_params.cpu_clk.val = 3;
 switch ( i ) {
 case 0: //200
  key = 12;
  mpll_val = (92<<12)|(4<<4)|(1);
  break;
 case 1: //300
  key = 13;
  mpll_val = (67<<12)|(1<<4)|(1);
  break;
 case 2: //400
  key = 14;
  mpll_val = (92<<12)|(1<<4)|(1);
  break;
 case 3: //440!!!
  key = 14;
  mpll_val = (102<<12)|(1<<4)|(1);
  break;
 default:
  key = 14;
  mpll_val = (92<<12)|(1<<4)|(1);
  break;
 }
 
 //init FCLK=400M, so change MPLL first
 ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);   //set the register--rMPLLCON
 ChangeClockDivider(key, 12);    //the result of rCLKDIVN [0:1:0:1] 3-0 bit
 cal_cpu_bus_clk();    //HCLK=100M   PCLK=50M
}

 

static void cal_cpu_bus_clk(void)
{
 static U32 cpu_freq;
    static U32 UPLL;
 
 U32 val;
 U8 m, p, s;
 
 val = rMPLLCON;
 m = (val>>12)&0xff;
 p = (val>>4)&0x3f;
 s = val&3;

 //(m+8)*FIN*2 不要超出32位数!
 FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;     //FCLK=400M  FIN=12000000
 
 val = rCLKDIVN;
 m = (val>>1)&3;
 p = val&1; 
 val = rCAMDIVN;
 s = val>>8;
 
 switch (m) {
 case 0:
  HCLK = FCLK;
  break;
 case 1:
  HCLK = FCLK>>1;
  break;
 case 2:
  if(s&2)
   HCLK = FCLK>>3;
  else
   HCLK = FCLK>>2;
  break;
 case 3:
  if(s&1)
   HCLK = FCLK/6;
  else
   HCLK = FCLK/3;
  break;
 }
 
 if(p)
  PCLK = HCLK>>1;
 else
  PCLK = HCLK;
 
 if(s&0x10)
  cpu_freq = HCLK;
 else
  cpu_freq = FCLK;
  
 val = rUPLLCON;
 m = (val>>12)&0xff;
 p = (val>>4)&0x3f;
 s = val&3;
 UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
 UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
}

/*LED初始化*/
void Led1_init(void)
{
    rGPBCON &= ~(0x3<<10);
    rGPBCON |=  (0x1<<10);
}

/*LED点亮*/
void Led1_run(void)
{
    //rGPBDAT = rGPBDAT^(0x1<<5);
  
    if(rGPBDAT &(1<<5))
       rGPBDAT &=~(1<<5);
    else
       rGPBDAT |=(1<<5);
}

 

 

2440addr.h

#define ClearPending(bit) {\
   rSRCPND = bit;\
   rINTPND = bit;\
   rINTPND;\
  }

#define pISR_TIMER0   (*(unsigned *)(_ISR_STARTADDRESS+0x48))

#define EnableIrq(bit)  rINTMSK &= ~(bit)

define rINTMSK     (*(volatile unsigned *)0x4a000008) //Interrupt mask control

#define BIT_TIMER0  (0x1<<10)

 

void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
{
    rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
}

 

void ChangeClockDivider(int hdivn,int pdivn)
{
     // hdivn,pdivn FCLK:HCLK:PCLK
     //     0,0         1:1:1
     //     0,1         1:1:2
     //     1,0         1:2:2
     //     1,1         1:2:4
    rCLKDIVN = (hdivn<<1) | pdivn;   

    if(hdivn)
        MMU_SetAsyncBusMode();
    else
        MMU_SetFastBusMode();
}

.............

 

 

 

 

ARM裸机到ThreadX:手把手教你移植系统时钟与中断处理(基于S3C2440) 本文详细介绍了在S3C2440 ARM处理器上移植ThreadX实时操作系统的关键步骤,重点讲解了系统时钟配置与中断处理机制。通过实战代码示例,展示了如何初始化硬件定时器、设计异常向量表以及集成ThreadX内核时钟,帮助开发者掌握ARM架构下的RTOS移植核心技术。 阅读详情

相关推荐

深入解析S3C2440定时器在嵌入式系统中的应用与实现

在嵌入式系统设计中,定时器是实现时间管理与控制的重要组件。S3C2440作为一款广泛应用于移动设备和嵌入式系统的处理器,其内置的定时器模块承担了系统中许多重要时间控制任务。定时器通常用于测量时间间隔、生成精确的时钟信号、管理任务调度和协调外设事件等。本章将简要介绍S3C2440定时器的基本组成和功能,为后续章节深入探讨定时器的各种工作模式、配置和优化方法打下基础。- **基本组成**:S3C2440的定时器包含多个独立的定时/计数器,支持自由运行和比较模式。

weixin_36487018的博客 651

mini2440硬件篇之系统时钟

1. 硬件原理 一般系统的时钟又外部晶振促发,通过内部电路产生时钟源。2440时钟控制逻辑给整个芯片提供了三种时钟,FCLK用于CPU核,HCLK用于AHB总线设备,如CPU核、存储控制器、中断控制器、LDC控制器、DMA;PCLK用于APB总线设备,如看门狗、IIS、IIC、PWM定时器、MMC、ADC、UART、GPIO、RTC、SPI。AHB用于高速传输、APB用于低速传输。2440外接1

幕天席地的专栏 1109

ARM9 定时器详解 PPT

ARM9 定时器详解 PPT ARM9 定时器详解 PPT ARM9 定时器详解 PPT

S3c2440之时钟频率(修改综合版)

转帖:http://blog.youkuaiyun.com/mr_raptor/article/details/6555734   开发板在没有开启时钟前,整个开发板全靠一个12MHz的晶振提供频率来运行,当MPLLCON存入初值,并开始生效后,S3C2440A可以正常工作在400MHz下。开发板的主板上的外设和CPU也有一个频率限度,ARM920T内核的S3C2440的最高正常工作频率如下:

iefswang的专栏 4874

ARM9嵌入式Linux开发-系统时钟和定时器

ARM9嵌入式Linux开发-系统时钟和定时器的demo 结合博客一起看https://ce123.blog.youkuaiyun.com/article/details/105172923

ARM9裸机———定时器

基于TQ2440开发板写的,通过定时器0 1S的定时实现LED1的闪烁

S3C2440时钟描述

S3C2440 CPU默认的工作主频为12MHz或16.9344MHz,这里使用最多的是12M。使用PLL电路可以产生更高的主频供CPU及外围器件使用。S3C2440有两个PLL:MPLL和UPLL,UPLL专用与USB设备。MPLL用于CPU及其他外围器件。通过MPLL会产生三个部分的时钟频率:FCLK、HCLK、PLCK。FCLK用于CPU核,HCLK用于AHB总线的设备(比如SDRAM),PCLK用于APB总线的设备(比如UART)。1、上电几毫秒后,晶振输出稳定,FCLK=晶振频率,nRESET信号

RITADAY的专栏 1599

COMSOL仿真避坑指南:列管反应器模拟中多孔介质与化学反应设置的5个常见错误

本文详细解析了COMSOL仿真中列管反应器模拟的5个常见错误,包括多孔介质模型选择、化学反应接口配置、对流扩散方程处理、薄层热阻设置及网格独立性验证。特别针对多孔介质与化学反应设置的误区,提供了实用的判断标准和修正方法,帮助工程师避免计算偏差,提升仿真精度。

weixin_29597551的博客 321

s3c2440的时钟详解

  这几天一直忙着研究移植U-boot,移植U-boot的过程中有一步很重要,就是要设置s3c2440的时钟,什么 Fin,Fclk,Hclk,Pclk,Mpll,Upll等时钟信号,让初学者看得一头雾水,各种信号混淆不清,本人特意花了一点时间,把这些东东理了理,现整理如下:     首先得弄清一个大的框架,s3c2440 cpu的默认工作主频有两种12MHz和16.9344MHz,也就是我们的晶振的频率,但一般12MHz的晶振用的比较多,Fin就是指我们接的晶振频率。大家都知道s3c2440上电正常工作后

转角遇到嵌入式 3060

SAP S4业务伙伴(BP)实战指南:从角色分配到数据同步的完整流程

本文详细解析了SAP S4业务伙伴(BP)功能,从基础概念到实战操作,涵盖角色分配、数据同步及常见问题排查。通过BP机制,企业可高效管理客户、供应商等多重身份,实现数据共享和动态切换,显著提升主数据管理效率。特别适合SAP实施顾问和ERP管理员参考。

y2z3a4b5c的博客 870

解决Keil uVision许可证管理中Unknown Product错误

嵌入式开发中,IDE工具的许可证管理是确保开发环境正常运行的关键环节。Keil uVision作为ARM架构的主流开发工具,其许可证系统采用加密验证机制,通过产品版本识别实现授权控制。当出现Unknown Product错误时,通常源于版本兼容性问题或区域发行版差异,这直接影响开发工具链的可用性。特别是在维护历史项目或使用中国特供版时,开发者常会遇到此类问题。通过分析许可证类型、调整安装配置或建立虚拟化开发环境等工程实践方案,可以有效解决这类授权验证故障,保障嵌入式项目的持续集成与交付效率。

weixin_33743248的博客 363

ARM裸机开发实战:手把手教你为ThreadX移植定时器中断(基于S3C2440)

本文详细介绍了在S3C2440平台上为ThreadX移植定时器中断的实战步骤,涵盖硬件初始化、中断向量表配置、ThreadX时钟中断集成等关键环节。通过具体代码示例和调试技巧,帮助开发者掌握ARM裸机开发中的中断处理技术,实现精确的系统时钟管理。

weixin_28721917的博客 345

Lammps纳米压痕接触面积—Matlab接触面积计算(两种方法)

Lammps纳米压痕接触面积计算

Rockyoung 5448

深入时钟与定时器

前言 这篇主要介绍arm9时钟与定时器方面,根据s3c2440手册第七章的内容来看,涉及到不少的知识点,power管理、时钟、usb时钟、camera等,接下来只介绍时钟方面,其余部分以后再说 简介 系统时钟是整个电路的心脏,了解系统时钟结构对于后面学习定时器,UART等使用具有非常重要的作用,总体来说,与s3c2440处理器有关的时钟主要有4种: FIN, FCLK, HCLK和PCLK

human!的专栏 1455

HBase批量导入工具:BulkLoad使用详解

HBase作为分布式NoSQL数据库,在大数据领域有着广泛应用。传统的数据写入方式(如Put操作)在面对海量数据导入时存在性能瓶颈。BulkLoad提供了一种高效的大批量数据导入方案,可以显著提高数据加载速度并降低集群负载。BulkLoad的核心原理和架构与传统写入方式的性能对比详细的使用方法和实现步骤性能优化技巧和最佳实践实际应用案例分析本文首先介绍BulkLoad的基本概念和原理,然后深入讲解其实现机制和关键技术。接着通过实际案例演示BulkLoad的使用方法,并分析性能优化策略。

大数据洞察的博客 1236

拼多多笔试真题-多多送快递(C++/Py/Java /Js/Go)

拼多多技术岗笔试 8月2号真题,拼多多笔试第三题【多多送快递】,提供详细思路讲解以及Java、C++、Python、Go、JavaScript多语言代码实现。拼多多笔试真题【多多送快递】多语言题解。

qq_45776114的博客 292

ARM9 S3C2440 定时器中断

ARM9 S3C2440 定时器中断 在讲解之前,先介绍一下s3c2440时钟系统。一般来说,MCU的主时钟源主要是外部晶振或外部时钟,而用的最多的是外部晶振。在正确情况下,系统内所使用的时钟都是外部时钟源经过一定的处理得到的。由于外部时钟源的频率一般不能满足系统所需要的高频条件,所以往往需要PLL(锁相环)进行倍频处理。在s3c2440中,有2个不同的PLL,一个是M...

weixin_34072637的博客 126

PCL 动态半径滤波【2025最新版】

使用PCL实现的2022年最新SCI论文——【Design of Dust-Filtering Algorithms for LiDAR Sensors Using Intensity and Range Information in Off-Road Vehicles】 一文中提出用于自动驾驶点云剔除粉尘、雨雪等影响因素导致的噪声点滤波算法。

点云侠的博客 1473

硬件设备基础

首先 ARM 架构支持 7 种类型的异常,分别是:复位异常,系统重启或开机时会产生此异常。处理器无法识别指令的异常,处理器执行的指令是有规范的,如果尝试执行不符合要求的指令,就会产生此异常。软中断,软件中需要去打断处理器工作,可以使用软中断来执行,当执行 SWI 指令时就会产生此异常。预取指令失败,ARM 在执行指令的过程中,要先去预取指令准备执行,如果预取指令失败,就会产生该异常。读取数据失败。普通中断。快速中断。异常发生时,ARM。

zxhssl的博客 1224

VTK-9.5.0 1D2D3DWidget实现灰度图+深度图+3D点云显示(可轻松集成到自己的项目)

VTK1D2D3DWidget是一个基于Qt和VTK开发的3D点云可视化工具,支持RGB和深度点云数据的显示与处理。主要功能包括点云加载、可视化、保存为PLY格式文件,以及背景颜色、点间隔、坐标轴显示等参数的自定义设置。该工具采用模块化设计,核心组件包括主窗口管理类、VTK渲染组件和自定义鼠标交互样式,依赖Qt5+和VTK9.5.0库实现跨平台支持。项目提供完整的源码和构建指南,适用于点云数据的快速展示与分析。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 385

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux设备驱动程序学习(10)

度量时间差 时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据 HZ 值来设定,HZ 是一个体系依赖的值,在 中定义或该文件包含的某个子平台相关文件中。作为通用的规则,即便如果知道 HZ 的值,在编程时应当不依赖这个特定值,而始终使用HZ。对于当前版本,我们应完全信任内核开发者,他们已经选择了最适合的HZ值,最好保持 HZ 的默认值。  对用户空间,内核HZ几乎完全隐藏,用户

临时工 Temporary's Space 5103

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Linux设备驱动程序学习———时间、延迟及延缓操作

度量时间差 时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据 HZ 值来设定,HZ 是一个体系依赖的值,在中定义或该文件包含的某个子平台相关文件中。作为通用的规则,即便如果知道 HZ 的值,在编程时应当不依赖这个特定值,而始终使用HZ。对于当前版本,我们应完全信任内核开发者,他们已经选择了最适合的HZ值,最好保持 HZ 的默认值。   对用户空间,内核HZ几乎完全隐藏,

hudaliquan的专栏 861

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

s3c2440的处理器结构和外设连接

1、总线与外设的连接框图

qingkongyeyue的博客 1900

51单片机+arm9裸机驱动基于TE2440II开发板

哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处 http://blog.youkuaiyun.com/woshixingaaa/archive/2011/02/17/6191799.aspx 今年我大三,下面记录了我学嵌入式的裸机部分,共享出来,跟大家共同进步。也许程序不是最优的,但是已经努力了,嘿嘿,有些没做完的,以后用到补上。有问题的留言给我,不要QQ讨论,嘿嘿,比较忙的。 51单...

编程开发资料库 161
上一篇: ARM9(S3C2440) LED控制
下一篇: ARM9(S3C2440) UART
sjmp
博客等级 码龄15年 56粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值