相关说明
首先我们应该搞清楚G2553的内部时钟,这样方便我们以后进行定时器、串口等外设的设置。
如下如所示:
从图中我们可以看出,系统的工作时钟主要有三个:
ACLK辅助工作时钟;
MCLK系统CPU时钟;
SMCLK次工作时钟。
这三个时钟为系统的必要时钟,也就是说我们上程序开始的是应该进行相应的配置,这样系统才能按照我们的要求去工作。
ACLK
有图可以看出,主要由VLOCLK和XT1为其提供时钟,我们只需要在这直接进行选择就行了。VLOCLK约为12KHz
//设置ACLK为12K
BCSCTL3_bit.LFXT1S0 = 0;
BCSCTL3_bit.LFXT1S1 = 1;
这两位可以对其进行配置。
MCLK和SMCLK一般选择DCO产生的时钟。
//1Mhz
if (CALBC1_1MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation */
这是TI提供的DCO配置代码,因此我们只要模仿着配置就行了!
注意该配置只限于以下的选项:
/*-------------------------------------------------------------------------
* Calibration Data
*-------------------------------------------------------------------------*/
/* DCOCTL Calibration Data for 16MHz */
__no_init volatile unsigned __READ char CALDCO_16MHZ @ 0x10F8;
/* BCSCTL1 Calibration Data for 16MHz */
__no_init volatile unsigned __READ char CALBC1_16MHZ @ 0x10F9;
/* DCOCTL Calibration Data for 12MHz */
__no_init volatile unsigned __READ char CALDCO_12MHZ @ 0x10FA;
/* BCSCTL1 Calibration Data for 12MHz */
__no_init volatile unsigned __READ char CALBC1_12MHZ @ 0x10FB;
/* DCOCTL Calibration Data for 8MHz */
__no_init volatile unsigned __READ char CALDCO_8MHZ @ 0x10FC;
/* BCSCTL1 Calibration Data for 8MHz */
__no_init volatile unsigned __READ char CALBC1_8MHZ @ 0x10FD;
/* DCOCTL Calibration Data for 1MHz */
__no_init volatile unsigned __READ char CALDCO_1MHZ @ 0x10FE;
/* BCSCTL1 Calibration Data for 1MHz */
__no_init volatile unsigned __READ char CALBC1_1MHZ @ 0x10FF;
也就说你要想实现CALDCO_4MHZ 和 CALBC1_1MHZ就得自己写。
得到了DCOCLK,然后我们只需要将DCOCLK连接到MCLK和SMCLK就可以了!
当然这连接之间还可以配置分频系数,例如DCOCLK = 16MHz,我们通过分频可以得到MCLK = 8MHz,SMCLK = 4MHz。
通过以下寄存器配置:
//MCLK分频
BCSCTL2_bit.DIVM0 = 0;
BCSCTL2_bit.DIVM1 = 1;
//SMCLK分频
BCSCTL2_bit.DIVS0 = 0;
BCSCTL2_bit.DIVS1 = 0;
这样我们就可配置自己的系统时钟了!
测试方法
通过芯片的P1.0和P1.4脚可以输出ACLK和SMCLK
P1DIR |= 0x11; // P1.0,4 outputs
P1SEL |= 0x11; // P1.0,4 ACLK, SMCLK output
举例说明
配置ACLK = 12kHz,SMCLK = 4MHz,MCLK = 8MHz
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
//设置ACLK为12K
BCSCTL3_bit.LFXT1S0 = 0;
BCSCTL3_bit.LFXT1S1 = 1;
//MCLK分频,2分频
BCSCTL2_bit.DIVM0 = 1;
BCSCTL2_bit.DIVM1 = 0;
//MCLK时钟源为DCOCLK
BCSCTL2_bit.SELM0 = 0;
BCSCTL2_bit.SELM1 = 0;
//SMCLK分频,4分频
BCSCTL2_bit.DIVS0 = 0;
BCSCTL2_bit.DIVS1 = 1;
//SMCLK时钟源为DCOCLK
BCSCTL2_bit.SELS = 0;
//DCOCLK = 16Mhz
if (CALBC1_16MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_16MHZ; // Set range
DCOCTL = CALDCO_16MHZ; // Set DCO step + modulation */
//配置测试管脚
P1DIR |= 0x11; // P1.0,4 outputs
P1SEL |= 0x11; // P1.0,4 ACLK, SMCLK output
while(1)
{
}
}