在讲解之前,先介绍一下s3c2440时钟系统。一般来说,MCU的主时钟源主要是外部晶振或外部时钟,而用的最多的是外部晶振。在正确情况下,系统内所使用的时钟都是外部时钟源经过一定的处理得到的。由于外部时钟源的频率一般不能满足系统所需要的高频条件,所以往往需要PLL(锁相环)进行倍频处理。在s3c2440中,有2个不同的PLL,一个是MPLL,另一个是UPLL。UPLL是给USB提供48MHz。在这里,我们主要介绍MPLL。外部时钟源经过MPLL处理后能够得到三个不同的系统时钟:FCLK、HCLK和PCLK。FCLK是主频时钟,用于ARM920T内核;HCLK用于AHB总线设备,如ARM920T,内存控制,中断控制,LCD控制,DMA以及USB主模块;PCLK用于APB总线设备,如外围设备的看门狗,IIS,I2C,PWM,MMC接口,ADC,UART,GPIO,RTC以及SPI。这三个系统时钟(FCLK、HCLK和PCLK)是有一定的比例关系,这种关系是通过寄存器CLKDIVN中的HDIVN位和PDIVN位来控制的,因此我们只要知道了FCLK,再通过这两位的控制,就能确定HCLK和PCLK。而FCLK是如何得到的呢?它是通过输入时钟(即外部时钟源)的频率,经过一个计算公式(具体公式请查阅数据手册)得到的,这个计算公式还需要三个参数(MDIV、PDIV、SDIV),而这三个参数是经过寄存器MPLLCON配置得到的。最后,我们用最清晰的线路来绘制一下时钟的产生过程:外部时钟源→通过寄存器MPLLCON得到FCLK→再通过寄存器CLKDIVN得到HCLK和PCLK。这个配置过程在启动文件中就已完成。在本开发板上,外部晶振为12MHz,进过MPLL倍频以后得到400MHz的FCLK,而FCLK、HCLK、PCLK之间的比例关系为1:4:8,因此HCLK为100MHz,PCLK为50MHz。

s3c2440的时钟系统就介绍到这里,我们再回到定时器的配置上来。如何才能得到精确的定时呢?那就要靠TCFG0和TCFG1这两个寄存器来配置定时器的频率,即要确定TCNTOn每递减一个数所需要的时间,它们之间是倒数的关系。具体的计算公式为:

定时器输出时钟频率=PCLK ÷ (prescaler+1) ÷ divider

其中prescaler值由TCFG0决定,divider值由TCFG1决定,而prescaler只能取0~255之间的整数,divider只能取2、4、8和16。比如已知PCLK为50MHz,而我们想得到某一定时器的输出时钟频率为25kHz,则依据公式可以使prescaler等于249,divider等于8。有了这个输出时钟频率,理论上我们通过设置寄存器TCNTBn就可以得到任意与0.04毫秒(1÷25000×1000)成整数倍关系的时间间隔了。例如我们想要得到1秒钟的延时,则使TCNTBn为25000(1000÷0.04)即可。

下面我们通过一段程序来演示利用定时器得到精确延时。这里我们用到的是定时器4。这段程序的作用是让蜂鸣器每隔2秒钟响一次,持续时间为0.5秒,蜂鸣器响的同时伴随着LED亮。

#define _ISR_STARTADDRESS 0x33ffff00

#define U32 unsigned int

#define pISR_TIMER4         (*(unsigned *)(_ISR_STARTADDRESS+0x58))

#define rSRCPND     (*(volatile unsigned *)0x4a000000)     //Interrupt request status

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

#define rINTPND     (*(volatile unsigned *)0x4a000010)      //Interrupt request status

#define rGPBCON    (*(volatile unsigned *)0x56000010)      //Port B control

#define rGPBDAT    (*(volatile unsigned *)0x56000014)       //Port B data

#define rGPBUP     (*(volatile unsigned *)0x56000018) //Pull-up control B

#define rTCFG0 (*(volatile unsigned *)0x51000000)      //Timer 0 configuration

#define rTCFG1 (*(volatile unsigned *)0x51000004)      //Timer 1 configuration

#define rTCON   (*(volatile unsigned *)0x51000008)      //Timer control

#define rTCNTB4 (*(volatile unsigned *)0x5100003c)       //Timer count buffer 4

void __irq Timer4_ISR(void)

{

static int count;

count ++;

rSRCPND = rSRCPND | (0x1<<14);

rINTPND = rINTPND | (0x1<<14);

//每隔2秒蜂鸣器响一次,持续时间为0.5秒,并伴随着LED亮

if (count % 4 ==0)

rGPBDAT = ~0x1e0;            //蜂鸣器响,LED亮

else if (count % 4 ==1)

rGPBDAT = 0x1e0;      //蜂鸣器不响,LED灭

}

void Main(void)

{

rGPBCON = 0x155555;               //B0输出,给蜂鸣器;B5~B8输出,给LED

rGPBUP = 0x7ff;

rGPBDAT = 0x1e0;      //蜂鸣器不响,LED灭

rSRCPND = rSRCPND | (0x1<<14);

rINTPND = rINTPND | (0x1<<14);

rINTMSK = ~(0x1<<14);            //打开定时器4中断

rTCFG0 &= 0xFF00FF;

rTCFG0 |= 0xf900;        // prescaler等于249

rTCFG1 &= ~0xF0000;

rTCFG1 |= 0x20000;     //divider等于8,则设置定时器4的时钟频率为25kHz

rTCNTB4 = 12500;              //让定时器4每隔0.5秒中断一次

rTCON &= ~0xF00000;

rTCON |= 0x700000;

rTCON &= ~0x200000 ;              //定时器4开始工作

pISR_TIMER4 = (U32)Timer4_ISR;

while(1)

{

;

}

}

