目的:20M晶振经锁相环的50MHz,然后定时器1时钟设为等于50M。想产生1us中断。
/*如下相关子程序,非正是程序,定时器初始化 T1MR0 = 500时,计数器测得输出50KHz,把匹配值设为50时为什么时163k呢,程序哪里不对呢????*/
#define PLL_NValue 0
#define PLL_MValue 9//(((Fcco/Fosc)*(PLL_NValue+1)/2)-1)
#define CCLKDivValue 7//(Fcco/Fcclk-1)
/***************************************
#define PLL_MValue 19 //M=20 Fin=20M
#define PLL_NValue 1 //N=2 Fpclk=50M
#define CCLKDivValue 1 //Fcco=400M CPU=200M
******************锁相环**************************/
/* PLLCFG 见 config.h*/
void PLL_init(void)
{
if ( PLLSTAT & (1 << 25) ) // (读回连接状态)使能 PLL, 但不连接
{
PLLCON = 1;
PLLFEED = 0xAA;
PLLFEED = 0x55;
}
PLLCON = 0; //失能 PLL, 不连接
PLLFEED = 0xAA;
PLLFEED = 0x55;
while(PLLSTAT & (3 << 24)); //都会连接使能位,
SCS = (SCS & 0x04)|0x30; // 清空系统状态控制寄存器,使能主振荡器,范围15MHz~24MHz
while((SCS & 0x40) == 0 ); // 直到,系统已使用主振荡器标志置位
CLKSRCSEL = 0x01; // PLL时钟源选择寄存器,选择主振荡器为PLL时钟源
PLLCFG = (((PLL_NValue) << 16)|(PLL_MValue));//配置倍频M,分频N
PLLCON = 1;
PLLFEED = 0xAA; // 使能但不连接
PLLFEED = 0x55;
while (((PLLSTAT & (1 << 24)) == 0)); // 直到PLL已经被使能
CCLKCFG = CCLKDivValue; //CPU时钟配置寄存器
while ( ((PLLSTAT & (1 << 26)) == 0) ); // 检查PLL锁定状态,等待锁定
while (((PLLSTAT & 0x00007FFF) != PLL_MValue) && (((PLLSTAT & 0x00FF0000) >> 16) != PLL_NValue)); //检查确认M,N写入
PLLCON = 3; // 使能,连接 PLL
PLLFEED = 0xAA;
PLLFEED = 0x55;
while (((PLLSTAT & (1 << 25))!= (1 << 25)));// 等待PLL连接锁定
PCLKSEL0 = 0x00000010; // 外设时钟选择寄存器
PCLKSEL1 = 0x00000000;
}
void __irq IRQ_Timer1(void)
{
if((T1IR&0x01)==0x01)
{
// t++;
// if(t==1000000) {b=1;t=0;}
// if(b==1) {IOPIN0^=0X01;b=0;}
IOPIN0^=0X01;
T1IR |= 0x01; // 清除中断标志
}
VICVectAddr=0x00;
}
void Timer1_Init(void)
{
T1TC = 0; // 定时器设置为0
T1PR = 0; // 时钟不分频
T1MCR = 0x03; // 设置T0MR0匹配后复位T0TC,并产生中断标志
T1MR0 = 500; // 定时
T1TCR = 0x01; //启动定时器
}
void VIC_init(void)
{
VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断
VICIntEnClr |= 1 << 0x05;
VICVectCntl5 = 0x05; // TC1通道分配到IRQ slot2,最高优先级
VICVectAddr5 = (uint32)IRQ_Timer1; // 设置TC1中断向量
VICIntEnable = (1 << 0x05);
} |