天天看點

MSP432的串行通信專欄數字通信基本知識異步串行通信的格式串行通信的波特率奇偶校驗串行通信傳輸方式術語UART程式設計相關資料

目錄

  • 專欄
  • 數字通信基本知識
    • 組成
    • 串行通信和并行通信
    • 同步通信和異步通信
    • 異步串行通信的通用基礎知識
  • 異步串行通信的格式
  • 串行通信的波特率
  • 奇偶校驗
  • 串行通信傳輸方式術語
    • 1.全雙工(Full-duplex)
    • 2.半雙工(Half-duplex)
    • 3.單工(Simplex)
    • RS232總線标準
  • UART程式設計相關
    • eUSCI模式下的UART
      • UART
    • UART運作機理
      • 應用
      • 使用UART通信
      • 串行發送機TxMachine
      • 串行接收機RxMachine
      • 波特率的計算
    • UART相關寄存器
      • 1寄存器位址分析
      • 2控制寄存器
      • 3狀态寄存器
      • 4波特率寄存器
      • 5資料寄存器
      • 常用波特率清單
      • MSP432中的UART
    • UART相關的SDK函數
    • UART操作執行個體
  • 資料

專欄

基于MSP432的嵌入式系統實踐

數字通信基本知識

組成

  • 發送器:處理要發送的資訊,将其構造成一定格式的幀。
  • 接收器:接收資訊并解析資訊。
  • 通信媒體:發送器和接收器之間的橋梁,為資訊提供實體媒體,通常為雙絞線、光纖或無線射頻。

串行通信和并行通信

  • 串行通信:将資料一位一位地由端口送出或接收進來
  • 并行通信:資料的各個資料位(一般為8位及其整數倍)在多條資料線上同時被傳輸
  • 并行通信的傳輸速度快、效率高,但抗幹擾能力差,且需要的資源多,一般用于短距離、高帶寬的大資料量傳輸
  • 串行通信節省傳輸線,但資料傳送效率沒有并行通信高

同步通信和異步通信

  • 異步通信:處理器之間不使用公共的參考時鐘,通信雙方分别有自己的時鐘源,但必須使用相同的波特率。例如UART就是屬于串行異步通信。
  • 同步通信:由主機提供時鐘與資料,從機使用該時鐘接收資料或發送資料,即通信雙方公用時鐘源。例如:SPI和I2C就屬于串行同步通信。

異步串行通信的通用基礎知識

定義

串行通信接口,即異步串行通信,簡稱UART,也就是我們常說的“序列槽”或SCI,在USB未普及之前,就是PC機必備的通信接口之一

特殊地位

串行通信具有特殊重要地位的原因

  • 原因一:在通信方式上,屬于單位元組通信,是嵌入式開發中重要的調試手段之一
  • 原因二:它是最簡單的串行通信方式,硬體上所說的232、485通信均是指這個序列槽通信
  • 原因三:硬體接線簡單,與MCU引腳直接相連的一般隻需要發送線、接收線和地線

異步串行通信的格式

串行通信資料以位元組為機關,按位的順序從發送線送出。從MCU引腳來看,高電平就是邏輯“1”,低電平就是邏輯“0”

MSP432的串行通信專欄數字通信基本知識異步串行通信的格式串行通信的波特率奇偶校驗串行通信傳輸方式術語UART程式設計相關資料

串行通信格式

  • 串行通信的發送線,平時處于邏輯“1”狀态
  • 開始發送一個位元組前,先發送一位邏輯“0”,即起始位,表示發送一個位元組的開始
  • 随後發送一個位元組,然後回到平時狀态的邏輯“1”
  • 每發送一個位元組前,均要先發送一個邏輯”0“,這個起始位這就是”異步“之含義,是以稱為異步通信
  • LSB模式 最低有效位模式
  • MSB模式 最高有效位模式
  • UART預設LSB模式

串行通信的波特率

波特率定義

人們把每秒内傳送的位數叫做波特率

機關是:位/秒,記為bps

常用的波特率有9600、19200等

波特率基本概念

在包含開始位與停止位的情況下,發送一個位元組需要10位,很容易計算出,在特定波特率下,發送1K位元組所需要的時間。波特率越高,位長越小,易受電磁幹擾,是以串行通信速度不能很高。距離短時可以适當提高波特率,但提高幅度有限

