热度 10
2014-3-25 21:23
2365 次阅读|
0 个评论
当初本来是打算组装一个MSP430F169的芯片的,但是当时手里没有MSP430F169的芯片就装了个MSP430F247的,本来想这两个芯片应该操作都是一样的嘛,毕竟都是都是TI生产的芯片。但是当我开始用的时候我发现,这两个根本就不一样,MSP430F247对寄存器有了从新的定义。 我刚开始学习的时候,买了一本MSP430的书籍,主要讲的是MSP430F169。我就拿着这本书对着学习MSP430F247,看着TI提供的MSP430F247的例程,这样看看了很久都没有看懂,例程和书上的操作都不一样。比如在波特率的设置上,就有很大的差别。 #include “msp430.h” int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT if (CALBC1_1MHZ==0xFF) // If calibration constant erased { while(1); // do not load, trap CPU!! } DCOCTL = 0; // Select lowest DCOx and MODx settings BCSCTL1 = CALBC1_1MHZ; // Set DCO DCOCTL = CALDCO_1MHZ; P3SEL = 0x30; // P3.4,5 = USCI_A0 TXD/RXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 6; // 1MHz 9600 UCA0BR1 = 0; // 1MHz 9600 UCA0MCTL = UCBRF3 + UCOS16; // Modln UCBRSx=1, over sampling UCA0CTL1 = ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt __bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled } // Echo back RXed character, confirm TX buffer is ready first #pragma vector=USCIAB0RX_VECTOR __interrupt void USCI0RX_ISR(void) { while (!(IFG2UCA0TXIFG)); // USCI_A0 TX buffer ready? UCA0TXBUF = UCA0RXBUF; // TX - RXed character } 上面这段程序就是TI提供的,哪些有颜色的都是搞不懂的地方。。。。。 这个什么要那样写呢?蓝色的我懂,是设置波特率,但是怎么和书上写的不一样的,这就是书寄存器不一样的效果,看半天看不懂,最好我在TI提供的技术手册( 附件msp430f247教程 )里看到了答案(15.3.13 Typical Baud Rates and Errors),MSP430F247的波特率设置。。。。 图1:红框内就是需要设置的波特率包括误差 从上面的程序可以看到:晶振选的1MHZ的,所以当设置波特率9600的时候,就要选择 UCA0BR0 = 6; UCA0BR1 = 0; 值得注意的是这个程序采用的是过采样模式,使用的是 UCOS16 =1,当然图1也是当 UCOS16 =1 的时候的调整。 图2:波特率调整控制寄存器 图3:头文件中关于 UCBRF3 的设置 当时我红色的是波特率调整控制寄存器,但是我不明白为啥那样设置,通过查看头文件,我知道了 UCBRF3 是在头文件里设置好了的调整参数。在图1中可以看到当晶振1MHZ,、波特率9600的时候,UCBRFx是8,所以通过头文件里定义好的,可以直接设置。