大家好:
我现在遇到一个棘手的问题。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; // 允许接收中断 }