奇偶校驗

目的

在異步串行通信中,如何知道一個位元組的傳輸是否正确?最常見的方法是增加一個位(奇偶校驗位),供錯誤檢測使用

定義

​ 字元奇偶校驗檢測(Character Parity Checking,CPC)稱為垂直備援檢測(Vertical Redundancy,VRC),它是為每個字元增加一個額外位使字元中“1”的個數為奇數或偶數

​ 奇數或偶數依據使用的是“奇校驗檢查”還是“偶校驗檢查”而定。當使用”奇校驗檢查“時,如果字元資料位中“1”的數目是偶數,校驗位應為“1”,如果“1”的數目是奇數,校驗位應為“0”。當使用”偶校驗檢查“時,如果字元資料位中“1”的數目是偶數,校驗位應為“0”,如果是奇數則為“1”

執行個體

ASCII字元”R“,其位構成是1010010

由于字元“R”中有3個位為“1”,若使用奇校驗檢查,則校驗位為0;如果使用偶校驗檢查,則校驗位為1

注:幾乎所有的MCU的串行異步通信接口,都提供這種功能。但實際程式設計使用較少,原因是單位元組校驗意義不大

串行通信傳輸方式術語

1.全雙工(Full-duplex)

​ 資料傳送是雙向的,且可以同時接收與發送資料。這種傳輸方式中,除了地線之外,需要兩根資料線,站在任何一端的角度看,一根為發送線,另一根為接收線。一般情況下,MCU的異步串行通信接口均是全雙工的。

2.半雙工(Half-duplex)

​ 資料傳送也是雙向的,但是在這種傳輸方式中,除地線之外,一般隻有一根資料線。任何時刻,隻能由一方發送資料,另一方接收資料,不能同時收發。

3.單工(Simplex)

​ 資料傳送是單向的,一端為發送端,另一端為接收端。這種傳輸方式中,除了地線之外,隻要一根資料線就可以了。有線廣播就是單工的。

為使資料傳輸得更遠,美國電子工業協會制定了串行實體接口标準RS232

異步創新通信格式:實際的異步串行通信采用的是NRZ資料格式,即“标準不歸零傳号/空号資料格式”。“不歸零”是:用負電平表示一種二進制值,正電平表示另一種二進制值,不使用零電平。“傳号/空号”分别是表示兩種狀态的實體名稱,邏輯名稱記為“1/0”。

RS232總線标準

  • RS232采用負邏輯
  • -15V ~ -3V為邏輯 “ 1 ”
  • +3V ~ +15V為邏輯 “ 0 ”
  • 最大的傳輸距離是30m
  • 通信速率一般低于20Kbps

9芯串行接口排列

注:RS232一般使用9芯串行接口

MSP432的串行通信專欄數字通信基本知識異步串行通信的格式串行通信的波特率奇偶校驗串行通信傳輸方式術語UART程式設計相關資料
引腳号 功能 引腳号 功能
1 接收線信号檢測 6 資料通信裝置準備就緒(DSR)
2 接收資料線(RXD) 7 請求發送(RTS)
3 發送資料線(TXD) 8 允許發送(CTS)
4 資料終端準備就緒(DTR) 9 振鈴訓示
5 信号地(SG)

注:在RS232通信中,常常隻用三根線:接收線、發送線和地線

MSP432的串行通信專欄數字通信基本知識異步串行通信的格式串行通信的波特率奇偶校驗串行通信傳輸方式術語UART程式設計相關資料

​ 随着USB接口的普及,9芯接口正在逐漸從PC機,特别是從便攜式電腦上消失。于是出現232-USB轉換線、TTL-USB轉換線,在PC機上安裝相應的驅動軟體,就可在PC機上使用一般的串行通信程式設計方式,通過USB接口實作與MCU的串行通信。

MSP432的串行通信專欄數字通信基本知識異步串行通信的格式串行通信的波特率奇偶校驗串行通信傳輸方式術語UART程式設計相關資料
MSP432的串行通信專欄數字通信基本知識異步串行通信的格式串行通信的波特率奇偶校驗串行通信傳輸方式術語UART程式設計相關資料

