//================================================================//
// //
// 文件: MAIN.C //
// 说明: MSP430F5438开发板单片机时钟设置实验程序 //
// 设置单片机时钟为外部高频晶振或外部低频晶振+DCO, //
// 并将辅助时钟、主时钟和子主时钟通过IO引脚输出, //
// 可通过插针将信号引出并用示波器观察。 //
// //
// MSP430F5438 //
// ----------------- //
// /|\| XIN|- //
// | | | XTAL1 = 32.768k //
// --|RST XOUT|- //
// | | //
// | XT2IN|- //
// | | XTAL2 = 16Mhz //
// |RST XT2OUT|- //
// | | //
// | P11.0|-->ACLK //
// | P11.1|-->MCLK //
// | P11.2|-->SMCLK //
// //
// 编译: CCS5.2 //
// 日期: 2013.08.08 //
// //
//==============================================================//
#include "msp430x54x.h"
#include "PIN_DEF.H"
// 主时钟设置选项,可选择内部DCO或外部高频晶振二者之一
#define INTERNAL_HF_OSC // 内部DCO时钟
//#define EXTERNAL_HF_OSC // 外部高频时钟
#ifdef INTERNAL_HF_OSC
#define INTERNAL_HF_OSC
#endif
#ifdef EXTERNAL_HF_OSC
#define EXTERNAL_HF_OSC
#endif
#define FLL_FACTOR 549 // FLL_FACTOR: DCO倍频系数
//***************************************************************************//
// //
// 初始化主时钟: MCLK = XT2 //
// //
//***************************************************************************//
#ifdef EXTERNAL_HF_OSC
void Init_CLK(void)
{
WDTCTL = WDTPW + WDTHOLD ; // 关看门狗
P5SEL |= 0x0C ; // 端口功能选择振荡器
UCSCTL6 &= ~XT2OFF ; // 振荡器使能
UCSCTL3 |= SELREF_2 ; // FLLref = REFO
UCSCTL4 |= SELA_2 ; // ACLK=REFO,SMCLK=DCO,MCLK=DCO
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG) ; // 清除 XT2,XT1,DCO 错误标志
SFRIFG1 &= ~OFIFG ;
}while(SFRIFG1&OFIFG) ; // 检测振荡器错误标志
UCSCTL6 |= XT2DRIVE0 + XT2DRIVE1 ; // XT2 驱动模式 24~32MHz
UCSCTL4 |= SELS_5 + SELM_5 ; // SMCLK = MCLK = XT2
}
#endif
//***************************************************************************//
// //
// 初始化主时钟: MCLK = XT1×(FLL_FACTOR+1) //
// //
//***************************************************************************//
#ifdef INTERNAL_HF_OSC
void Init_CLK(void)
{
WDTCTL = WDTPW + WDTHOLD ; // 关看门狗
P7SEL |= 0x03 ; // 端口选择外部低频晶振XT1
UCSCTL6 &=~XT1OFF ; // 使能外部晶振
UCSCTL6 |= XCAP_3 ; // 设置内部负载电容
UCSCTL3 |= SELREF_2 ; // DCOref = REFO
UCSCTL4 |= SELA_0 ; // ACLK = XT1
__bis_SR_register(SCG0) ; // 关闭FLL控制回路
UCSCTL0 = 0x0000 ; // 设置DCOx, MODx
UCSCTL1 = DCORSEL_7 ; // 设置DCO振荡范围
UCSCTL2 = FLLD__1 + FLL_FACTOR ; // Fdco = ( FLL_FACTOR + 1)×FLLRef = (549 + 1) * 32768 = 18.0224MHz
__bic_SR_register(SCG0) ; // 打开FLL控制回路
__delay_cycles(1024000) ;
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG) ; // 清除 XT2,XT1,DCO 错误标志
SFRIFG1 &= ~OFIFG ;
}while(SFRIFG1&OFIFG) ; // 检测振荡器错误标志
}
#endif
//***************************************************************************//
// //
// 主程序: 设置时钟并输出至P11.0~2 //
// //
//***************************************************************************//
int main( void )
{
WDTCTL = WDTPW + WDTHOLD ; // 关闭看门狗
Init_CLK() ;
P11DS = TACK + TMCK + TSMCK ; // 选择驱动强度
P11SEL = TACK + TMCK + TSMCK ; // 选择引脚功能,ACK、MCK、SMCK输出至P11.0/1/2
P11DIR = TACK + TMCK + TSMCK ; // 设置引脚IO方向为输出
MAIN_POWER_ON ; // 点亮VCC指示灯,指示时钟初始化成功,无其它意义
while(1) ;
}
// end of file