mini2440裸机程序--定时器中断
定时器内部控制逻辑的流程如下:
1、程序初始,设定TCMPBn、TCNTBn这两个寄存器。他们表示定时器N的比较值和初始计数值。
2、随之设置TCON寄存器启动定时器N,这时TCMPBn,TCNTBn的值将被装入其内部的寄存器TCMPn,TCNTn中,在定时器N的工作频率下,TCNTN 开始减一计数,其值可以通过读取TCNTOn寄存器得知。
3、当TCNTn的值等于TCMPN的值时,定时器N的输出管脚TOUTN反转;TCNTN继续减一计数,当TCNTN的值到达0时,其管脚TOUTN再次反转,并触发定时器N的中断。
4、当TCNTn的值到达0时,如果在TCON寄存器中将定时器N设为 自动加载 ,则TCMPBn 和 TCNTBn寄存器的值被自动装入TCMPn 和TCNTn寄存器中,下一个计数流程开始。
程序如下:(参考了其他人的)
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "def.h"
#include "Option.h"
#define U32 unsigned int
void __irq Timer4_ISR(void)
{
static int count;
count ++;
rSRCPND = rSRCPND | (0x1<<14);//定时器4 清零
rINTPND = rINTPND | (0x1<<14);//清中断
//每隔2秒蜂鸣器响一次,持续时间为0.5秒,并伴随着LED亮
if (count % 4 ==0)
rGPBDAT = ~0x1ee; //蜂鸣器响,LED亮
else if (count % 4 ==1)
rGPBDAT = 0x1ee; //蜂鸣器不响,LED灭
}
void Main(void)
{
MMU_Init();
rGPBCON = 0x155555; //B0输出,给蜂鸣器;B5~B8输出,给LED
rGPBUP = 0x7ff;
rGPBDAT = 0x1e0; //蜂鸣器不响,LED灭
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);
}
浙公网安备 33010602011771号