我用531定时器中断写的程序可以编译过但是运行不正常,大家帮忙看下。
// 头文件包含
#include <ccblkfn.h>
#include <cdefBF531.h>
#include <sysreg.h>
#include <sys\exception.h>
// LED操作地址定义
#define pLed (volatile unsigned char *)0x203D0000
#define pSEG_8_0 (volatile unsigned char *)0x203C4000
#define pSEG_8_1 (volatile unsigned char *)0x203CC000
#define pSEG_8_2 (volatile unsigned char *)0x203C8000
#define pSEG_8_3 (volatile unsigned char *)0x203C0000
// 宏定义
// 常量定义
const unsigned char NumberData[13] = {
0x24, 0x7D, 0x16, 0x54, 0x4D, 0xC4, 0x84, 0x75, 0x04, 0x44, 0xFB,
// 0 1 2 3 4 5 6 7 8 9 .
0x00, 0xFF};
// 全亮 全灭
unsigned int i=0,j,m,n,Dings=0;
int led = 0x01;
/********************************************************
*
* 函数名 : Init_PLL
* 函数功能 : 初始化配置BF531的PLL寄存器
* 函数输入参数 : 无
* 函数输出 : 无
* 说明 : 无
*
********************************************************/
void Init_PLL(void)
{
sysreg_write(reg_SYSCFG, 0x32); //Initialize System Configuration Register
*pSIC_IWR = 0x0101; // Enable only PLL wakeup interrupt
*pPLL_CTL = 0x0200; // MSEL is 14, which gives: VCO of 378 MHz (27*14=378)
*pPLL_DIV = 0x0003; // SSEL is 3, which gives: SCLK of 126 MHz (378/3=126)
// CSEL is 0, which gives: CCLK of 378 MHz (378/1=378)
ssync();
idle();
}
/********************************************************
*
* 函数名 : Delay
* 函数功能 : 延时
* 函数输入参数 : 时长参数
* 函数输出 : 无
* 说明 : 无
*
********************************************************/
void Delay(unsigned long time)
{
unsigned long i,j;
for(i=0; i<time; i++)
for(j=0; j<10; j++)
{;}
}
/********************************************************
*
* 函数名 : Init_EBIU
* 函数功能 : 配置BF531的EBIU
* 函数输入参数 : 无
* 函数输出 : 无
* 说明 : 无
*
********************************************************/
void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7BB07BB0;//<--|Write access time = 7 cycles, read access time = 11 cycles, no ARDY
*pEBIU_AMBCTL1 = 0x7BB07BB0;// |Hold time = 2 cycles, setup time = 3 cycles, transition time = 4 cycles
*pEBIU_AMGCTL = 0x000F ;// |Enable all memory banks
}
void Init_TIMER(void)
{
*pTIMER0_CONFIG = 0x001A;
*pTIMER0_PERIOD = 0x007FFFFF;
*pTIMER0_WIDTH = 0x00400000;
*pTIMER_ENABLE = 0x0001;
//register_handler(ik_ivg11, Timer0_ISR);
}
EX_INTERRUPT_HANDLER(Timer0_ISR)
{printf("789");
Dings++;
if(Dings==9999)
{
*pTIMER_ENABLE= 0x0000;
i=Dings;
*pSEG_8_3 = NumberData[i/1000];
Delay(0x99999);
j = (i%1000)/100;
*pSEG_8_2 = NumberData[j];
Delay(0x99999);
j = (i%100)/10;
*pSEG_8_1 = NumberData[j];
Delay(0x99999);
j = i%10;
*pSEG_8_0 = NumberData[j];
Delay(0x99999);
Delay(0x2000);
if((led = led << 1) == 0x100) led = 0x01;
*pLed = ~led;
Delay(0x200);
}
}
void Init_Interrupts(void)
{
*pSIC_IAR0 = 0xFFFFFFFF;
*pSIC_IAR1 = 0xFFFFFFFF;
*pSIC_IAR2 = 0xFFFFFFF4;
register_handler(ik_ivg11, Timer0_ISR);
printf("456\n");
}
/********************************************************
*
* 函数名 : main
* 函数功能 : 测试数码管和LED显示
* 函数输入参数 : 无
* 函数输出 : 无
* 说明 : 无
*
********************************************************/
void main(void)
{
Init_PLL();
Init_EBIU();
Init_Interrupts();
Init_TIMER();
while(1);
} |