modified for NuMaker_PFM series

Dependents:   NuMaker-mbed-modbus-sample NuMaker_NuWicam_Lite NuMaker-mbed-modbus-sample

Fork of Modbus by Wayne Lin

Committer:
cyliang
Date:
Thu Feb 25 15:36:09 2021 +0800
Revision:
10:288aeae1458f
Parent:
9:0c172c06e04d
Child:
11:513c55a1b277
Change serial R/W method to fulfill OS v6.x API

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giryan 0:274eb57e1df3 1 /*
giryan 0:274eb57e1df3 2 * FreeModbus Libary: BARE Port
giryan 0:274eb57e1df3 3 * Copyright (C) 2006 Christian Walter <wolti@sil.at>
giryan 0:274eb57e1df3 4 *
giryan 0:274eb57e1df3 5 * This library is free software; you can redistribute it and/or
giryan 0:274eb57e1df3 6 * modify it under the terms of the GNU Lesser General Public
giryan 0:274eb57e1df3 7 * License as published by the Free Software Foundation; either
giryan 0:274eb57e1df3 8 * version 2.1 of the License, or (at your option) any later version.
giryan 0:274eb57e1df3 9 *
giryan 0:274eb57e1df3 10 * This library is distributed in the hope that it will be useful,
giryan 0:274eb57e1df3 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
giryan 0:274eb57e1df3 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
giryan 0:274eb57e1df3 13 * Lesser General Public License for more details.
giryan 0:274eb57e1df3 14 *
giryan 0:274eb57e1df3 15 * You should have received a copy of the GNU Lesser General Public
giryan 0:274eb57e1df3 16 * License along with this library; if not, write to the Free Software
giryan 0:274eb57e1df3 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
giryan 0:274eb57e1df3 18 *
giryan 0:274eb57e1df3 19 * File: $Id: portserial.c,v 1.1 2006/08/22 21:35:13 wolti Exp $
giryan 0:274eb57e1df3 20 */
giryan 0:274eb57e1df3 21
giryan 0:274eb57e1df3 22 /* ----------------------- System includes ----------------------------------*/
giryan 0:274eb57e1df3 23 #include "mbed.h" // Cam
giryan 0:274eb57e1df3 24
giryan 0:274eb57e1df3 25 /* ----------------------- Platform includes --------------------------------*/
giryan 0:274eb57e1df3 26 #include "port.h"
giryan 0:274eb57e1df3 27
giryan 0:274eb57e1df3 28 /* ----------------------- Modbus includes ----------------------------------*/
giryan 0:274eb57e1df3 29 #include "mb.h"
giryan 0:274eb57e1df3 30 #include "mbport.h"
cyliang 10:288aeae1458f 31 #if MBED_MAJOR_VERSION >= 6
cyliang 10:288aeae1458f 32 #include "MyUnbufferedSerial.h"
cyliang 10:288aeae1458f 33 #endif
giryan 0:274eb57e1df3 34
giryan 0:274eb57e1df3 35 /* ----------------------- static functions ---------------------------------*/
giryan 0:274eb57e1df3 36 static void prvvUARTTxReadyISR( void );
giryan 0:274eb57e1df3 37 static void prvvUARTRxISR( void );
giryan 0:274eb57e1df3 38 static void prvvUARTISR( void );
giryan 0:274eb57e1df3 39
giryan 0:274eb57e1df3 40 /* ----------------------- System Variables ---------------------------------*/
cyliang 7:abafdf714896 41 #if defined(MBED_CONF_APP_DEF_RS485_PORT) && (MBED_CONF_APP_DEF_RS485_PORT)// mbed serial port
wclin 6:08849dd9654d 42 #include "nvt_rs485.h"
wclin 6:08849dd9654d 43 // RS485 TX, RX, RTS pins
wclin 8:456375d72644 44 #if defined(TARGET_NUMAKER_PFM_NUC472) // for NUC472 board
wclin 6:08849dd9654d 45 NvtRS485 pc(PF_13, PF_14, PF_11);
wclin 6:08849dd9654d 46 #elif defined(TARGET_NUMAKER_PFM_M453) // for M453 board
wclin 6:08849dd9654d 47 NvtRS485 pc(PE_8, PE_9, PE_11);
wclin 9:0c172c06e04d 48 #elif defined(TARGET_NUMAKER_PFM_M487) // for M487 board
wclin 9:0c172c06e04d 49 NvtRS485 pc(PA_3, PA_2, PA_0);
wclin 9:0c172c06e04d 50 #warning "Notice: It has no RS485 port on NUMAKER-PFM-M487 board.
wclin 9:0c172c06e04d 51 #warning "But, you can connect with a RS485 daughter board to PA_3(TX), PA_2(RX) and PA_0(RTS) pin."
wclin 8:456375d72644 52 #else
wclin 8:456375d72644 53 #error "The demo code can't be executed on this board."
wclin 6:08849dd9654d 54 #endif
wclin 3:419ee4c5e10f 55 #else
wclin 6:08849dd9654d 56 //UART TX, RX
wclin 6:08849dd9654d 57 #if defined(TARGET_NUMAKER_PFM_NUC472) // for NUC472 board
wclin 6:08849dd9654d 58 Serial pc(PG_2, PG_1);
wclin 6:08849dd9654d 59 #elif defined(TARGET_NUMAKER_PFM_M453) // for M453 board
wclin 6:08849dd9654d 60 Serial pc(PD_1, PD_6);
wclin 8:456375d72644 61 #elif defined(TARGET_NUMAKER_PFM_M487) // for M478 board
wclin 8:456375d72644 62 Serial pc(PC_12, PC_11);
wclin 8:456375d72644 63 #else
wclin 8:456375d72644 64 #error "The demo code can't be executed on this board."
wclin 6:08849dd9654d 65 #endif
wclin 3:419ee4c5e10f 66 #endif
giryan 0:274eb57e1df3 67
wclin 2:6ee56c002f64 68 static volatile BOOL RxEnable, TxEnable; // Cam - keep a static copy of the RxEnable and TxEnable
giryan 0:274eb57e1df3 69 // status for the simulated ISR (ticker)
giryan 0:274eb57e1df3 70
giryan 0:274eb57e1df3 71
giryan 0:274eb57e1df3 72 /* ----------------------- Start implementation -----------------------------*/
giryan 0:274eb57e1df3 73 // Cam - This is called every 1mS to simulate Rx character received ISR and
giryan 0:274eb57e1df3 74 // Tx buffer empty ISR.
giryan 0:274eb57e1df3 75 static void
giryan 0:274eb57e1df3 76 prvvUARTISR( void )
giryan 0:274eb57e1df3 77 {
wclin 3:419ee4c5e10f 78 if ( TxEnable )
giryan 0:274eb57e1df3 79 if(pc.writeable())
giryan 0:274eb57e1df3 80 prvvUARTTxReadyISR();
wclin 3:419ee4c5e10f 81
wclin 3:419ee4c5e10f 82 if ( RxEnable )
giryan 0:274eb57e1df3 83 if(pc.readable())
wclin 3:419ee4c5e10f 84 prvvUARTRxISR();
giryan 0:274eb57e1df3 85 }
giryan 0:274eb57e1df3 86
giryan 0:274eb57e1df3 87 void
giryan 0:274eb57e1df3 88 vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
giryan 0:274eb57e1df3 89 {
giryan 0:274eb57e1df3 90 /* If xRXEnable enable serial receive interrupts. If xTxENable enable
giryan 0:274eb57e1df3 91 * transmitter empty interrupts.
giryan 0:274eb57e1df3 92 */
giryan 0:274eb57e1df3 93 RxEnable = xRxEnable;
giryan 0:274eb57e1df3 94 TxEnable = xTxEnable;
wclin 3:419ee4c5e10f 95
wclin 3:419ee4c5e10f 96 //printf("\r\nRx: %d, TX:%d\r\n", RxEnable, TxEnable);
giryan 0:274eb57e1df3 97 }
giryan 0:274eb57e1df3 98
wclin 1:cfde7320b0bf 99 /* ----------------------- Start implementation -----------------------------*/
giryan 0:274eb57e1df3 100 BOOL
giryan 0:274eb57e1df3 101 xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
giryan 0:274eb57e1df3 102 {
wclin 1:cfde7320b0bf 103 pc.baud(ulBaudRate);
cyliang 7:abafdf714896 104 #if defined(MBED_CONF_APP_DEF_RS485_PORT) && (MBED_CONF_APP_DEF_RS485_PORT) // mbed serial port
wclin 6:08849dd9654d 105 #if defined(TARGET_NUMAKER_PFM_NUC472) // for NUC472 board
wclin 3:419ee4c5e10f 106 pc.set_rs485_mode(PF_11);
wclin 6:08849dd9654d 107 #elif defined(TARGET_NUMAKER_PFM_M453) // for M453 board
wclin 6:08849dd9654d 108 pc.set_rs485_mode(PE_11);
wclin 9:0c172c06e04d 109 #elif defined(TARGET_NUMAKER_PFM_M487) // for M487 board
wclin 9:0c172c06e04d 110 pc.set_rs485_mode(PA_0);
wclin 9:0c172c06e04d 111 #endif
wclin 3:419ee4c5e10f 112 #endif
cyliang 10:288aeae1458f 113 #if 0 //MBED_MAJOR_VERSION >= 6
cyliang 10:288aeae1458f 114 SerialBase::Parity parity;
cyliang 10:288aeae1458f 115 if (eParity == MB_PAR_NONE)
cyliang 10:288aeae1458f 116 parity = SerialBase::None;
cyliang 10:288aeae1458f 117 else if ( eParity == MB_PAR_ODD )
cyliang 10:288aeae1458f 118 parity = SerialBase::Odd;
cyliang 10:288aeae1458f 119 else if ( eParity == MB_PAR_EVEN)
cyliang 10:288aeae1458f 120 parity = SerialBase::Even;
cyliang 10:288aeae1458f 121 pc.format(
cyliang 10:288aeae1458f 122 /* bits */ 8,
cyliang 10:288aeae1458f 123 /* parity */ parity,
cyliang 10:288aeae1458f 124 /* stop bit */ 1
cyliang 10:288aeae1458f 125 );
cyliang 10:288aeae1458f 126 #endif
wclin 1:cfde7320b0bf 127 return TRUE;
wclin 1:cfde7320b0bf 128 }
wclin 1:cfde7320b0bf 129
wclin 1:cfde7320b0bf 130 void xMBPortSerialPolling( void )
wclin 1:cfde7320b0bf 131 {
wclin 1:cfde7320b0bf 132 prvvUARTISR( );
wclin 1:cfde7320b0bf 133 }
wclin 1:cfde7320b0bf 134
giryan 0:274eb57e1df3 135 BOOL
giryan 0:274eb57e1df3 136 xMBPortSerialPutByte( CHAR ucByte )
giryan 0:274eb57e1df3 137 {
giryan 0:274eb57e1df3 138 /* Put a byte in the UARTs transmit buffer. This function is called
giryan 0:274eb57e1df3 139 * by the protocol stack if pxMBFrameCBTransmitterEmpty( ) has been
giryan 0:274eb57e1df3 140 * called. */
wclin 3:419ee4c5e10f 141 //printf("[%02x]", ucByte );
cyliang 10:288aeae1458f 142 #if MBED_MAJOR_VERSION >= 6
cyliang 10:288aeae1458f 143 pc.write(&ucByte, 1);
cyliang 10:288aeae1458f 144 #else
giryan 0:274eb57e1df3 145 pc.putc( ucByte);
cyliang 10:288aeae1458f 146 #endif
giryan 0:274eb57e1df3 147 return TRUE;
giryan 0:274eb57e1df3 148 }
giryan 0:274eb57e1df3 149
giryan 0:274eb57e1df3 150 BOOL
giryan 0:274eb57e1df3 151 xMBPortSerialGetByte( CHAR * pucByte )
giryan 0:274eb57e1df3 152 {
giryan 0:274eb57e1df3 153 /* Return the byte in the UARTs receive buffer. This function is called
giryan 0:274eb57e1df3 154 * by the protocol stack after pxMBFrameCBByteReceived( ) has been called.
giryan 0:274eb57e1df3 155 */
cyliang 10:288aeae1458f 156 #if MBED_MAJOR_VERSION >= 6
cyliang 10:288aeae1458f 157 pc.read(pucByte,1);
cyliang 10:288aeae1458f 158 #else
wclin 3:419ee4c5e10f 159 *pucByte = pc.getc();
cyliang 10:288aeae1458f 160 #endif
wclin 3:419ee4c5e10f 161 //printf("<%02x>", *pucByte );
giryan 0:274eb57e1df3 162 return TRUE;
giryan 0:274eb57e1df3 163 }
giryan 0:274eb57e1df3 164
giryan 0:274eb57e1df3 165 /* Create an interrupt handler for the transmit buffer empty interrupt
giryan 0:274eb57e1df3 166 * (or an equivalent) for your target processor. This function should then
giryan 0:274eb57e1df3 167 * call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that
giryan 0:274eb57e1df3 168 * a new character can be sent. The protocol stack will then call
giryan 0:274eb57e1df3 169 * xMBPortSerialPutByte( ) to send the character.
giryan 0:274eb57e1df3 170 */
giryan 0:274eb57e1df3 171 static void prvvUARTTxReadyISR( void )
giryan 0:274eb57e1df3 172 {
giryan 0:274eb57e1df3 173 pxMBFrameCBTransmitterEmpty( );
giryan 0:274eb57e1df3 174 }
giryan 0:274eb57e1df3 175
giryan 0:274eb57e1df3 176 /* Create an interrupt handler for the receive interrupt for your target
giryan 0:274eb57e1df3 177 * processor. This function should then call pxMBFrameCBByteReceived( ). The
giryan 0:274eb57e1df3 178 * protocol stack will then call xMBPortSerialGetByte( ) to retrieve the
giryan 0:274eb57e1df3 179 * character.
giryan 0:274eb57e1df3 180 */
giryan 0:274eb57e1df3 181 static void prvvUARTRxISR( void )
giryan 0:274eb57e1df3 182 {
wclin 2:6ee56c002f64 183 vMBPortTimersDisable();
giryan 0:274eb57e1df3 184 pxMBFrameCBByteReceived( );
giryan 0:274eb57e1df3 185 }
giryan 0:274eb57e1df3 186
giryan 0:274eb57e1df3 187