大家好:
我现在遇到一个棘手的问题。MSP430F6438 工作在低功耗LPM3模式下,系统时钟为通过倍频得到的2.45MHz,串口时钟使用smclk。
现在问题出来了,若在仿真状态下,串口可以正常接收数据;若退出仿真状态,拔掉仿真器,串口则不能接收数据了。这是什么原因呢?
下面是时钟初始化和串口初始化代码:
void Init_FLL_CLK(void) // 初始化锁相环主时钟: MCLK = XT1×(FLL_FACTOR+1)
{
while(BAKCTL & LOCKBAK) // Unlock XT1 pins for operation
BAKCTL &= ~(LOCKBAK);
P7SEL |=(BIT0+BIT1); // 端口选择外部低频晶振XT1 ,32768
UCSCTL6&=~XT1OFF; // 使能外部晶振
UCSCTL6|= XCAP_3; // 设置内部负载电容
UCSCTL3|= SELREF_0; // SELREF_0选择 XT1 ;
UCSCTL4|= SELA__XT1CLK; // ACLK = ref
// Loop until XT1,XT2 & DCO fault flag is cleared
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
UCSCTL6 &= ~(XT1DRIVE_3); // Xtal is now stable, reduce drive strength
// Initialize DCO to 2.45MHz
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx.
UCSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first
UCSCTL1 = DCORSEL_3; // Set RSELx for DCO = 4.9 MHz
UCSCTL2 = FLLD_1 + 74; // Set DCO Multiplier for 2.45MHz
// (N + 1) * FLLRef = Fdco
// (74 + 1) * 32768 = 2.4576MHz
__delay_cycles(5000);
__bic_SR_register(SCG0); // Enable the FLL control loop
UCSCTL4 |= SELM__DCOCLK + SELA__XT1CLK + SELS__DCOCLK; //选择MCLK,ACLK,SMCLK,
}
void Init_USCI_A0_UART(void)
{
UCA0IE&=~UCRXIE;
UCA0IE&=~UCTXIE; // 关闭中断
P2SEL |= (BIT4+BIT5);
P2DIR |= BIT4;
P2DIR &= ~BIT5; // 选择引脚方向
UCA0CTL1 = UCSWRST; // 状态机复位
UCA0CTL1|= UCSSEL__SMCLK; // 选择时钟源CLK = SMCLK
UCA0CTL0 = UCMODE_0; //选择uart模式
UCA0CTL0 &= ~UC7BIT; //8字节传输
UCA0BR0 = 0x40; //波特率分频 2457600hz/38400
UCA0BR1 = 0x00;
UCA0MCTL= 0x00;
UCA0CTL1&=~UCSWRST; // 启动状态机,即启用串口功能
UCA0IE |= UCRXIE; // 允许接收中断
}