打印

求教 lpc2368定时器问题

[复制链接]
1496|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mtraveler|  楼主 | 2011-6-21 13:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的: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);
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

68

帖子

0

粉丝