程式設計時,程式員并不直接與“發送移位寄存器”和“接收移位寄存器”打交道,隻與資料寄存器打交道。

若可以發送,則将待發送的資料放入“資料寄存器”中就可以了,剩下的工作由MCU自動完成。

MCU會将資料從“資料寄存器”送到“發送移位寄存器”,硬體将“發送移位寄存器”的資料一位一位地按照規定的波特率移到發送引腳,供對方接收。

接受時,資料一位一位地從接收引腳進入“接收移位寄存器”,當收到一個完整位元組時,MCU會自動将資料送入“資料寄存器”,并将狀态寄存器的相應位改變,供程式員判定并取出資料。

UART程式設計相關

MSP432的串行通信專欄數字通信基本知識異步串行通信的格式串行通信的波特率奇偶校驗串行通信傳輸方式術語UART程式設計相關資料

eUSCI模式下的UART

Enhanced Universal Serial Communication Interface

增強的通用串行通信接口(eUSCI)子產品支援多種串行通信模式。不同的eUSCI子產品支援不同的模式。每一個不同的eUSCI子產品以不同的字母命名,例如:eUSCI_A、eUSCI_B等。MSP432單片機實作了不止一個相同的eUSCI子產品,這些子產品将以遞增的數字命名,例如,MSP432單片機支援四個eUSCI_A子產品時,這四個子產品應該被命名為eUSCI_A0、eUSCI_A1、eUSCI_A2、eUSCI_A3。

eUSCI_A子產品支援以下通信模式:

  1. UART通信模式;
  2. 具有脈沖整型的IrDA通信模式;
  3. 具有自動波特率檢測的LIN通信模式;
  4. SPI通信模式。

USCI_B子產品支援以下通信模式:

  1. IIC通信模式;
  2. SPI通信模式。

下面首先介紹eUSCI的異步模式——URAT。

UART

Universal Asynchronous Receiver and Transmitter

異步通信收發器

UART的特點及結構

UART即異步串行通信,可設定成全雙工異步通訊方式,與PC(個人計算機)等通訊;或設定成半雙工同步模式與其他外設通信,如ADC或DAC。

MSP432單片機内置了UART功能,它的作用是将外部裝置串行資料轉換為并行資料接收;講内部并行資料轉換為串行資料發送。在通用異步收發模式下eUSCI_Ax子產品通過兩個外部收發引腳UCAxRXD和UCAxTXD把MSP432單片機與外界連接配接起來。當寄存器UCAxCLT0的UCSYNC控制位被清零,UCMODEx控制位被配置為00時,eUSCI_A子產品被配置為UART異步通信模式。

UART的特點如下:

  1. 傳輸7位或8位資料,可采用奇校驗、偶校驗或者無校驗;
  2. 具有獨立的發送和接收移位寄存器;
  3. 具有獨立的發送和接收緩存寄存器;
  4. 支援最低位優先或最高位優先的資料發送和接收方式;
  5. 内置多處理器系統,包括線路空閑和位址位通信協定;
  6. 通過有效的起始位檢測,将MSP432單片機從低功耗模式下喚醒;
  7. 可程式設計實作分頻因子為整數或小數;
  8. 具有用于檢測錯誤或排除錯誤的狀态标志位;

UART運作機理

MSP432的串行通信專欄數字通信基本知識異步串行通信的格式串行通信的波特率奇偶校驗串行通信傳輸方式術語UART程式設計相關資料
MSP432的串行通信專欄數字通信基本知識異步串行通信的格式串行通信的波特率奇偶校驗串行通信傳輸方式術語UART程式設計相關資料
MSP432的串行通信專欄數字通信基本知識異步串行通信的格式串行通信的波特率奇偶校驗串行通信傳輸方式術語UART程式設計相關資料
MSP432的串行通信專欄數字通信基本知識異步串行通信的格式串行通信的波特率奇偶校驗串行通信傳輸方式術語UART程式設計相關資料

