【发布时间】:2014-10-22 22:52:00
【问题描述】:
我正在使用 UART 将 G2553 连接到标准 LCD 屏幕。我让它在 1MHz 时像梦一样工作,但需要系统以 16MHz 运行某些其他外围设备。我让它非常接近在 16MHz 下工作,但我认为这是一个波特率错误,因为屏幕几乎会显示我发送的内容,但在这里或那里错过了一个字符,或者一个字符不正确。我将带你了解我是如何编写代码的,看看我是否犯了任何错误。
屏幕预计波特率为 9600,所以我去了用户指南中的表格:
所以 UCBRx = 1666 和 UCBRSx = 6。
这方面的预期 % 错误实际上比我在 1MHz 时钟下使用的要好,所以我认为这没问题。
这意味着 UCBR0 = 130 和 UCBR1 = 6(这只是 UCBRx 的 HEX 值分布在两个 8 位寄存器上)和 UCBRSx = 6。
现在输入这些,我查看了用户指南告诉我们的有关 UART 调制寄存器的内容:
(本来打算把这个做得很漂亮,但我没有发布图片的声誉)
所以我的初始化代码最终是:
if (CALBC1_16MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
//setup DCO to 16MHZ
BCSCTL1 = CALBC1_16MHZ;
DCOCTL = CALDCO_16MHZ;
P1SEL |= BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2 |= BIT1 + BIT2;
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 130; // 16MHz 9600
UCA0BR1 = 6; // 16MHz 9600
UCA0MCTL = UCBRS2 + UCBRS1; // modulation is 110b or 6
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
但是,正如我上面所说,这几乎就在那里,例如,如果我尝试显示适用于我的 1MHz 9600 波特率设置的字符串“Initialising...”,在这些设置下为 16MHz,它可能会显示“Initiali ng.. ." - 很接近但显然有一些我不想要的错误。
感谢您为此提供的任何帮助。
【问题讨论】:
-
试试
UCA0MCTL = 0x6D