当初本来是打算组装一个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 (!(IFG2&UCA0TXIFG)); // 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,所以通过头文件里定义好的,可以直接设置。
文章评论(0条评论)
登录后参与讨论