在UART模式下,其結構如圖。由圖可知,在UART模式下,eUSCI_A子產品由串行資料接收邏輯(圖①)、波特率發生器(圖②)和串行資料發送邏輯(圖③)三個部分組成。串行資料接收邏輯用于接收串行資料,包括接收移位寄存器、接收緩存寄存器和接收狀态寄存器以及接收标志位設定邏輯。波特率發生器用于産生接收和發送的時鐘信号,其參考時鐘可以來源于ACLK或SMCLK,也可以來自于外部時鐘輸入UCLK,通過整數或小數分頻得到特定的資料傳輸波特率。傳輸資料發送邏輯用于發送串行資料,包括發送移位寄存器、發送緩存寄存器和發送狀态寄存器以及發送标志位設定邏輯。在UART模式下,eUSCI_A異步的以一定速率向另一個裝置發送和接收字元,每個字元的傳輸時鐘是基于軟體對波特率的設定,發送和接收要使用相同的波特率。

應用

序列槽是嵌入式系統與外界聯系的重要手段,主要用于以下兩個方面:

  • UART直接和其他的控制器進行資料交換
  • UART和PC機通信:由于PC機序列槽是RS232電平,是以連接配接時需要使用RS232轉換器

使用UART通信

使用UART通信需要兩個引腳(将在下面的示例中用到),如下表:

引腳名稱 類型 描述
RXD 輸入 串行輸入,接收資料
TXD 輸出 串行輸出,發送資料

串行發送機TxMachine

TxMachine支援下面的工作特性:

  1. 奇偶校驗位的生成
  2. 清除發送
  3. 中斷字元發送
  4. 雙緩存區操作

串行接收機RxMachine

RxMachine把接收到的串行資料送到接收移位寄存器,接收完成後,資料送到串行接收緩存寄存器(SxRBUF),使用者從SxRBUF中讀取接收到的資料。

串行接收機在接收過程中能夠檢測出以下三種錯誤條件:

  1. 奇偶校驗錯:檢測到奇偶校驗錯時,奇偶錯标志位被置位。
  2. 幀錯誤:未收到停止位時,幀錯誤标志位被置位。
  3. 超越錯誤:當接收到一個新的字元前,以前收到的字元沒有被CPU讀走,舊的資料被覆寫,那麼超越錯誤标志位被置位。

波特率的計算

一般填入波特率寄存器中的值都是通過如下的公式求出來:

UART_BR = MCLK / (BaudRate * N)

注意:N為波特率因子,大多數晶片取N = 16

有些波特率計算精度較高,它們有兩個波特率寄存器UART_BR1和UART_BR2,其中UART_BR1則用來存放上式計算出來的整數部分,而UART_BR2則用來存放上式計算出來的小數部分,這樣計算出來的波特率就更精确,誤差更小。

如果假設時鐘源選擇12MHz,如果要取UART2的9600波特率,那麼如何計算

  1. N = 12000000/9600 = 1250
  2. 1 -> OS16 UCBR2 = INT(1250/16) = 78
  3. UCBRF2 = INT(N/ 6 - INT(N/16)) * 16 = INT(0.125 * 16) = 2
  4. N = N - INT(N)

其中根據第一步,N=1250,INT(N)=0,是以N-INT(N)=0,查表TABLE24-4,可以得到UCBRSx的值應該為0.

注意,如果N-INT(N)不等于0,那麼按照官方文檔要求,在TABLE24-4中按照往前靠的原則進行查表,例如小數部分為0.125,那麼查表對應資料為0.100對應的數值。

UART相關寄存器

1寄存器位址分析

  • MSP432晶片有四個UART子產品。每個子產品有其對應的寄存器。以下位址分析均為16進制,為書寫簡化起見,在不至于引起歧義的情況下,略去十六進制字尾“0x”不寫。
  • UART子產品x的寄存器位址=4000_1000+x * 400+n * 2(x = 0~3;n = 0~15(除2、10、11、12), n代表寄存器号)。

2控制寄存器

  • eUSCI_Ax控制字寄存器0(UCAxCTLW0)
  • eUSCI_Ax控制字寄存器1(UCAxCTLW1)
  • eUSCI_Ax中斷使能寄存器(UCAxIE)
  • eUSCI_Ax調制控制字寄存器(UCAxMCTLW)

3狀态寄存器

  • eUSCI_Ax狀态寄存器(UCAxSTATW)
  • eUSCI_Ax中斷标志寄存器(UCAxIFG)
  • eUSCI_Ax中斷向量寄存器(UCAxIV)

