#include <msp430.h>
// 功能配置
void Port_Mapping(void);
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关看门狗
Port_Mapping(); // 启动端口映射功能
// 设置端口
P3DIR |= BIT1; // P3.1设置为输出
P1DIR |= BIT3+BIT6+BIT7; // 设置P1.3 P1.6 P1.7为输出
P1SEL |= BIT3+BIT6+BIT7; // 开启P1.3 P1.6 P1.7第二功能
PJSEL |= BIT4+BIT5; // PJ.4 PJ.5开启第二功能即选择XT1
// UCSCTL6外部振荡器及SMCLK使能控制寄存器
UCSCTL6 &= ~XT1OFF; // XT1被打开
UCSCTL6 |= XT1DRIVE_3 + XTS;
UCSCTL6 &= ~XT1BYPASS; // 工作于高频模式3 频率范围24M-32MHz
//循环配置,直到错误标志消失,否则继续配置
do
{
UCSCTL7 &= ~(XT1LFOFFG + XT1HFOFFG + DCOFFG); // UCSCTL7为外部振荡器及DCO失效标志位,XT1高频模式默认标志位清零
SFRIFG1 &= ~OFIFG; // 清除默认标志位
}
while (UCSCTL7&XT1HFOFFG); // 检测XT1高频模式是否失效;
//若表达式结果非零,表明XT1高频模式失效
UCSCTL4 |= SELA__XT1CLK; //UCSCTL4为时钟源选择控制寄存器; ACLK信号来自时钟源XT1CLK MCLK信号和SMCLK信号来自时钟源数字控制振荡器DCO
//其实是DCOCLKDIV;这是系统默认配置的
//这里用“或”表示将ACLK信号设置为时钟源REFOCLK外,其他位均保持原来状态也就是默认配置
// 设置控制寄存器
UCSCTL3 = SELREF_2; // UCSCTL3为FLL基准源选择与分频控制寄存器 FLL基准时钟源选择为时钟源REFOCLK(32k),FLL基准源分频值N=1
//分频后的频率就被用作FLL基准频率,即FLLREFCLK=REFOCLK=32k
__bis_SR_register(SCG0); // 禁止FLL功能;默认情况下,FLL功能是允许的。可以通过置位SCG0或SCG1来禁止FLL
//一旦FLL被禁止,DCO频率将没有自动稳定功能,DCO将在当前的寄存器UCSCTL0和UCSCTL1模式下继续工作
UCSCTL0 = 0x1f00; // UCSCTL0为DCO阶梯选择和调制位控制寄存器;设置DCOx=31,MODx=0
UCSCTL1 = DCORSEL_1; // UCSCTL1为DCO频率范围和调制位使能控制寄存器;设置DCORSELx=1 这样DCO频率范围为1.47MHz-3.45MHz
UCSCTL2 = FLLD_1 + 74;
// FLLD值上电默认情况下为FLLD_1,即DCOCLK频率fDCOCLK在锁频环反馈中的分频次数D为2
// 此时MCLK=SMCLK=fDCOCLKDIV =(FLLN+1)*FLLREFCLK
// FLLN的值必须大于0,取74
// (74 + 1) * 32768*1 = 2.45MHz
__bic_SR_register(SCG0); // FLL功能重新使能
// Worst-case settling time for the DCO when the DCO range bits have been
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
// UG for optimization.
// 32 x 32 x 2.45 MHz / 32,768 Hz = 76563 = MCLK cycles for DCO to settle
__delay_cycles(76563);
//循环配置,直到错误标志消失,否则继续配置
do
{
UCSCTL7 &= ~(XT1LFOFFG + XT1HFOFFG + DCOFFG);
// 清除XT1,DCO默认标志位
SFRIFG1 &= ~OFIFG; // 清除默认标志位
}while (SFRIFG1&OFIFG); // 测试晶振默认标志
while(1)
{
P3OUT ^= BIT1; // 切换P3.1电平
__delay_cycles(600000); // 延时
}
}
void Port_Mapping(void)
{
__disable_interrupt(); // 改变端口映射寄存器前关闭中断功能
PMAPPWD = 0x02D52; // 开启更改端口映射寄存器写权限
#ifdef PORT_MAP_RECFG
PMAPCTL = PMAPRECFG; // 运行时间内允许重新配置
#endif
P1MAP3 = PM_TD1OUTH; //将P1.3口映射为ACLK信号输出
P1MAP6 = PM_TD0_0SMCLK; //将P1.6口映射为SMCLK信号输出
P1MAP7 = PM_TD0CLKMCLK; //将P1.7口映射为MCLK信号输出
PMAPPWD = 0; // 关闭更改端口映射寄存器写权限
#ifdef PORT_MAP_EINT
__enable_interrupt(); // 改变端口映射寄存器后开启中断功能
#endif
}
请高手帮看看这是什么情况