ARM9 S3C2440 定时器中断相关推荐

  1. Keil5 平台 S3C2440裸机程序开发-----定时器中断

    前言 本博文介绍mini2440开发板,在keil5平台上进行定时器中断开发的一些基本配置. 一.定时器配置 ​ #include "S3C2440.h" #include &qu ...

  2. [笔记].如何使用Nios II的中断:PIO中断与定时器中断

    引子 定时器中断,我以前在艾米电子论坛发帖讨论过:PIO中断我在博客里也讨论过,最近发现以前的总结有一点小错误.于是结合我最近玩触摸屏的一点点心得,写篇博文. 软硬件环境 硬件:艾米电子EP2C8核心 ...

  3. stm32定时器中断_stm32F4之定时器的基本使用

    概述 上一篇说了stm32F4GPIO的使用,这篇说说定时器的使用 一. stm32F407的定时器资源介绍: ​ STM32F407有14个定时器,其中有12个16位的定时器,2个32位的定时器 这 ...

  4. STC10F10XE定时器中断输出10KHz的方波程序

    //咱做硬件的也动手做点测试程序,为了测试新做的电机驱动板,找了个51的板子当10K信号发生器测试IGBT开关延时时间. #include <STC_NEW_8051.H> #includ ...

  5. 【STM32】定时器中断实验代码详解

    文章目录 main.c timer.c timer.h STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成. STM32 的通用定时器可以被用于:测 ...

  6. 单片机定时报警C语言程序,51单片机 定时器 中断程序 (C语言)

    EA     是 中断总开关, 不管是定时器,串口还是外部中断,都需要打开 EA 才能触发中断; ET0   是 定时器0 的专用中断开关, 也就是说: 打开了EA.而不打开ET0,定时器0是无法触发 ...

  7. stm32定时器中断类型分析

    一直在用的stm32定时器的中断都是TIM_IT_Update更新中断,也没问为什么,直到碰到有人使用TIM_IT_CC1中断,才想到这定时器的中断类型究竟有什么区别,都怪当时学习stm32的时候不够 ...

  8. java 定时器 的中断程序,STM32定时器中断

    我试图在STM32L073中使用定时器外设但我有问题 . 我在STM32Cube中生成了设置代码,并且只使用了HAL API提供的函数 . 问题是定时器中断只发生一次,它应该始终发生溢出 . 我不知道 ...

  9. 单片机原理及其应用——单片机定时器中断实验(八段数码管依次显示0~9数字)

    目录 一.实验要求 二.知识要点 (一)单片机定时器/计数器 (二)相关的特殊功能寄存器 1.工作方式寄存器TMOD 2.定时器/计数器控制寄存器TCON (三)定时器/计数器的工作方式 1.工作方式 ...

  10. 单片机中断程序实例_单片机定时器中断实现长时间定时程序

    单片机定时器中断实现长时间定时程序 #include // 包含51单片机寄存器定义的头文件 sbit D1=P2^0; //将D1位定义为P2.0引脚 unsigned char Countor; ...

最新文章

  1. 2月上旬国内域名总量止跌回升 净增长量达8574个
  2. 7月的夏日北京必联网公司一行(图文)
  3. @ParameterizedTest在@CvsSource中具有空值
  4. LeetCode 963. 最小面积矩形 II
  5. 小程序switch内部加上文字_文字游戏大全:模拟游戏会长经营公会的小程序,你会管理公会吗?...
  6. Vue 双向绑定小案例
  7. Hotmail的2G邮箱被收回,只剩250M了
  8. 请求方报超时,服务日志中记录的时间却少有超时
  9. 《微服务设计》(一)---- 微服务
  10. Asp.net core 通过Models 生成数据库的方法
  11. 智能安防 | 太阳能低功耗视频监控解决方案
  12. vivo手机自启动及定时开关机
  13. css 子元素选择器
  14. AB01固定资产过账
  15. web表格控件FineReport作为企业web表格制作软件的核心优势
  16. python 爬虫 金山词霸每日一句 优美的文段中英文爬取自编
  17. 面向微服务架构与传统架构、SOA对比,以及云化对比
  18. 我希望我们在Java中拥有十大锡兰语言功能
  19. TAD2141 角度传感器使用SPI:数据手册略读
  20. 星巴克中国门店突破6000家,上海继续领跑全球,开出第1000家 | 美通社头条

热门文章

  1. 【路径规划】基于matlab蚁群和粒子群算法双机器人协调路径规划【含Matlab源码 045期】
  2. c语言程序设计精髓第七周编程题,C语言程序设计精髓编程题在线测试
  3. 消除PyCharm中满屏的波浪线
  4. python更换证件照背景
  5. ubuntu 设置静态路由_Linux route 配置静态路由(转载)
  6. 第一章计算机基础知识作业答案,计算机基础作业题1答案
  7. 适应图像_目标检测的渐进域自适应,优于最新SOTA方法
  8. 2019一注结构成绩_2019年福建地区计算机考研汇总分析
  9. html position属性作用,position(五种属性,以及每个属性的特点)
  10. python爬取方式_Python3 实现爬取网站下所有URL方式