4波特率寄存器

  • eUSCI_Ax波特率控制字寄存器(UCAxBRW)
  • eUSCI_Ax自動波特率控制寄存器(UCAxABCTL)

5資料寄存器

  • eUSCI_Ax接收緩存區寄存器(UCAxRXBUF)
  • eUSCI_Ax發送緩存區寄存器(UCAxTXBUF)

常用波特率清單

  • 300
  • 600
  • 1200
  • 2400
  • 4800
  • 9600
  • 19200
  • 38400
  • 43000
  • 56000
  • 57600
  • 115200

MSP432中的UART

MSP432的串行通信專欄數字通信基本知識異步串行通信的格式串行通信的波特率奇偶校驗串行通信傳輸方式術語UART程式設計相關資料

當MSP432要發送資料時,發送緩沖器中要發送的值裝入發送移位寄存器中,再一位一位地從發送端口UCAxTXD發送出去。

當MSP432要接收資料時,資料從UCAxRXD一位一位地送入接收移位寄存器,然後裝入接收緩存寄存器中。接收端在接收資料時可以實作錯誤檢測、解碼、幀聽等功能。

初始化配置

  • 時鐘配置——時鐘源、時鐘頻率等
  • GPIO配置——TXD、RXD
  • UART配置——資料幀格式、波特率等
  • 中斷配置

UART相關的SDK函數

void UART_clearInterruptFlag ( uint32_t moduleInstance,uint_fast8_t mask )
Clears UART interrupt sources.
    
void UART_disableInterrupt ( uint32_t modulelnstance,uint_fast8_t mask )
Disables individual UART interrupt sources.
    
void UART_disableModule ( uint32_t modulelnstance )
Disables the UART block.
    
void UART_enableInterrupt ( uint32_t modulelnstance,uint_fast8_t mask )
Enables individual UART interrupt sources.
    
void UART_enableModule ( uint32_t modulelnstance )
Enables the UART block.
    
uint_fast8_t UART_getEnabledInterruptStatus ( uint32_t modulelnstance )
Gets the current UART interrupt status masked with the enabled interrupts. This function is usefulto call in lSRs to get a list of pending interrupts that are actually enabled and could have causedthe lSR.
    
uint_fast8_t UART_getInterruptStatus ( uint32_t modulelnstance,uint8_t mask )
Gets the current UART interrupt status.

bool UART_initModule ( uint32_t modulelnstance,consteusCI_UART_ConfigV1 * config )
Initialization routine for the UART block.The values to be written into the UCAxBRW and UCAxMCTLW registers should be pre-computed and passed into the initialization function.
           

UART操作執行個體

程式功能:MSP432通過UART與PC通信。

描述:MSP432将通過序列槽收到的字元發回給PC,并在序列槽調試工具中顯示出來。UART幀格式被配置為一個起始位,一個停止位,無校驗位。使用的波特率為9600Baud。若使用UART0,P1.2與P1.3分别為接收端口與發送端口;若使用UART3,P9.6與P9.7分别為接收端口與發送端口。檢視對應針腳可參閱官方手冊表4-1。下面是MSP432通過UART0和UART3與PC通信:

UART0:UCA0RXD(P1.2),UCA0TXD(P1.3)

因為MSP432P401R序列槽0被跳帽接到仿真器上了,将跳帽取下來用杜邦線接到通信裝置即可。

/* DriverLib Includes */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

/* Standard Includes */
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
//配置結構體
const eUSCI_UART_Config uartConfig =
{
    EUSCI_A_UART_CLOCKSOURCE_SMCLK,//時鐘源
    78,//BRDIV = 78
    2,//UCxBRF = 2
    0,//UCxBRS = 0
    EUSCI_A_UART_NO_PARITY,//無校驗
    EUSCI_A_UART_LSB_FIRST,//低位先行
    EUSCI_A_UART_ONE_STOP_BIT,//一個停止位
    EUSCI_A_UART_MODE,//UART模式
    EUSCI_A_UART_OVERSAMPLINE_BAUDRATE_GENERATION
};

