SOGO論壇
標題:
Microchip PIC32入門(4)-UART簡介
[列印本頁]
作者:
alphi
時間:
2011-12-18 15:54:51
標題:
Microchip PIC32入門(4)-UART簡介
本帖最後由 alphi 於 2011-12-18 16:05 編輯
前言
目前MCU可以與PC介面溝通常見有USB,USART/UART(RS232),GPIB(IEEE 488.1),RS485.其中以USART/ART(RS232)最為常見也最好控制.在Microchip PIC32系列中,最高可以提供高達6組與20Mbps傳輸速率的UART.以下將會使用PIC32 Peripheral Library與Microchip C32 Compiler作為實驗依據
原理
請參考wikipedia,
http://zh.wikipedia.org/wiki/
串行端口
序列通訊在軟體設定里需要做多項設定,最常見的設定包括鮑率(Baud Rate)、同位檢查(Parity Check)和停止位(Stop Bit)。
鮑率:
是指從一裝置發到另一裝置的位元率,即每秒鐘多少位元bits per second (bit/s)。典型的鮑率是300, 1200, 2400, 9600, 115200, 19200等bits。一般通訊兩端裝置都要設為相同的鮑率,但有些裝置也可以設定為自動檢測鮑率。
同位檢查:
(Parity:是用來驗證資料的正確性。同位檢查一般不使用,如果使用,那麼既可以做奇同位(Odd Parity)也可以做偶同位(Even Parity)。同
位檢查是透過修改每一發送位元組(也可以限制發送的位元組)來工作的。如果不作同位檢查,那麼資料是不會被改變的。在偶同位中,因為奇偶檢查位會被相應的置1或0(一般是最高位或最低位),所以資料會被改變以使得所有傳送的數位(含字元的各數位和檢查位)中「1」的個數為偶數;在奇同位中,所有傳送的數位(含字元的各數位和檢查位)中「1」的個數為奇數。同位檢查可以用於接受方檢查傳輸是否發送生錯誤——如果某一位元組中「1」的個數發生了錯誤,那麼這個位元組在傳輸中一定有錯誤發生。如果同位檢查是正確的,那麼要麼沒有發生錯誤要麼發生了偶數個的錯誤。如果使用者選擇資料長度為8位元,則因為沒有多餘的位元可被用來作為同位元,因此就叫做「無同位(Non Parity)」。
停止位元:
是在每個位元組傳輸之後發送的,它用來幫助接受訊號方硬體重同步。
RS-232在傳送資料時,並不需要另外使用一條傳輸線來傳送同步訊號,就能正確的將資料順利傳送到對方,因此叫做「非同步傳輸」,簡稱UART(Universal Asynchronous Receiver Transmitter),不過必須在每一筆資料的前後都加上同步訊號,把同步訊號與資料混和之後,使用同一條傳輸線來傳輸。比如資料11001010被傳輸時,資料的前後就需加入Start(Low)以及Stop(High)等兩個位元,值得注意的是,Start訊號固定為一個位元,但Stop停止位元則可以是1、1.5或者是2位元,由使用RS-232的傳送與接收兩方面自行選擇,但需注意傳送與接受兩者的選擇必須一致。 在序列通訊軟體設定中D/P/S是常規的符號表示。8/N/1(非常普遍)表明8bit資料,沒有同位檢查,1bit停止位。資料位可以設定為5、6、7或者8位元(不可以大於8或小於5),同位檢查位可以設定為無(N)、奇(O)或者偶(E),同位檢查可以使用資料中的位元(bit),所以8/E/1就表示一共8位元資料位,其中一位用來做同位檢查位。停止位可以是1、1.5或者2位的(1.5是用在波特率為60wpm的電傳打字機上的)。
流量控制:當需要發送握手訊號或資料完整性檢測時需要制定其他設定。公用的組合有RTS/CTS, DTR/DSR或者XON/XOFF(實際中不使用連結器接腳而在資料流內插入特殊字元)。
接受方把XON/XOFF訊號發給發送方來控制發送方何時發送資料,這些訊號是與發送資料的傳輸方向相反的。XON訊號告訴發送方接受方準備好接受更多的資料,XOFF訊號告訴發送方停止發送資料直到知道接受方再次準備好。XON/XOFF一般不贊成使用,推薦用RTS/CTS控制流來代替它們。 XON/XOFF是一種工作在終端間的帶內方法,但是必須兩端都支援這個協議,而且在突然啟動的時候會有混淆的可能。 XON/XOFF可以工作於3線的介面。RTS/CTS最初是設計為電傳打字機和數據機半雙工協作通訊的,每次它只能一方數據機發送資料。終端必須發送請求發送訊號然後等到數據機回應清除發送訊號。儘管RTS/CTS是透過硬體達到握手,但它有自己的優勢。
實驗
#include <plib.h> // Peripheral Library
/*
MCU: Microchip PIC32MX795L
Compiler: Microchip MPLAB C32 V2.01
EVB: Explorer 16
Author: Alphi 2011/12/18
編譯器參數
SYSCLK = 80 MHz (8MHz Crystal/ FPLLIDIV * FPLLMUL / FPLLODIV)
PBCLK = 20 MHz
Primary Osc w/PLL (XT+,HS+,EC+PLL)
WDT OFF
*/
#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_4
//取得核心頻率
#define GetSystemClock() (80000000ul)
//取得周邊匯流排頻率
#define GetPeripheralClock() (GetSystemClock()/(1 << OSCCONbits.PBDIV))
//取得指令頻率
#define GetInstructionClock() (GetSystemClock())
//設定UART2 Baudrate為115200bps
#define UART2_BAUDRATE (115200)
//UART2初始化
void UART2_Init(void);
//發送一個字元
void PutCharacter(const char character);
//程式進入點
int main(void)
{
//設定系統參數
SYSTEMConfig(GetSystemClock(), SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
//設定UART2相關參數
UART2_Init();
//設定為多中斷模式
INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
//啟用中斷
INTEnableInterrupts();
while (1);
return 0;
}
//初始化UART
void UART2_Init(void)
{
// Explorer-16 開發版使用 UART2 連接到 PC.
//設定UART2 啟動TX/RX功能
UARTConfigure(UART2, UART_ENABLE_PINS_TX_RX_ONLY);
//設定UART2 FIFO模式與中斷模式在RX FIFO不為空時或者TX FIFO沒有滿發生中斷
UARTSetFifoMode(UART2, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
//設定線上控制:資料傳輸長度為8bit,停止位元為1,無同位元檢查碼
UARTSetLineControl(UART2, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
//設定UART2傳輸速率為115200
UARTSetDataRate(UART2, GetPeripheralClock(), UART2_BAUDRATE);
//啟用UART2相關功能
UARTEnable(UART2, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));
//設定UART2 RX接收中斷致能
INTEnable(INT_SOURCE_UART_RX(UART2), INT_ENABLED);
//設定主要中斷優先權為2
INTSetVectorPriority(INT_VECTOR_UART(UART2), INT_PRIORITY_LEVEL_2);
//設定次中斷優先權為0
INTSetVectorSubPriority(INT_VECTOR_UART(UART2), INT_SUB_PRIORITY_LEVEL_0);
}
//發送一個字元
void PutCharacter(const char character)
{
//等待可以發送
while (!UARTTransmitterIsReady(UART2))
;
//發送一個Byte
UARTSendDataByte(UART2, character);
//等待發送完成
while (!UARTTransmissionHasCompleted(UART2))
;
}
// UART2 中斷處理函式
void __ISR(_UART2_VECTOR, IPL2) UART2Handler(void)
{
// 是否為RX中斷
if (INTGetFlag(INT_SOURCE_UART_RX(UART2)))
{
// 發送一個與接收一樣的字元
PutCharacter(UARTGetDataByte(UART2));
// 清除中斷
INTClearFlag(INT_SOURCE_UART_RX(UART2));
}
//是否為TX中斷
if ( INTGetFlag(INT_SOURCE_UART_TX(UART2)) )
{
//清除中斷
INTClearFlag(INT_SOURCE_UART_TX(UART2));
}
}
複製代碼
結論
從上述程式碼可以知道在開發PIC32 UART時.使用PLIB將會非常簡易與方便
歡迎光臨 SOGO論壇 (https://oursogo.com/)
Powered by OURSOGO.COM