我将以下代码烧录到设备上,该设备基本上通过微控制器的UCA0串行模块在每次中断时发送一个0xc5字符。出于某种原因,当我在示波器上观察到引脚3.4时,我看不到输出。
#include "msp430x54xA.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
//P3IN = 0x08; // P3.5 RXD input
P3OUT = 0x10; // P3.4 TXD output
P3SEL = 0x30; // P3.4,5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_1; // CLK = ACLK
UCA0BR0 = 0x03; // 32kHz/9600=3.41 (see User's Guide)
UCA0BR1 = 0x00; //
UCA0MCTL = UCBRS_3+UCBRF_0; // Modulation UCBRSx=3, UCBRFx=0
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
__bis_SR_register(LPM3_bits + GIE); // Enter LPM3, interrupts enabled
__no_operation(); // For debugger
}
// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
UCA0TXBUF = 0xc5;
}
代码是这里代码的略微修改版本:https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/166345
为什么我不能在相应的引脚上看到输出?
编辑添加新代码而不中断:
#include "msp430x54xA.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
//P3IN = 0x08; // P3.5 RXD input
P3OUT = 0x10; // P3.4 TXD output
P3SEL = 0x30; // P3.4,5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_1; // CLK = ACLK
UCA0BR0 = 0x03; // 32kHz/9600=3.41 (see User's Guide)
UCA0BR1 = 0x00; //
UCA0MCTL = UCBRS_3+UCBRF_0; // Modulation UCBRSx=3, UCBRFx=0
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
while (1) {
UCA0TXBUF = 0xc5;
__delay_cycles(25000000);
}
}
数据表中使用的寄存器摘要:
答案 0 :(得分:0)
我找到了答案,我想回到这里。
第二段代码完美无缺。我只是通过将UCA0BR0
的值从0x03
增加到100
来降低波特率:
UCA0BR0 = 100;
我现在可以在3.4针的示波器上看到输出。
对于那些新手(像我一样),UCA0BR0的值是通过将时钟频率(在我的情况下为32KHz)除以你想要达到的波特率来计算的:
32000 / 9600 = 3.33
UCA0BR1是UCA0BR0的溢出。由于这两个寄存器都是8位,因此我们可以在UCA0BR1的帮助下获得16位值。这有助于我们实现非常低的波特率。
以下代码完美无缺,输出英文字母(从ASCII 0x40开始),波特率为9600.可以使用引脚3.4上的FTDI电缆读取输出:
#include "msp430x54xA.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P3SEL |= 0x30; // P3.4,5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_1; // CLK = ACLK
UCA0BR0 = 3; // 32kHz/9600=3.33 (see User's Guide)
UCA0BR1 = 0; // overflow of UCA0BR0 comes here
UCA0MCTL = UCBRS_3+UCBRF_0; // Modulation UCBRSx=3, UCBRFx=0
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
int i=0;
while (1) {
while (!(UCA0IFG & UCTXIFG)); // wait for USCI_A0 TX buffer to ready
UCA0TXBUF = 0x40+i;
++i;
__delay_cycles(2500000);
}
}