|
本帖最后由 liuliya21c 于 2011-11-1 21:27 编辑
在裸奔用定时器做个定时中断,用小灯来检测下,无奈做了一天一直没解决问题,总是进不去中断,而且程序的switch语句在JLINK仿真时也有问题,只能在部分的case语句那放置断点,请指点下,谢谢,下面我贴下我的程序
#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"
//宏定义---------------------------------------------------------
#define LED1_ON (rGPBDAT&=(0<<5))
#define LED1_OFF (rGPBDAT&=(1<<5))
#define LED2_ON (rGPBDAT&=(0<<6))
#define LED2_OFF (rGPBDAT&=(1<<6))
#define LED3_ON (rGPBDAT&=(0<<7))
#define LED3_OFF (rGPBDAT&=(1<<7))
#define LED4_ON (rGPBDAT&=(0<<8))
#define LED4_OFF (rGPBDAT&=(1<<8))
#define M_DIV 92
#define M_PDIV 1
#define M_SDIV 1
#define U_DIV 56
#define U_PDIV 2
#define U_SDIV 2
#define CLKDIVN_VAL 5
#define CNT_TIM0 25000
//变量声明--------------------------------------
unsigned char ucFlag1s;
unsigned char ucCntTime;
//----------定时器0中断处理子程序---------------
void __irq TIME0_INT()
{
rSRCPND|=(1<<10);//写1来清除标志位
rINTPND|=(1<<10);;//写1来清除标志位
if(++ucCntTime==10)
{
ucCntTime=0;
ucFlag1s=1;
}
}
//-----------初始化GPORTB用来控制LED-------------------
void init_PORT()
{
rGPBUP =0x7ff;
rGPBCON =0x155555; //设置为输出
rGPFCON =0X0000; //设置为输入
rGPBDAT |=0x1e0; //
}
//------------初始化TIME0作为定时功能
void init_Time0()
{
rLOCKTIME=0xFFFFFFFF; //锁定时间计数寄存器
rUPLLCON=(U_DIV<<12)+(U_PDIV<<2)+U_SDIV;
//UPLL控制寄存器:Fin=12M,UCLK=48M
rMPLLCON=(M_DIV<<12)+(M_PDIV<<2)+M_SDIV;
//MPLL控制寄存器:Fin=12M,FCLK=400M
rCLKDIVN=CLKDIVN_VAL; //时钟分频控制寄存器:运算结果PCLK=FCLK/8=50M
//定时器输入时钟频率=PCLK/{预分频值+1}/分频值
rTCFG0&=~0xFF; //定时器0配置寄存器
rTCFG0=99; //预分频值=99;
rTCFG1=0; //MUX0=1/2;
//至此,计数周期为250000
rTCNTB0=CNT_TIM0; //25000/250000=0.1s,即0.1s中断一次
rTCON|=0x0000000f; //开定时器0中断,开启手动更新,自动重载
rTCON|=(1<<1); //关闭手动更新
rINTMSK &=~(1<<10); //开中断
pISR_TIMER0=(U32)TIME0_INT;//中断处理函数
}
//-----------初始化看门狗-----------------------
void init_WatchDog()
{
rWTCON=0x0000; //关狗
}
//-----------主程序的初始化---------------------
void init_main()
{
init_WatchDog();
init_Time0();
init_PORT();
ucFlag1s=0;
}
//-----------显示主程序-------------------------
//1s到了,LED顺序点亮,再顺序熄灭
void DispLed()
{
static unsigned char ucTemp;
if(ucFlag1s==0)return;
ucFlag1s=0;
switch(ucTemp)
{
case 0:
LED1_OFF;
LED2_OFF;
LED3_OFF;
LED4_OFF;
break;
case 1:
LED1_ON;
break;
case 2:
LED2_ON;
break;
case 3:
LED3_ON;
break;
case 4:
LED4_ON;
break;
case 5:
LED4_OFF;
break;
case 6:
LED3_OFF;
break;
case 7:
LED2_OFF;
break;
case 8:
LED1_OFF;ucTemp=0;
break;
default :ucTemp=0;break;
}
ucTemp++;
}
//-----------主程序循环-------------------------
void Main(void)
{
init_main();
while(1)
{
DispLed();
}
} |
|