• メインページ
  • データ構造
  • ファイル
  • ファイル一覧
  • グローバル

OpenSSM/libuart.c

説明を見る。
00001 /**************************************************************************************************
00002     Title           : PIC24F Series UART Device Driver
00003     Programmer      : Ryuz
00004     Programmer      : Yosuke FURUSAWA
00005     Copyright       : Copyright (C) 1998-2000 Ryuz. (Imported HOS-v3)
00006     Copyright       : Copyright (C) 2000-2010 Yosuke FURUSAWA.
00007     License         : 4-clause BSD License
00008     Since           : 1998/xx/xx
00009 
00010     Filename        : libuart.h
00011     Last up date    : 2010/08/11
00012     Kanji-Code      : Shift-JIS
00013     TAB Space       : 4
00014 **************************************************************************************************/
00015 
00016 
00017 /*=================================================================================================
00018 ヘッダファイルをインクロード
00019 =================================================================================================*/
00020 #include <p24FJ64GA002.h>
00021 
00022 #include "table.h"
00023 #include "libuart.h"
00024 
00025 
00026 /*=================================================================================================
00027 マクロ定義
00028 ================================================================================================*/
00029 #define abs(a)                  (((a)>0) ? (a) : -(a))
00030 
00031 
00032 /*=================================================================================================
00033 グローバル変数
00034 ================================================================================================*/
00035 /* 送信バッファ */
00036 char uart1_tx_buf[UART1_TX_BUFFER_SIZE];
00037 unsigned char uart1_tx_stptr;
00038 unsigned char uart1_tx_enptr;
00039 
00040 char uart2_tx_buf[UART2_TX_BUFFER_SIZE];
00041 unsigned char uart2_tx_stptr;
00042 unsigned char uart2_tx_enptr;
00043 
00044 /* 受信バッファ */
00045 char uart1_rx_buf[UART1_RX_BUFFER_SIZE];
00046 unsigned char uart1_rx_stptr;
00047 unsigned char uart1_rx_enptr;
00048 
00049 char uart2_rx_buf[UART2_RX_BUFFER_SIZE];
00050 unsigned char uart2_rx_stptr;
00051 unsigned char uart2_rx_enptr;
00052 
00053 
00054 /**************************************************************************************************
00055 UART1 送信割込
00056 **************************************************************************************************/
00057 void __attribute__((interrupt, auto_psv)) _U1TXInterrupt(void)
00058 {
00059     unsigned char nxptr;
00060 
00061     IFS0bits.U1TXIF = 0;
00062 
00063     /* 送信バッファが空 */
00064     if ( uart1_tx_stptr == uart1_tx_enptr ) {
00065         //IFS0bits.U1TXIF = 0;
00066         return;
00067     }
00068 
00069     /* 送信バッファから 1文字取り出して送信 */
00070     while(!U1STAbits.TRMT);
00071     U1TXREG = uart1_tx_buf[uart1_tx_stptr];
00072 
00073     /* ポインタ更新 */
00074     nxptr = uart1_tx_stptr + 1;
00075     if (nxptr >= UART1_TX_BUFFER_SIZE) nxptr = 0;
00076     uart1_tx_stptr = nxptr;
00077 
00078     return;
00079 }
00080 
00081 
00082 /**************************************************************************************************
00083 UART2 送信割込
00084 **************************************************************************************************/
00085 void __attribute__((interrupt, auto_psv)) _U2TXInterrupt(void)
00086 {
00087     unsigned char nxptr;
00088 
00089     IFS1bits.U2TXIF = 0;
00090 
00091     /* 送信バッファが空 */
00092     if ( uart2_tx_stptr == uart2_tx_enptr ) {
00093         //IFS1bits.U2TXIF = 0;
00094         return;
00095     }
00096 
00097     /* 送信バッファから 1文字取り出して送信 */
00098     while(!U2STAbits.TRMT);
00099     U2TXREG = uart2_tx_buf[uart2_tx_stptr];
00100 
00101     /* ポインタ更新 */
00102     nxptr = uart2_tx_stptr + 1;
00103     if (nxptr >= UART2_TX_BUFFER_SIZE) nxptr = 0;
00104     uart2_tx_stptr = nxptr;
00105 
00106     return;
00107 }
00108 
00109 
00110 /**************************************************************************************************
00111 UART1 受信割込
00112 **************************************************************************************************/
00113 void __attribute__((interrupt, auto_psv)) _U1RXInterrupt(void)
00114 {
00115     unsigned char nxptr;
00116 
00117     IFS0bits.U1RXIF = 0;
00118 
00119     if(U1STAbits.URXDA){
00120         /* ポインタ更新 */
00121         nxptr = uart1_rx_enptr + 1;
00122         if(nxptr >= UART1_RX_BUFFER_SIZE) nxptr = 0;
00123         if(uart1_rx_stptr != nxptr){
00124             uart1_rx_buf[ uart1_rx_enptr ] = U1RXREG;
00125             uart1_rx_enptr = nxptr;
00126         } else {
00127             /* バッファが満杯 */
00128             /* 取りこぼすことにする */
00129         }
00130     }
00131 
00132     return;
00133 }
00134 
00135 
00136 /**************************************************************************************************
00137 UART2 受信割込
00138 **************************************************************************************************/
00139 void __attribute__((interrupt, auto_psv)) _U2RXInterrupt(void)
00140 {
00141     unsigned char nxptr;
00142 
00143     IFS1bits.U2RXIF = 0;
00144 
00145     if(U2STAbits.URXDA){
00146         /* ポインタ更新 */
00147         nxptr = uart2_rx_enptr + 1;
00148         if(nxptr >= UART2_RX_BUFFER_SIZE) nxptr = 0;
00149         if(uart2_rx_stptr != nxptr){
00150             uart2_rx_buf[ uart2_rx_enptr ] = U2RXREG;
00151             uart2_rx_enptr = nxptr;
00152         } else {
00153             /* バッファが満杯 */
00154             /* 取りこぼすことにする */
00155         }
00156     }
00157 
00158     return;
00159 }
00160 
00161 
00162 /**************************************************************************************************
00163 初期化
00164 **************************************************************************************************/
00165 void UART1_init(unsigned long baud)
00166 {
00167     RPINR18bits.U1RXR = 5;              /* RXD : RP5 */
00168     RPOR2bits.RP4R = 3;                 /* TXD : RP4 */
00169 
00170     U1MODE = 0b1000100000001000;
00171     U1STA  = 0b0010010000000000;
00172     U1BRG  = UART_get_brg(baud);
00173 
00174     /* 送信割込 */
00175     IPC3bits.U1TXIP = 3;
00176     IEC0bits.U1TXIE = 1;
00177     IFS0bits.U1TXIF = 0;
00178 
00179     /* 受信割込 */
00180     IPC2bits.U1RXIP = 4;
00181     IEC0bits.U1RXIE = 1;
00182     IFS0bits.U1RXIF = 0;
00183 
00184     UART1_buf_clear();
00185     return;
00186 }
00187 
00188 
00189 void UART2_init(unsigned long baud)
00190 {
00191     RPINR19bits.U2RXR = 6;              /* RXD : RP6 */
00192     RPOR3bits.RP7R = 5;                 /* TXD : RP7 */
00193 
00194     U2MODE = 0b1000100000001000;
00195     U2STA  = 0b0010010000000000;
00196     U2BRG  = UART_get_brg(baud);
00197 
00198     /* 送信割込 */
00199     IPC7bits.U2TXIP = 3;
00200     IEC1bits.U2TXIE = 1;
00201     IFS1bits.U2TXIF = 0;
00202 
00203     /* 受信割込 */
00204     IPC7bits.U2RXIP = 4;
00205     IEC1bits.U2RXIE = 1;
00206     IFS1bits.U2RXIF = 0;
00207 
00208     UART2_buf_clear();
00209     return;
00210 }
00211 
00212 
00213 /**************************************************************************************************
00214 バッファクリア
00215 **************************************************************************************************/
00216  void UART1_buf_clear(void)
00217 {
00218     uart1_tx_stptr = 0;
00219     uart1_tx_enptr = 0;
00220 
00221     uart1_rx_stptr = 0;
00222     uart1_rx_enptr = 0;
00223 
00224     return;
00225 }
00226 
00227  void UART2_buf_clear(void)
00228 {
00229     uart2_tx_stptr = 0;
00230     uart2_tx_enptr = 0;
00231 
00232     uart2_rx_stptr = 0;
00233     uart2_rx_enptr = 0;
00234 
00235     return;
00236 }
00237 
00238 
00239 /**************************************************************************************************
00240 1byte受信
00241 **************************************************************************************************/
00242 int UART1_getch(void)
00243 {
00244     unsigned char buf;
00245     unsigned char nxptr;
00246     unsigned char ipl;
00247 
00248     ipl = SRbits.IPL;
00249     SRbits.IPL = 5;
00250     Nop();
00251 
00252     /* バッファが空 */
00253     if(uart1_rx_stptr == uart1_rx_enptr){
00254         SRbits.IPL = ipl;
00255         return(-1);
00256     }
00257 
00258     /* バッファから1byte取り出す */
00259     buf = uart1_rx_buf[ uart1_rx_stptr ];
00260 
00261     /* ポインタ更新 */
00262     nxptr = uart1_rx_stptr + 1;
00263     if(nxptr >= UART1_RX_BUFFER_SIZE) nxptr = 0;
00264     uart1_rx_stptr = nxptr;
00265 
00266     SRbits.IPL = ipl;
00267     return(buf);
00268 }
00269 
00270 int UART2_getch(void)
00271 {
00272     unsigned char buf;
00273     unsigned char nxptr;
00274     unsigned char ipl;
00275 
00276     ipl = SRbits.IPL;
00277     SRbits.IPL = 5;
00278     Nop();
00279 
00280     /* バッファが空 */
00281     if(uart2_rx_stptr == uart2_rx_enptr){
00282         SRbits.IPL = ipl;
00283         return(-1);
00284     }
00285 
00286     /* バッファから1byte取り出す */
00287     buf = uart2_rx_buf[ uart2_rx_stptr ];
00288 
00289     /* ポインタ更新 */
00290     nxptr = uart2_rx_stptr + 1;
00291     if(nxptr >= UART2_RX_BUFFER_SIZE) nxptr = 0;
00292     uart2_rx_stptr = nxptr;
00293 
00294     SRbits.IPL = ipl;
00295     return(buf);
00296 }
00297 
00298 
00299 /**************************************************************************************************
00300 1byte送信
00301 **************************************************************************************************/
00302 int UART1_putch(unsigned char buf)
00303 {
00304     unsigned char nxptr;
00305     unsigned char ipl;
00306 
00307     ipl = SRbits.IPL;
00308     SRbits.IPL = 4;
00309     Nop();
00310 
00311     if(uart1_tx_stptr == uart1_tx_enptr){
00312         while(!U1STAbits.TRMT);
00313         U1TXREG = buf;
00314         SRbits.IPL = ipl;
00315         return(buf);
00316     }
00317 
00318     nxptr = uart1_tx_enptr + 1;
00319     if(nxptr >= UART1_TX_BUFFER_SIZE) nxptr = 0;
00320     if(uart1_tx_stptr == nxptr){
00321         SRbits.IPL = ipl;
00322         return(-1);
00323     }
00324 
00325     /* 送信バッファに1文字入れる */
00326     uart1_tx_buf[uart1_tx_enptr] = buf;
00327     uart1_tx_enptr = nxptr;
00328 
00329     SRbits.IPL = ipl;
00330     return(buf);
00331 }
00332 
00333 int UART2_putch(unsigned char buf)
00334 {
00335     unsigned char nxptr;
00336     unsigned char ipl;
00337 
00338     ipl = SRbits.IPL;
00339     SRbits.IPL = 4;
00340     Nop();
00341 
00342     if(uart2_tx_stptr == uart2_tx_enptr){
00343         while(!U2STAbits.TRMT);
00344         U2TXREG = buf;
00345         SRbits.IPL = ipl;
00346         return(buf);
00347     }
00348 
00349     nxptr = uart2_tx_enptr + 1;
00350     if(nxptr >= UART2_TX_BUFFER_SIZE) nxptr = 0;
00351     if(uart2_tx_stptr == nxptr){
00352         SRbits.IPL = ipl;
00353         return(-1);
00354     }
00355 
00356     /* 送信バッファに1文字入れる */
00357     uart2_tx_buf[uart2_tx_enptr] = buf;
00358     uart2_tx_enptr = nxptr;
00359 
00360     SRbits.IPL = ipl;
00361     return(buf);
00362 }
00363 
00364 
00365 /**************************************************************************************************
00366 Nbyte送信
00367 **************************************************************************************************/
00368  void UART1_putstr(char *buf)
00369 {
00370     while(*buf){
00371         while(UART1_putch(*buf) < 0);
00372         *buf++;
00373     }
00374 
00375     return;
00376 }
00377 
00378  void UART2_putstr(char *buf)
00379 {
00380     while(*buf){
00381         while(UART2_putch(*buf) < 0);
00382         *buf++;
00383     }
00384 
00385     return;
00386 }
00387 
00388 
00389 /**************************************************************************************************
00390 10進送信
00391 **************************************************************************************************/
00392 void UART1_putint(int digit)
00393 {
00394     if(digit < 0) UART1_putch('-');
00395 
00396     digit = abs(digit);
00397 
00398     if(digit > 9999) UART1_putch('0' + digit / 10000 % 10);
00399     if(digit >  999) UART1_putch('0' + digit /  1000 % 10);
00400     if(digit >   99) UART1_putch('0' + digit /   100 % 10);
00401     if(digit >    9) UART1_putch('0' + digit /    10 % 10);
00402 
00403     UART1_putch('0' + digit % 10);
00404     return;
00405 }
00406 
00407 void UART2_putint(int digit)
00408 {
00409     if(digit < 0) UART2_putch('-');
00410 
00411     digit = abs(digit);
00412 
00413     if(digit > 9999) UART2_putch('0' + digit / 10000 % 10);
00414     if(digit >  999) UART2_putch('0' + digit /  1000 % 10);
00415     if(digit >   99) UART2_putch('0' + digit /   100 % 10);
00416     if(digit >    9) UART2_putch('0' + digit /    10 % 10);
00417 
00418     UART2_putch('0' + digit % 10);
00419     return;
00420 }
00421 
00422 void UART1_putdouble(double digit, unsigned char size2)
00423 {
00424     if(digit < 0) UART1_putch('-');
00425 
00426     digit = abs(digit);
00427 
00428     if(digit > 9999) UART1_putch('0' + (unsigned char)(digit / 10000) % 10);
00429     if(digit >  999) UART1_putch('0' + (unsigned char)(digit /  1000) % 10);
00430     if(digit >   99) UART1_putch('0' + (unsigned char)(digit /   100) % 10);
00431     if(digit >    9) UART1_putch('0' + (unsigned char)(digit /    10) % 10);
00432     UART1_putch('0' + (unsigned char)digit % 10);
00433     UART1_putch('.');
00434     UART1_putch('0' + (unsigned int)(digit * 10.0) % 10);
00435     if(size2 > 1)   UART1_putch('0' + (unsigned int)(digit *   100.0) % 10);
00436     if(size2 > 2)   UART1_putch('0' + (unsigned int)(digit *  1000.0) % 10);
00437     if(size2 > 3)   UART1_putch('0' + (unsigned int)(digit * 10000.0) % 10);
00438 
00439     return;
00440 }
00441 
00442 void UART2_putdouble(double digit, unsigned char size2)
00443 {
00444     if(digit < 0) UART2_putch('-');
00445 
00446     digit = abs(digit);
00447 
00448     if(digit > 9999) UART2_putch('0' + (unsigned char)(digit / 10000) % 10);
00449     if(digit >  999) UART2_putch('0' + (unsigned char)(digit /  1000) % 10);
00450     if(digit >   99) UART2_putch('0' + (unsigned char)(digit /   100) % 10);
00451     if(digit >    9) UART2_putch('0' + (unsigned char)(digit /    10) % 10);
00452     UART2_putch('0' + (unsigned char)digit % 10);
00453     UART2_putch('.');
00454     UART2_putch('0' + (unsigned int)(digit * 10.0) % 10);
00455     if(size2 > 1)   UART2_putch('0' + (unsigned int)(digit *   100.0) % 10);
00456     if(size2 > 2)   UART2_putch('0' + (unsigned int)(digit *  1000.0) % 10);
00457     if(size2 > 3)   UART2_putch('0' + (unsigned int)(digit * 10000.0) % 10);
00458 
00459     return;
00460 }
00461 
00462 
00463 /**************************************************************************************************
00464 16進送信
00465 **************************************************************************************************/
00466  void UART1_puthex(unsigned char a)
00467 {
00468     UART1_putch(hex[(a >> 4)    & 0x0f]);
00469     UART1_putch(hex[ a          & 0x0f]);
00470     return;
00471 }
00472 
00473  void UART2_puthex(unsigned char a)
00474 {
00475     UART2_putch(hex[(a >> 4)    & 0x0f]);
00476     UART2_putch(hex[ a          & 0x0f]);
00477     return;
00478 }
00479 
00480 
00481 /**************************************************************************************************
00482 空き送信バッファサイズ
00483 **************************************************************************************************/
00484  unsigned char UART1_get_sendbuf(void)
00485 {
00486     if(uart1_tx_stptr >= uart1_tx_enptr)    return(UART1_TX_BUFFER_SIZE - (uart1_tx_stptr - uart1_tx_enptr));
00487     else                                    return(UART1_TX_BUFFER_SIZE -  uart1_tx_enptr + uart1_tx_stptr);
00488 }
00489 
00490  unsigned char UART2_get_sendbuf(void)
00491 {
00492     if(uart2_tx_stptr >= uart2_tx_enptr)    return(UART2_TX_BUFFER_SIZE - (uart2_tx_stptr - uart2_tx_enptr));
00493     else                                    return(UART2_TX_BUFFER_SIZE -  uart2_tx_enptr + uart2_tx_stptr);
00494 }
00495 
00496 
00497 /**************************************************************************************************
00498 空き受信バッファサイズ
00499 **************************************************************************************************/
00500  unsigned char UART1_get_recvbuf(void)
00501 {
00502     if(uart1_rx_stptr >= uart1_rx_enptr)    return(UART1_RX_BUFFER_SIZE - (uart1_rx_stptr - uart1_rx_enptr));
00503     else                                    return(UART1_RX_BUFFER_SIZE -  uart1_rx_enptr + uart1_rx_stptr);
00504 }
00505 
00506  unsigned char UART2_get_recvbuf(void)
00507 {
00508     if(uart2_rx_stptr >= uart2_rx_enptr)    return(UART2_RX_BUFFER_SIZE - (uart2_rx_stptr - uart2_rx_enptr));
00509     else                                    return(UART2_RX_BUFFER_SIZE -  uart2_rx_enptr + uart2_rx_stptr);
00510 }
00511 
00512 
00513 /**************************************************************************************************
00514 BRGを得る / ボーレートを得る
00515 **************************************************************************************************/
00516  unsigned int UART_get_brg(unsigned long baud)
00517 {
00518     return( ((cpu_fcy[ OSCTUN ] >> 2) / baud) - 1 );
00519 }
00520 
00521  unsigned long UART1_get_baud(void)
00522 {
00523     return( (unsigned long)(cpu_fcy[ OSCTUN ] >> 2) / (unsigned long)(U1BRG + 1));
00524 }
00525 
00526  unsigned long UART2_get_baud(void)
00527 {
00528     return( (unsigned long)(cpu_fcy[ OSCTUN ] >> 2) / (unsigned long)(U2BRG + 1));
00529 }

OpenSSMに対してFri Sep 10 2010 16:36:49に生成されました。  doxygen 1.7.1