小弟我一个产品为了低功耗,刚转用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;
}
|