portserial.c就是和stm32相关的硬件实现接口,初始化那里可以直接调用RS485_Init(9600);
- /*
- * FreeModbus Libary: BARE Port
- * Copyright (C) 2006 Christian Walter <wolti@sil.at>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * File: $Id$
- */
- #include "port.h"
- /* ----------------------- Modbus includes ----------------------------------*/
- #include "mb.h"
- #include "mbport.h"
- #include "rs485.h"
- /* ----------------------- static functions ---------------------------------*/
- static void prvvUARTTxReadyISR( void );
- static void prvvUARTRxISR( void );
- /* ----------------------- Start implementation -----------------------------*/
- void
- vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
- {
- /* If xRXEnable enable serial receive interrupts. If xTxENable enable
- * transmitter empty interrupts.
- */
- if(xRxEnable)
- {
- //使能接收和接收中断
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
- //MAX485操作 低电平为接收模式
- //GPIO_ResetBits(GPIOD,GPIO_Pin_8);
- RS485_TX_EN=0;
- }
- else
- {
- USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
- //MAX485操作 高电平为发送模式
- //GPIO_SetBits(GPIOD,GPIO_Pin_8);
- RS485_TX_EN=1;
- }
- if(xTxEnable)
- {
- //使能发送完成中断
- USART_ITConfig(USART2, USART_IT_TC, ENABLE);
- }
- else
- {
- //禁止发送完成中断
- USART_ITConfig(USART2, USART_IT_TC, DISABLE);
- }
- }
- BOOL
- xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
- {
- RS485_Init(9600); //初始化RS485
- return TRUE;
- //return FALSE;
- }
- BOOL
- xMBPortSerialPutByte( CHAR ucByte )
- {
- /* Put a byte in the UARTs transmit buffer. This function is called
- * by the protocol stack if pxMBFrameCBTransmitterEmpty( ) has been
- * called. */
- //发送数据
- USART_SendData(USART2, ucByte);
- return TRUE;
- }
- BOOL
- xMBPortSerialGetByte( CHAR * pucByte )
- {
- /* Return the byte in the UARTs receive buffer. This function is called
- * by the protocol stack after pxMBFrameCBByteReceived( ) has been called.
- */
- //接收数据
- *pucByte = USART_ReceiveData(USART2);
- return TRUE;
- }
- /* Create an interrupt handler for the transmit buffer empty interrupt
- * (or an equivalent) for your target processor. This function should then
- * call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that
- * a new character can be sent. The protocol stack will then call
- * xMBPortSerialPutByte( ) to send the character.
- */
- static void prvvUARTTxReadyISR( void )
- {
- pxMBFrameCBTransmitterEmpty( );
- }
- /* Create an interrupt handler for the receive interrupt for your target
- * processor. This function should then call pxMBFrameCBByteReceived( ). The
- * protocol stack will then call xMBPortSerialGetByte( ) to retrieve the
- * character.
- */
- static void prvvUARTRxISR( void )
- {
- pxMBFrameCBByteReceived( );
- }
- void USART2_IRQHandler(void)
- {
- if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET)
- {
- prvvUARTRxISR();
- //清除中断标志位
- USART_ClearITPendingBit(USART2, USART_IT_RXNE);
- }
- //发生完成中断
- if(USART_GetITStatus(USART2, USART_IT_TC) == SET)
- {
- prvvUARTTxReadyISR();
- //清除中断标志
- USART_ClearITPendingBit(USART2, USART_IT_TC);
- }
- }
|