2017年8月31日 星期四

利用GPIO達到Software UART TX

有時在開發過程中撰寫程式時,礙於成本考量,使用Low pin count MCU,因此對於IC的開發工具不支援Low pin count的Debug模式,要如何偵錯就是一個課題,在這邊將簡單的介紹利用GPIO pin將UART的資料送出,經由UART轉USB連接線接到電腦去觀看數據資料,因此需了解UART傳送格式如以下 :
Idle : High
Start bit : Low
Data : LSB first


也可以透過電腦終端機軟體Tera Term了解以下資訊 :
Port : 跟PC的哪個COM port連線
Baud rate : 傳送速度(每秒多少位元,常見9600 bit per second)
Data : 8bit or 9bit(常見為8bit)
Parity : 同位元檢查(錯誤檢查用,若只是用來做開發的Debug用途,可以選none)
Stop : 1 / 1.5 / 2 bit(通常為1bit)
Flow control : 流量控制(基本上MCU不需要使用到)

廢話不多說,假設要使用最常見的9600/8/N/1, 這邊會說明以下幾個步驟 :

(1)設定GPIO為輸出

(2)設定timer中斷或者使用delay,我最常用是使用timer中斷,設定方法為先知道傳送速度,假設為9600bps,也就是說每104us送一個bit,因此timer interval先設定為104us,當要傳送時,開啟timer計數等待中斷發生之後傳送第一個Start bit,接著等下一次中斷傳送LSB,繼續等待下次中斷直到LSB送完之後並且送完Stop bit;一個bit一個bit緊接著傳送的方式要有移位的觀念,假設MCU使用的是PIC16系列程式如下:

volatile unsigned char TX_Data;
volatile unsigned char Cnt = 0;

#define TX  LATCbits.LATC7

// Cnt = 0 : Start bit
// Cnt = 1~8 : Data bit
// Cnt = 9 : Stop bit
void interrupt ISR(void)
{
     if(TMR2IF && TMR2IE)
    {
         TMR2IF = 0;
         if(Cnt == 0)
        {
             TX = 0;           // Start bit
        }
        else if(Cnt < 9)    // Data bit : 1 ~ 8
       {
            if ((TX_Data >> (Cnt - 1)) & 0x01)  /* bit to send */
  TX = 1;                                              
           else
TX = 0;
        }
        else
       {
            TX = 1;    // Stop bit
            TMR2ON = 0;
            Cnt = 0;
            return;
       }
        Cnt++;
}

void main(void)
{
    Init_MCU();
    Init_Timer2();  // 104us interval

    TX_Data = 0x55;
    TMR2ON = 1;   // Start UART TX
    PEIE = 1;
    GIE = 1;

    while(1);

    return;
}







STM32於IAR 9.3以後的版本將uart導向至printf

首先,請先參考如以下IAR提供的"在IAR Embedded Workbench中实现打印输出技術資料" https://www.iar.com/cn/knowledge/support/technical-notes/general/implementing-printf-ou...