This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F5529:将"Hello World!"打印到串行监视器

Guru**** 2482105 points
Other Parts Discussed in Thread: MSP430FR2433, MSP430F5529

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1247461/msp430f5529-print-hello-world-to-the-serial-monitor

器件型号:MSP430F5529
主题中讨论的其他器件:MSP430FR2433

我正在尝试打印"Hello World!" 使用 driverlib 连接到串行监视器、但我遇到了问题-下面是我的代码:  

#包含
#包含
#include "driverlib.h"

void configureUART(){
//将 P1.2和 P1.3引脚分别设置为 UART TXD 和 RXD 引脚
GPIO_setAPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_FUNCTION);

//配置 UART 模块
EUSCI_A_UART_initParam 参数={0};
param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
param.clockPrescalar = 8;
param.firstModReg = 0;
param.secondModReg = 0xD6;
param.patch = EUSCI_A_UART_NO_奇 偶校验;
param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
param.numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT;
param.uartMode = EUSCI_A_UART_MODE;
param.oversample = EUSCI_A_UART_LOW_FREQUENCY_BAUDRATE_generation;

UART_enableModule (EUSCI_A0_BASE);

void uart_translString (const char *str){
while (*str){
UART_translData (EUSCI_A0_BASE、*str);
STR++;

int main(){
WDT_A_HOLD (WDT_A_base);//停止看门狗计时器

configureUART ();//配置 UART 模块

const char *消息="Hello、World!\n";
UART_translstring (message);//将字符串传输到串行监视器

while (1);//无限循环

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您使用的器件是 F5529还是 FR2433?

    我建议使用寄存器级演示代码进行测试、这样可以节省内存资源。 这个演示、您可以从这里

    dev.ti.com/.../node

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    会发生什么、不会发生什么? 您应该得到"H"。

    有一件事是、您会非常快速地覆盖传输寄存器、从而对其进行干扰。 您需要在每个字符之间放置延迟。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我看不到您在何处调用"EUSCI_A_UART_init (EUSCI_A0_BASE、&param);"

    我也看不出 UART_enableModule 和 UART_translData (vs EUSCI_A_UART_enable 和 EUSCI_A_UART_translData)从哪里产生。

    我还没有使用串行监视器、因此我推迟到 Keith 和 Gary 讨论。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    "我也看不出 UART_enableModule 和 UART_translData (vs EUSCI_A_UART_enable 和 EUSCI_A_UART_translData)来自哪里。"

    它们是 SimpleLink 库的一部分、但是 INIT 的很好捕获。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我也有这个:

    MAP_GPIO_setAPeripheralModuleFunctionInputPin (GPIO_PORT_P1、
                                                      GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_FUNCTION);// UART0

    /*配置 UART 模块*/
       MAP_UART_initModule (EUSCI_A0_BASE、&uartConfig0);

       /*启用 UART 模块*/
       MAP_UART_enableModule (EUSCI_A0_BASE);

       /*启用中断*/
       MAP_UART_enableInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_RECEIVE_INTERRUPT|EUSCI_A_UART_TRANSMIT_INTERRUPT);
       MAP_Interrupt_enableInterrupt (INT_EUSCIA0);

    但如果您不使用中断、则不需要中断。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用这样的代码、它获取一个字符串、并在缓冲区有空间时逐字节将其写入:

    // USCI A1
    __attribute__ ((interrupt(USCI_A1_VECTOR)))
    void USCI_A1_ISR (void)
    {
      // first if anything in output buffer
      // and can send a character - then send a character
      if (HWREGB( USCI_A1_BASE | UCAxIFG )&UCTXIFG) {
        if (*pindex) {
          HWREGB( USCI_A1_BASE | UCAxTXBUF )=*pindex++;
        } else {
          // now we have finished writing so reset
          pindex=print;
          *pindex=0;
          // clear the transmitting bit - as don't need to do anything
          // note this method isn't totally safe if two processes
          // write to the buffer before it empties
          // this approach though does write full stings if done
          // rarely, and uses minimum interupts
          HWREGB( USCI_A1_BASE | UCAxIFG )&=~UCTXIFG;
        }	
      }
    }
    

    您必须确保中断已启用、

      // interupts on both TX(2) and RX(1) UCTXIE and UCRXIE
      // note: have to enable interrupts after UASCI_A1 is enabled!
      HWREGB( USCI_A1_BASE | UCAxIE ) |= BIT0|BIT1;
    

    然后、我通过

      sprintf(print,"Hello World\r\n\0");    
      pindex=print;
      HWREGB( USCI_A1_BASE | UCAxIFG )|=UCTXIFG;
    

    HWREGB 仅将字节写入存储器、请注意、当中断路由处理了所有文本时、它会关闭中断。 因此当您打印时、您需要启用中断。 这正是我的风格、您可以让中断保持运行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这会打印到串行监视器吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    FR2433、

    打印到串行监视器的步骤是什么?

    首先、我认为我需要使用 EUSCI_A_UART_init ()对 UART 进行初始化

    我不知道该怎么做。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很遗憾、TI 不提供 driverlib UART 示例。 我可以分享我在 MSP432P401R 上使用的内容、但不知道它到底能起作用。 即使是手册中的示例也似乎不完整。

    我将看一下我是否可以将示例转换为进行 UART 打印的简单版本。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    祝君安好

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它对我有用-但我也首先设置 UART -我通过直接写入来实现;所以你也许可以调用库来实现同样的操作。 总之、我用来设置它的方法是:

    // print buffer - and the initial message
    char print[256]="We are go!\r\n\0";
    char *pindex=print;
    
    int main(void)
    {
      // Stop WDT
      HWREGW( WDT_A_BASE | WDTCTL ) = WDTPW|WDTHOLD;
    
      // stop interupts whilst we configure
      __disable_interrupt();
    
      // now set up USCI_A1 - as a UART
      // disable USCI A1
      HWREGB( USCI_A1_BASE | UCAxCTL1 ) |= UCSWRST;
      // Clock source SMCLK
      HWREGB( USCI_A1_BASE | UCAxCTL1 ) = 
        (HWREGB( USCI_A1_BASE | UCAxCTL1 )&0x3f)|0x80;
      // Configure UART
      // No Parity 0xc0 = 00
      // LSB first 0x20 = 0
      // UC7BIT = 8bit 0x10 = 0
      // One Stop bit 0x08 = 0
      // USCI mode = UART mode 0x06 = 00
      // Sync = async 0x01 = 0
      HWREGB( USCI_A1_BASE | UCAxCTL0 ) = 0x00;
      // 115200 baud params for 4MHz Clock - 19200
      // Prescalar = 2 - 13
      HWREGW( USCI_A1_BASE | UCAxBRW ) = 2;
      //  HWREGW( USCI_A1_BASE | UCAxBRW ) = 13;
      // First Modulation (0xf0) = 2 - 0
      // Second Modulation (0x0e) = 3 - 0
      // Oversampling (0x01) = 1 -1 
      HWREGB( USCI_A1_BASE | UCAxMCTL ) = 0x20|0x06|0x01;
      //  HWREGB( USCI_A1_BASE | UCAxMCTL ) = 0x01;
      // note use PxSELE value as 4 is even so the port moves!
      // test going into SEL mode on P4.4 and P4.5
      HWREGB( P4_BASE | PxSELE ) |= BIT4|BIT5; 
      // Set P4.4 TX as output
      //  HWREGB( P4_BASE | PxDIR ) |= BIT4;
      // Set P4.5 RX as input
      //  HWREGB( P4_BASE | PxDIR ) &= ~BIT5;
      // enable USCI A1
      HWREGB( USCI_A1_BASE | UCAxCTL1 ) &= ~UCSWRST;
      // interupts on both TX(2) and RX(1) UCTXIE and UCRXIE
      // note: have to enable interrupts after UASCI_A1 is enabled!
      HWREGB( USCI_A1_BASE | UCAxIE ) |= BIT0|BIT1;
    
      __enable_interrupt();
    
      // now all set for now just loop, with LED flashing
      while(1) {
      }
      
    }
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您使用了哪些内容? 它会为"USCI_A1_base 未定义"带来错误、等等

    编辑:我正在使用 MSP430FR2433

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我从#include 获取的主要_BASE 变量 -但对我来说,这包括了定义基地址的 msp430f5529.h。 我在头文件中找不到偏移地址(使用它们的 ti sdk 方法是它们在链接器文件中定义–这会解析缺少的地址。 我不喜欢这个)。 我已在自己的标题中进行了定义-让我看看我是否可以上传

    #include <stdint.h>
    #define HWREGB(x) (*((volatile uint8_t *)(x)))
    #define HWREGW(x) (*((volatile uint16_t *)(x)))
    #define HWREGQ(x) (*((volatile uint32_t *)(x)))
    #define HWREGQQ(x) (*((volatile uint64_t *)(x)))
    
    // clocks to PWM cycle, and hence interupt in clocks
    // note this isn't used now - hard coded to 400
    #define Period 400
    
    // pins - digital IO
    #define PxIN 0x00
    #define PxOUT 0x02
    #define PxDIR 0x04
    #define PxREN 0x06
    #define PxDS 0x08
    #define PxSEL 0x0a
    #define PxIES 0x18
    #define PxIE 0x1a
    #define PxIFG 0x1c
    #define PxIV 0x0e
    #define PxSEL 0x0a
    #define PxSELE 0x0b
    
    // this is the whole wtdctl address as coun't find the 0xc offset documented 
    #define WDTCTL 0x0c
    // UCS
    #define UCSCTL0 0x00
    #define UCSCTL1 0x02
    #define UCSCTL2 0x04
    #define UCSCTL3 0x06
    #define UCSCTL4 0x08
    #define UCSCTL5 0x0a
    #define UCSCTL6 0x0c
    #define UCSCTL7 0x0e
    // SFR
    #define SFRIFG1 0x02
    
    // Timer B
    #define TBxCTL 0x00
    #define TBxCCTL0 0x02
    #define TBxCCTL1 0x04
    #define TBxCCTL2 0x06
    #define TBxCCTL3 0x08
    #define TBxCCTL4 0x0a
    #define TBxCCTL5 0x0c
    #define TBxCCTL6 0x0e
    #define TBxR 0x10
    #define TBxCCR0 0x12
    #define TBxCCR1 0x14
    #define TBxCCR2 0x16
    #define TBxCCR3 0x18
    #define TBxCCR4 0x1a
    #define TBxCCR5 0x1c
    #define TBxCCR6 0x1e
    #define TBxIV 0x2e
    #define TBxEX0 0x20
    
    // USCI
    #define UCAxCTL1 0x00
    #define UCAxCTL0 0x01
    #define UCAxBRW 0x06
    #define UCAxMCTL 0x08
    #define UCAxSTAT 0x0a
    #define UCAxRXBUF 0x0c
    #define UCAxTXBUF 0x0e
    #define UCAxIE 0x1c
    #define UCAxIFG 0x1d
    #define UCAxIV 0x1e
    
    // MPY32_BASE 0x04c0 - defined in msp430f5529.h
    // MPY32
    #define MPYS 0x02
    #define MACS 0x06
    #define OP2 0x08
    #define RESLO 0x0a
    #define RESHI 0x0c
    #define MPYS32L 0x14
    #define MPYS32H 0x16
    #define MACS32L 0x1c
    #define MACS32H 0x1e
    #define OP232 0x20
    #define OP232L 0x20
    #define OP232H 0x22
    #define RES 0x24
    #define RES0 0x24
    #define RES1 0x26
    #define RES2 0x28
    #define RES3 0x2a
    #define MPY32CTL0 0x2c
    

    您可能需要查看是以我的方式还是以 TI SDK 方式操作。 我的方式不是正式的-但这对我来说是有意义的。 实际上、我更喜欢 TI 使用 ARM SDK 做的事情、他们设置了一个描述外设存储器映射的结构。 我认为这比在链接文件中执行它干净。

    请注意、我已将 USCI_A1切换到 SMCLK 时钟-在5529板上、它具有4 MHz 的外部晶体。 您需要检查时钟设置的内容、并更改设置的时序以获得正确的比特率。 建议您查看2433数据表、它将解释您拥有的内容、并确认是否是通过 USB 输出的 USCI_A1 UART。

    另一方面、我通过中断为缓冲区清空提供服务、我必须这样做、因为我运行的是其他代码。 你可能只需要把它放在 main ()代码中。 在写入下一位之前、只需检查缓冲区是否为空。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在骑自行车的过程中、您意识到了 MSPFR2433 -因此系列2器件与5529 -系列5器件非常不同。

    因此、在阅读数据表(slase59f)时、您会看到两个 UART 通道 UCA0 (在引脚4和5上)和 UCA1 (在引脚16和17上)。 这些都是 eUSCI_A 器件。

    因此、这建议从 TRM (slau445i)开始、第22节介绍了如何在 eUSCI 上设置 UART -通常您必须遵循 TRM 并在字母后面。 这里应该有足够的痕迹,但要得到一些你需要做的事情的想法。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此器件的 Driverlib 用户指南包含一个很糟糕的 UART 示例、但它应能帮助您使用正确的外设:

    // Configure UART
    EUSCI_A_UART_initParam param = {0};
    param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_ACLK;
    param.clockPrescalar = 15;
    param.firstModReg = 0;
    param.secondModReg = 68;
    param.parity = EUSCI_A_UART_NO_PARITY;
    param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
    param.numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT;
    param.uartMode = EUSCI_A_UART_MODE;
    param.overSampling = EUSCI_A_UART_LOW_FREQUENCY_BAUDRATE_GENERATION;
    if (STATUS_FAIL == EUSCI_A_UART_init(EUSCI_A0_BASE, &param)) {
    return;
    }
    EUSCI_A_UART_enable(EUSCI_A0_BASE);
    // Enable USCI_A0 RX interrupt
    EUSCI_A_UART_enableInterrupt(EUSCI_A0_BASE,
    EUSCI_A_UART_RECEIVE_INTERRUPT)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    串行监视器上仍然没有显示任何内容。 我的串行显示器设置应该是什么?

    下面是我拥有的东西:

    #包含
    #包含

    int main (void){
    WDT_A_HOLD (WDT_A_BASE);

    //配置 UART
    EUSCI_A_UART_initParam 参数={0};
    param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_ACLK;
    param.clockPrescalar = 15;
    param.firstModReg = 0;
    param.secondModReg = 68;
    param.patch = EUSCI_A_UART_NO_奇 偶校验;
    param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
    param.numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT;
    param.uartMode = EUSCI_A_UART_MODE;
    param.OVERSAMPLING = EUSCI_A_UART_OVERSAMPLING_BAUDRAATE_LEGEN;

    if (STATUS_FAIL == EUSCI_A_UART_init (EUSCI_A0_BASE、&param){
    返回1;//指示初始化失败。

    EUSCI_A_UART_ENABLE (EUSCI_A0_BASE);

    //定义并发送"Hello World"字符串
    字符数据[]="Hello World\r\n ";//"\r\n (回车)"和"\n"(换行)(终端中的新行)。
    INT I;
    for (i = 0;i < sizeof (data)- 1;i++){//循环遍历字符串的每个字符,但不包括空终结器。
    EUSCI_A_UART_translData (EUSCI_A0_BASE、DATA[i]);

    返回0;//指示执行成功。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正如我9天前说过的:

    "有一件事你会通过非常快地覆盖传输寄存器来干扰它。 你需要在每个字符之间放置延迟。"

    有什么问题吗? 您是否对引脚放置了示波器以查看是否正在传输任何数据?

    虽然它基于寄存器、但您是否仅使用了 UART echo 示例来确保其他一切都在正常运行?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我从 CCS 工程模板运行了一个 hello world 示例(这是创建新 CCS 工程时的选项之一)、操作顺利。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你想做什么? 我将让 MCU 对其进行测试、但"HelloWorld"程序*不*使用 串行 UART、而是使用 SBW 接口和存储器映射 IO 方案。 使用 CCS 控制台读取字符。 实际上、我的 MSP432P401R 甚至不会将其列为示例之一。

    它只会在调试器下运行。

    实际的基于 UART 的程序将允许您在未调试时发送串行字符、这些字符可通过任何串行终端而不仅仅是 CCS 接收。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、回答正确。 我希望能够使用 printf()打印到串行监视器。 我有这个使用 UART_translData 的代码、但它不像一行代码那样巧妙。 如何将 printf()集成到该代码中?

    #include "driverlib.h"
    #include "board.h"
    #include "MSP430.h"
    #包含

    空 main (void)
    {
    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_BASE);

    //设置 ACLK = REFOCLK,时钟分频器为1
    CS_initClockSignal (CS_ACLK、CS_REFOCLK_SELECT、CS_CLOCK_DIVIDER_1);
    //设置 SMCLK = DCO、分频器为1
    CS_initClockSignal (CS_SMCLK、CS_DCOCLKDIV_SELECT、CS_CLOCK_DIVIDER_1);
    //设置 MCLK = DCO,分频器为1
    CS_initClockSignal (CS_MCLK、CS_DCOCLKDIV_SELECT、CS_CLOCK_DIVIDER_1);

    //配置 UART 引脚
    GPIO_setAsPeripheralModuleFunctionInputPin (
    GPIO_PORT_UCA0TXD、
    GPIO_PIN_UCA0TXD、
    GPIO_FUNCTION_UCA0TXD
    );
    GPIO_setAsPeripheralModuleFunctionInputPin (
    GPIO_PORT_UCA0RXD、
    GPIO_PIN_UCA0RXD、
    GPIO_FUNCTION_UCA0RXD
    );

    /*
    *禁用 GPIO 上电默认高阻抗模式以激活
    *先前配置的端口设置
    */
    PMM_unlockLPM5 ();

    //配置 UART
    //SMCLK = 1MHz、波特率= 115200
    //UCBRx = 8、UCBRFx = 0、UCBRSx = 0xD6、UCOS16 = 0
    EUSCI_A_UART_initParam 参数={0};
    param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
    param.clockPrescalar = 8;
    param.firstModReg = 0;
    param.secondModReg = 0xD6;
    param.patch = EUSCI_A_UART_NO_奇 偶校验;
    param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
    param.numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT;
    param.uartMode = EUSCI_A_UART_MODE;
    param.oversample = EUSCI_A_UART_LOW_FREQUENCY_BAUDRATE_generation;

    if (STATUS_FAIL == EUSCI_A_UART_init (EUSCI_A0_BASE、&param){
    返回;

    EUSCI_A_UART_ENABLE (EUSCI_A0_BASE);

    EUSCI_A_UART_clearInterrupt (EUSCI_A0_BASE、
    EUSCI_A_UART_RECEIVE_INTERRUPT);

    //启用 USCI_A0 RX 中断
    EUSCI_A_UART_enableInterrupt (EUSCI_A0_BASE、
    EUSCI_A_UART_RECEIVE_INTERRUPT);

    //启用全局中断
    __enable_interrupt ();

    //const char *数据="Hello World!\n";

    int myVariable = 42;

    char buffer [第20话];
    sprintf (缓冲区、"我的变量:%d\n"、myVariable);

    INT I = 0;

    while (缓冲区[i])
    {
    EUSCI_A_UART_translData (EUSCI_A0_BASE、buffer [i]);
    __delay_cycles (100);
    I++;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    方法是重新写入 stdio 以使用 UART。 如果你幸运的话,它只需要更改几个函数,比如 fputc ()和 fgetc (),但实际上,它不值得被打扰。

    最好是编写自己的 UART 发送/接收设备并将其包装在 varargs 周围。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我该怎么做(我不确定什么是传输/接收设备或 varargs)?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为了从 UART 发送和接收、我编写了我自己的循环缓冲区例程。 我基于:

    http://www.simplyembedded.org/tutorials/msp430-uart/

    varargs 是一个复杂的标准 C 代码、不在我们这里讨论的范围内。 可在 K&R 的第7.3节中找到。