SOGO論壇
  登入   註冊   找回密碼
查看: 3693|回覆: 0
列印 上一主題 下一主題

[程式設計] Microchip PIC32入門(4)-UART簡介 [複製連結]

Rank: 5Rank: 5

數位軟體勳章

狀態︰ 離線
跳轉到指定樓層
1
發表於 2011-12-18 15:54:51 |只看該作者 |倒序瀏覽 | x 2
本帖最後由 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是透過硬體達到握手,但它有自己的優勢。


實驗
  1. #include <plib.h>                        // Peripheral Library



  2. /*
  3.     MCU:        Microchip PIC32MX795L
  4.     Compiler:  Microchip MPLAB C32 V2.01
  5.     EVB:         Explorer 16
  6.     Author:     Alphi 2011/12/18

  7.     編譯器參數
  8.     SYSCLK = 80 MHz (8MHz Crystal/ FPLLIDIV * FPLLMUL / FPLLODIV)
  9.     PBCLK = 20 MHz
  10.     Primary Osc w/PLL (XT+,HS+,EC+PLL)
  11.     WDT OFF
  12. */

  13. #pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
  14. #pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_4

  15. //取得核心頻率
  16. #define        GetSystemClock()              (80000000ul)
  17. //取得周邊匯流排頻率
  18. #define        GetPeripheralClock()          (GetSystemClock()/(1 << OSCCONbits.PBDIV))
  19. //取得指令頻率
  20. #define        GetInstructionClock()         (GetSystemClock())

  21. //設定UART2 Baudrate為115200bps
  22. #define UART2_BAUDRATE              (115200)     

  23. //UART2初始化
  24. void UART2_Init(void);

  25. //發送一個字元
  26. void PutCharacter(const char character);

  27. //程式進入點
  28. int main(void)
  29. {
  30.     //設定系統參數
  31.     SYSTEMConfig(GetSystemClock(), SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);

  32.     //設定UART2相關參數
  33.     UART2_Init();

  34.     //設定為多中斷模式
  35.     INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);

  36.     //啟用中斷
  37.     INTEnableInterrupts();

  38.     while (1);

  39.     return 0;
  40. }
  41. //初始化UART
  42. void UART2_Init(void)
  43. {
  44.      // Explorer-16 開發版使用 UART2 連接到 PC.
  45.     //設定UART2 啟動TX/RX功能
  46.     UARTConfigure(UART2, UART_ENABLE_PINS_TX_RX_ONLY);
  47.    
  48.     //設定UART2 FIFO模式與中斷模式在RX FIFO不為空時或者TX FIFO沒有滿發生中斷
  49.     UARTSetFifoMode(UART2, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
  50.    
  51.     //設定線上控制:資料傳輸長度為8bit,停止位元為1,無同位元檢查碼
  52.     UARTSetLineControl(UART2, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
  53.    
  54.     //設定UART2傳輸速率為115200
  55.     UARTSetDataRate(UART2, GetPeripheralClock(), UART2_BAUDRATE);

  56.     //啟用UART2相關功能
  57.     UARTEnable(UART2, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));

  58.     //設定UART2 RX接收中斷致能
  59.     INTEnable(INT_SOURCE_UART_RX(UART2), INT_ENABLED);
  60.    
  61.     //設定主要中斷優先權為2
  62.    INTSetVectorPriority(INT_VECTOR_UART(UART2), INT_PRIORITY_LEVEL_2);
  63.    
  64.     //設定次中斷優先權為0
  65.     INTSetVectorSubPriority(INT_VECTOR_UART(UART2), INT_SUB_PRIORITY_LEVEL_0);

  66. }
  67. //發送一個字元
  68. void PutCharacter(const char character)
  69. {
  70.   //等待可以發送
  71.   while (!UARTTransmitterIsReady(UART2))
  72.     ;

  73.   //發送一個Byte
  74.   UARTSendDataByte(UART2, character);

  75. //等待發送完成
  76.   while (!UARTTransmissionHasCompleted(UART2))
  77.     ;
  78. }

  79. // UART2 中斷處理函式

  80. void __ISR(_UART2_VECTOR, IPL2) UART2Handler(void)
  81. {
  82.   // 是否為RX中斷
  83.   if (INTGetFlag(INT_SOURCE_UART_RX(UART2)))
  84.     {
  85.       // 發送一個與接收一樣的字元
  86.       PutCharacter(UARTGetDataByte(UART2));

  87.       // 清除中斷
  88.       INTClearFlag(INT_SOURCE_UART_RX(UART2));

  89.     }

  90.   //是否為TX中斷
  91.   if ( INTGetFlag(INT_SOURCE_UART_TX(UART2)) )
  92.     {
  93.      //清除中斷
  94.       INTClearFlag(INT_SOURCE_UART_TX(UART2));
  95.     }
  96. }
複製代碼
結論
   從上述程式碼可以知道在開發PIC32 UART時.使用PLIB將會非常簡易與方便
已有 1 人評分威望 收起 理由
又靜 + 1 您發表的文章內容豐富,無私分享造福眾人,.

總評分: 威望 + 1   查看全部評分

喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

失敗只有一種:那就是半途而廢
請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2024-5-2 00:55

© 2004-2024 SOGO論壇 OURSOGO.COM
回頂部