|
小弟最近做了一个基于F5438的板子,
经过测试,四个串口使用ACLK,输出正常,
但是想使用高频时钟,出现点问题,
高频晶振16M,使用20pf电容,
将MCLK,SMCLK映射到P11.1,P11.2口,使用示波器,测得15.99M左右。
但是串口程序老是不对,希望大家指点一下?
程序如下:
#include "msp430x54x.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
//P11DIR = BIT1+BIT2; // P11.1-2 to output direction
//P11SEL |= BIT1+BIT2; // P11.1-2 to output SMCLK,MCLK
P5SEL |= 0x0C; // Port select XT2
P4DIR |=BIT7;
P4OUT |=BIT7;
UCSCTL6 &= ~XT2OFF; // Enable XT2
UCSCTL3 |= SELREF_2; // FLLref = REFO
// Since LFXT1 is not used,
// sourcing FLL with LFXT1 can cause
// XT1OFFG flag to set
UCSCTL4 |= SELA_2; // ACLK=REFO,SMCLK=DCO,MCLK=DCO
// Loop until XT1,XT2 & DCO stabilizes
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 &= ~XT2DRIVE0; // Decrease XT2 Drive according to
// expected frequency
UCSCTL4 |= SELS_5 + SELM_5; // SMCLK=MCLK=XT2
P3SEL = 0x30; // P3.4,5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_2; // CLK =MCLK
UCA0BR0 = 0x82; // 16MHz 波特率9600
UCA0BR1 = 0x06; //
UCA0MCTL = UCBRS_6+UCBRF_0; // Modulation UCBRSx=6, UCBRFx=0
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
_EINT();
while(1);
}
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
break;
case 4:break; // Vector 4 - TXIFG
default: break;
}
}
如果:在串口中断中,将:UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
改为: UCA0TXBUF ='A';
使用串口助手能接受到A;
但是 UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
发送的和接收的为啥不一样呢? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
|