mini2440 定时器中断实验
2011-09-26 13:39
465 查看
Timer定时器主要配置一下寄存器1、TCFG0和TCFG1:分别设为119和0x03 这俩个寄存器用于设置“Control Logic”的时钟,计算公式如下:
Timer input clock Frequency = PCLK / {prescaler value+1} / {divider value}
对于TIMER0,prescaler value = TCFG0[7:0],divider value由TCFG[3:0]确定(0b000:2,0b001:4,0b010:8,0b0011:16,0b01xx:使用外部TCLK0)。
对于本实验假设PLCK为50M(需要控制PLL在后面实验才能配置),TIMER0时钟 = 50MHz/(249+1)/(8) = 25Hz (1000/25000=0.04ms)意思为每0.04ms减一个数,需要25000个数才到1000ms。
TCNTB0:设为25000(1000ms/0.04ms=25000),在25Hz的频率下,此值对应的时间为1S
#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 beep_init(void)//蜂鸣器初始化
{
rGPBCON =1<<0;// 设置GPB0为输出端口
rGPBUP=1<<0;//禁止GPB0上拉功能
}
void inter_init()//中断初始化函数
{
rINTMSK &=~(1<<10); //屏蔽Timer0以外的中断源
rINTMOD &=~(1<<10);//把Timer0中断设为IRQ模式
}
void Timer0_init()//定时器初始化
{
rTCFG0=119;//设置TCG0
rTCFG1 &=(0x2<<0);//8分频
rTCNTB0 = 25000;//设置TCNTB0数据
rTCON |=(1<<1);//将TCNTBn和TCMPBn的值分别写入TCNTn和TCNPn
rTCON=0x9;//将Timer0设为自动装载并开启Timer0
}
static void __irq Timer0_ISR(void) //TIMER0发生时的中断处理函数
{
static int flag=0;//定义一个标志位
if(flag==0)//为0蜂鸣器
{
rGPBDAT =0x1;//蜂鸣器响
flag=1;//标志位置1
}
else
{
rGPBDAT=0x0;//蜂鸣器不响
flag=0;//标志位置0
}
rSRCPND |=(1<<10);//清除Timer0中断器标记位
rINTPND |=(1<<10);//清除总中断器标记位
}
void Main(void)
{
MMU_Init();//初始化内存,实现内存地址重定向
beep_init();//初始化蜂鸣器
inter_init();//中断初始化
Timer0_init();//配置定时器
pISR_TIMER0 = (U32)Timer0_ISR;//将中断服务函数的地址传给对应的中断向量表位置
while(1); //死循环等待中断的发生
}
Timer input clock Frequency = PCLK / {prescaler value+1} / {divider value}
对于TIMER0,prescaler value = TCFG0[7:0],divider value由TCFG[3:0]确定(0b000:2,0b001:4,0b010:8,0b0011:16,0b01xx:使用外部TCLK0)。
对于本实验假设PLCK为50M(需要控制PLL在后面实验才能配置),TIMER0时钟 = 50MHz/(249+1)/(8) = 25Hz (1000/25000=0.04ms)意思为每0.04ms减一个数,需要25000个数才到1000ms。
TCNTB0:设为25000(1000ms/0.04ms=25000),在25Hz的频率下,此值对应的时间为1S
#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 beep_init(void)//蜂鸣器初始化
{
rGPBCON =1<<0;// 设置GPB0为输出端口
rGPBUP=1<<0;//禁止GPB0上拉功能
}
void inter_init()//中断初始化函数
{
rINTMSK &=~(1<<10); //屏蔽Timer0以外的中断源
rINTMOD &=~(1<<10);//把Timer0中断设为IRQ模式
}
void Timer0_init()//定时器初始化
{
rTCFG0=119;//设置TCG0
rTCFG1 &=(0x2<<0);//8分频
rTCNTB0 = 25000;//设置TCNTB0数据
rTCON |=(1<<1);//将TCNTBn和TCMPBn的值分别写入TCNTn和TCNPn
rTCON=0x9;//将Timer0设为自动装载并开启Timer0
}
static void __irq Timer0_ISR(void) //TIMER0发生时的中断处理函数
{
static int flag=0;//定义一个标志位
if(flag==0)//为0蜂鸣器
{
rGPBDAT =0x1;//蜂鸣器响
flag=1;//标志位置1
}
else
{
rGPBDAT=0x0;//蜂鸣器不响
flag=0;//标志位置0
}
rSRCPND |=(1<<10);//清除Timer0中断器标记位
rINTPND |=(1<<10);//清除总中断器标记位
}
void Main(void)
{
MMU_Init();//初始化内存,实现内存地址重定向
beep_init();//初始化蜂鸣器
inter_init();//中断初始化
Timer0_init();//配置定时器
pISR_TIMER0 = (U32)Timer0_ISR;//将中断服务函数的地址传给对应的中断向量表位置
while(1); //死循环等待中断的发生
}
相关文章推荐
- 一起学mini2440裸机开发(十一)--mini2440定时器0中断实验
- 一起学mini2440裸机开发(十一)--mini2440定时器0中断实验
- mini2440串口轮询实验(先简单复习一下串口轮询模式,明天把中断模式和dma模式弄清楚)
- 外部中断与定时器中断实验
- 4、定时器中断实验
- 定时器中断 流水灯实验
- 一起学mini2440裸机开发(五)--定时器0的基础实验
- 中断和定时器实验
- 定时器中断实验
- 实验3 RTC定时器的应用及中断机制
- mini2440 RTC实时时钟中断和报警功能实验
- 实验二:外部中断与定时器/计数器中断实验
- 定时器中断---那些年我们一起玩mini2440(arm9)裸机
- 一起学mini2440裸机开发(五)--定时器0的基础实验
- STM32学习-定时器中断实验
- zynq 的定时器中断实验
- STM32串口采样与仪表步进电机控制程序(主程序与串口程序,需用正点原子定时器中断实验程序模板)
- 一起学mini2440裸机开发(十)--mini2440外部中断实验
- 外部中断与定时器中断实验(修改)
- 嵌入式成长轨迹44 【Zigbee项目】【CC2430基础实验】【定时器中断】