//主函數
int main(void)
{
    MAP_WDT_A_holdTimer();
    //GPIO配置
    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1,GPIO_PIN2|GPIO_PIN3,GPIO_PRIMARY_MODULE_FUNCTION);
    //配置DCO頻率
    CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_12);
    //配置UART
    MAP_UART_initModule(EUSCI_A0_BASE,&uartConfig);
    MAP_UART_enableModule(EUSCI_A0_BASE);
    //使能中斷
    MAP_UART_enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);
    MAP_Interrupt_enableInterrupt(INT_EUSCIA0);
    MAP_Interrupt_enableSleepOnIsrExit();
    MAP_Interrupt_enableMaster();
    //列印資料
    printf("Hello MSP432!\r\n");
    UART_transmitData(EUSCI_A0_BASE,'A');
    UART_transmitData(EUSCI_A0_BASE,'B');
    while(1)
    {
        MAP_PCM_gotoLPM0();//低功耗模式0,序列槽中斷喚醒
    }
}

//中斷服務子程式
void EUSCIA0_IRQHandler(void)
{
    uint32_t status = MAP_UART_getEnabledInterruptStatus(EUSCI_A0_BASE);

    if(status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG)
    {
        uint32_t val;
        val = UART_receiveData(EUSCI_A0_BASE);//變量val就是接收到的資料的值
        UART_transmitData(EUSCI_A0_BASE,val);//将接收到的資料發送回去
    }
}

//标準輸入輸出函數對接
int fputc(int ch,FILE *f)
{
    UART_transmitData(EUSCI_A0_BASE,ch & 0xFF);
    return ch;
}

int fgetc(FILE *f)
{
    while(EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG != UART_getInterruptStatus(EUSCI_A0_BASE,EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG));
    return UART_receiveData(EUSCI_A0_BASE);
}
           
UART3:UCA3RXD(P9.6),UCA3TXD(P9.7)
/* DriverLib Includes */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

/* Standard Includes */
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
//配置結構體
const eUSCI_UART_Config uartConfig =
{
    EUSCI_A_UART_CLOCKSOURCE_SMCLK,//時鐘源
    78,//BRDIV = 78
    2,//UCxBRF = 2
    0,//UCxBRS = 0
    EUSCI_A_UART_NO_PARITY,//無校驗
    EUSCI_A_UART_LSB_FIRST,//低位先行
    EUSCI_A_UART_ONE_STOP_BIT,//一個停止位
    EUSCI_A_UART_MODE,//UART模式
    EUSCI_A_UART_OVERSAMPLINE_BAUDRATE_GENERATION
};

//主函數
int main(void)
{
    MAP_WDT_A_holdTimer();
    //GPIO配置
    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P9,GPIO_PIN6|GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);
    //配置DCO頻率
    CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_12);
    //配置UART
    MAP_UART_initModule(EUSCI_A3_BASE,&uartConfig);
    MAP_UART_enableModule(EUSCI_A3_BASE);
    //使能中斷
    MAP_UART_enableInterrupt(EUSCI_A3_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);
    MAP_Interrupt_enableInterrupt(INT_EUSCIA3);
    MAP_Interrupt_enableSleepOnIsrExit();
    MAP_Interrupt_enableMaster();
    //列印資料
    printf("Hello MSP432!\r\n");
    UART_transmitData(EUSCI_A3_BASE,'A');
    UART_transmitData(EUSCI_A3_BASE,'B');
    while(1)
    {
        MAP_PCM_gotoLPM0();//低功耗模式0,序列槽中斷喚醒
    }
}

//中斷服務子程式
void EUSCIA3_IRQHandler(void)
{
    uint32_t status = MAP_UART_getEnabledInterruptStatus(EUSCI_A3_BASE);

    if(status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG)
    {
        uint32_t val;
        val = UART_receiveData(EUSCI_A3_BASE);//變量val就是接收到的資料的值
        UART_transmitData(EUSCI_A3_BASE,val);//将接收到的資料發送回去
    }
}

//标準輸入輸出函數對接
int fputc(int ch,FILE *f)
{
    UART_transmitData(EUSCI_A3_BASE,ch & 0xFF);
    return ch;
}

int fgetc(FILE *f)
{
    while(EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG != UART_getInterruptStatus(EUSCI_A3_BASE,EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG));
    return UART_receiveData(EUSCI_A3_BASE);
}
           

資料

MSP432P401R官方手冊