刚接触430,想问个时钟的问题,定时不准,搞不懂哪里不对

2019-07-31 16:39发布

小弟我一个产品为了低功耗,刚转用430芯片,一上手就被那混乱的时钟搞的晕头转向,定时不准,搞不懂问题在哪里,搞了好久了,上论坛问下高手,芯片用的是G2553

代码说明一下,
一开始设置了:
DCOCTL=CALDCO_1MHZ_;
BCSCTL1=CALBC1_1MHZ_;
这里应该是设置DCO 1MHZ,为了检测是不是出的1us,我下面取反P1.7

Delay_us(10);//想延时10us的取反的
P1OUT^=BIT7;  //在这里得到的不是20us周期的方波,而是2us
下面定时器定时50us,但CCR0必须等于1000出来的才是50us
TACTL=TASSEL_2+TACLR;  //选择计数时钟为SMCLK,将计数器TAR清零
CCR0=1000;            //CCR0
TACTL|=MC_1;          //选择Timer_A为增计数模式
CCTL0=CCIE;          //使能中断
是不是跟我下面写FLASH有关,写FLASH不是需要257KHZ---~476KHZ吗?
FCTL2=FWKEY+FSSEL_1+20;     //flash模块时钟源为MCLK 分频2

/******************************************
ChipType:msp430g2553
Software:IAR FOR MSP430 5.50
Description:  
Copyright: ver1.0
*******************************************/
#include"main.h"
#include "msp430g2553.h"

/******************************************
Description:函数声明
*******************************************/
void MCUFUNInit(void);
u16 ReadFlash(u16 Addr);
void flashErase(u16 address);
void Delayus(u8 cnt);

#define CPU_Frequency   (1) //1MHZ
#define Delay_us(n) __delay_cycles(n*CPU_Frequency)
#define Delay_ms(n) __delay_cycles(n*(1000L)*CPU_Frequency)

/******************************************
Function:主函数
*******************************************/
void main( void )
{
          WDTCTL = WDTPW + WDTHOLD;    // 关闭看门狗

          //DCOCTL=DCO0+DCO1;        //开启DCO,DCO=3,1MHZ
          //BCSCTL1|=RSEL2;         //RSEL=4
         
          DCOCTL=CALDCO_1MHZ_;
          BCSCTL1=CALBC1_1MHZ_;
          MCUFUNInit(); //IO口初始化

          _EINT();       //开总中断
          while(1)
                  {   
                    Delayus(100);
                  //LPM0; //开启低功耗模式0,进入低功耗模式,等待中断唤醒   
                }   
}

/******************************************
Function:延时函数10us
*******************************************/
void Delayus(u8 cnt)
{
    while(cnt--)
    {
      Delay_us(10);
      P1OUT^=BIT7;  //在这里得到的不是20us周期的方波,而是2us
    }
}


/******************************************
Function:IO初始化
*******************************************/
void MCUFUNInit(void)
{
/***************IO口初始化*******************/
        P1DIR = 0XFF;         //设定P1口为输出方式
        P1OUT = 0X00;         //给P1口赋初始值
        
/***************定时器初始化*******************/   
        TACTL=TASSEL_2+TACLR;  //选择计数时钟为SMCLK,将计数器TAR清零
        CCR0=1000;            //CCR0
        TACTL|=MC_1;          //选择Timer_A为增计数模式
        CCTL0=CCIE;          //使能中断

}

/******************************************
Function:写
*******************************************/
void WritePasswordFlash(u16 address)
{
       u16 *FlashAdd = (u16 *)address;
       //_DINT();                     //关闭中断
       while((FCTL3&BUSY)!=0x00);                  //检测busy位
       FCTL2=FWKEY+FSSEL_1+20;                    //flash模块时钟源为MCLK 分频2
       FCTL3=FWKEY;                                //解锁
       FCTL1=FWKEY+BLKWRT+WRT;                     //块写
       *FlashAdd=PasswordData[0];                    //写入
       while((FCTL3&WAIT)==0);                 //检测wait位 是否写入该字
       FCTL3=FWKEY;                                //解锁
       *(FlashAdd+1)=PasswordData[1];                    //写入
       while((FCTL3&WAIT)==0);                 //检测wait位 是否写入该字
       FCTL1=FWKEY;                                //BLKWRT WRT位复位
       while((FCTL3&BUSY)!=0x00);                  //检测BUSY位
       FCTL3=FWKEY+LOCK;                           //锁定
       //_EINT();                //开放中断
}

/******************************************
Function:读
*******************************************/
u16 ReadFlash(u16 Addr)
{
        u16 Data;
        u16 *FlashPtr = (u16 *) Addr;
        Data = *FlashPtr;
        return(Data);
}

/******************************************************
Function: 段擦除子程序                           
*******************************************************/
void flashErase(u16 address)
{
       u8 i;
       u16 *EraseAddress;
       EraseAddress=(u16*)address;
       FCTL2=FWKEY+FSSEL_1+20;   //flash模块时钟源位MCLK 分频2
       FCTL3=FWKEY;              //解锁
       FCTL1=FWKEY+ERASE;        //段擦除
       //_DINT();                     //关闭中断
       for(i=0;i<2;i++)
       {
         *EraseAddress++=0;               //在欲进行操作的段中空写,启动擦除操作
       }
       //FCTL3=FWKEY+LOCK;         //锁定  
}


/**************************************************
Function:定时器中断
***************************************************/
#pragma vector = TIMER0_A0_VECTOR
__interrupt void timeA(void)
{

        LPM0_EXIT;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
yilfhch
2019-07-31 22:32
Delay_us(10);
P1OUT^=BIT7;  //在这里得到的不是20us周期的方波,而是2us

在这里延时了得到的是1us取反一次,周期为2us,这样算的话频率是10Mhz了

但定时器那里没有分频CCR0=1000得到的是50us,问题在哪里呢

一周热门 更多>