From d4ee095afa2fff20204e0b6ee435725e31e95841 Mon Sep 17 00:00:00 2001 From: armink Date: Tue, 13 Aug 2013 16:45:39 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E3=80=90=E4=BF=AE=E6=94=B9=E3=80=91F?= =?UTF-8?q?reeModbus=E4=B8=AD=E7=9A=84Port=E6=A1=86=E6=9E=B6=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E6=94=AF=E6=8C=81=E4=B8=BB=E6=9C=BA=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=202=E3=80=81=E3=80=90=E5=A2=9E=E5=8A=A0=E3=80=91FreeModbus?= =?UTF-8?q?=E4=B8=AD=E7=9A=84Port=E5=85=B3=E4=BA=8E=E4=B8=BB=E6=9C=BA?= =?UTF-8?q?=E7=9A=84=E7=A7=BB=E6=A4=8D=E6=96=87=E4=BB=B6=203=E3=80=81?= =?UTF-8?q?=E3=80=90=E5=A2=9E=E5=8A=A0=E3=80=91FreeModbus=E5=88=86?= =?UTF-8?q?=E6=9E=90=E5=9B=BE=E4=B8=AD=E5=85=B3=E4=BA=8EFreeModbus?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9A=84=E6=B5=81=E7=A8=8B=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: armink --- FreeModbus 分析图.vsd | Bin 121856 -> 142848 bytes FreeModbus/port/port.h | 11 +- FreeModbus/port/port_m_event.c | 58 ++++++ FreeModbus/port/port_m_serial.c | 190 ++++++++++++++++++ FreeModbus/port/port_m_timer.c | 108 ++++++++++ .../port/{portevent.c => port_s_event.c} | 6 +- .../port/{portserial.c => port_s_serial.c} | 10 +- .../port/{porttimer.c => port_s_timer.c} | 13 +- 8 files changed, 377 insertions(+), 19 deletions(-) create mode 100644 FreeModbus/port/port_m_event.c create mode 100644 FreeModbus/port/port_m_serial.c create mode 100644 FreeModbus/port/port_m_timer.c rename FreeModbus/port/{portevent.c => port_s_event.c} (87%) rename FreeModbus/port/{portserial.c => port_s_serial.c} (93%) rename FreeModbus/port/{porttimer.c => port_s_timer.c} (87%) diff --git a/FreeModbus 分析图.vsd b/FreeModbus 分析图.vsd index 5548b4b183c69415904347fa2931b07a5a8ade1b..b47afb5364d43b3c91257cf0b5578159673a9703 100644 GIT binary patch delta 39352 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 AF#rGn delta 18420 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 diff --git a/FreeModbus/port/port.h b/FreeModbus/port/port.h index 1196f4d..9838a6c 100644 --- a/FreeModbus/port/port.h +++ b/FreeModbus/port/port.h @@ -16,7 +16,7 @@ * 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: port.h,v 1.1 2007/04/24 23:15:18 wolti Exp $ + * File: $Id: port.h add Master Functions,v 1.1 2013/08/13 15:07:05 Armink Exp $ */ #ifndef _PORT_H @@ -34,8 +34,10 @@ #define PR_END_EXTERN_C } //TODO ʱдB13ţʱȷ -#define RS485_SEND_MODE GPIO_SetBits(GPIOB,GPIO_Pin_13) -#define RS485_RECEIVE_MODE GPIO_ResetBits(GPIOB,GPIO_Pin_13) +#define SLAVER_RS485_SEND_MODE GPIO_SetBits(GPIOB,GPIO_Pin_13) +#define SLAVER_RS485_RECEIVE_MODE GPIO_ResetBits(GPIOB,GPIO_Pin_13) +#define MASTER_RS485_SEND_MODE GPIO_SetBits(GPIOB,GPIO_Pin_13) +#define MASTER_RS485_RECEIVE_MODE GPIO_ResetBits(GPIOB,GPIO_Pin_13) //void USART1_IRQHandler(void); //void TIM3_IRQHandler(void); @@ -45,9 +47,6 @@ void EnterCriticalSection(void); void ExitCriticalSection(void); -void prvvUARTTxReadyISR(void); -void prvvUARTRxISR(void); -void TIMERExpiredISR(void); typedef uint8_t BOOL; diff --git a/FreeModbus/port/port_m_event.c b/FreeModbus/port/port_m_event.c new file mode 100644 index 0000000..c67333f --- /dev/null +++ b/FreeModbus/port/port_m_event.c @@ -0,0 +1,58 @@ +/* + * FreeModbus Libary: STM32 Port + * Copyright (C) 2013 Armink + * + * 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: port_m_event.c add Master Functions,v 1.1 2013/08/13 15:07:05 Armink Exp $ + */ + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbport.h" + +/* ----------------------- Variables ----------------------------------------*/ +static eMBEventType eMasterQueuedEvent; +static BOOL xMasterEventInQueue; + +/* ----------------------- Start implementation -----------------------------*/ +BOOL +xMBPortMasterEventInit( void ) +{ + xMasterEventInQueue = FALSE; + return TRUE; +} + +BOOL +xMBPortMasterEventPost( eMBEventType eEvent ) +{ + xMasterEventInQueue = TRUE; + eMasterQueuedEvent = eEvent; + return TRUE; +} + +BOOL +xMBPortMasterEventGet( eMBEventType * eEvent ) +{ + BOOL xEventHappened = FALSE; + + if( xMasterEventInQueue ) + { + *eEvent = eMasterQueuedEvent; + xMasterEventInQueue = FALSE; + xEventHappened = TRUE; + } + return xEventHappened; +} diff --git a/FreeModbus/port/port_m_serial.c b/FreeModbus/port/port_m_serial.c new file mode 100644 index 0000000..ce7b008 --- /dev/null +++ b/FreeModbus/port/port_m_serial.c @@ -0,0 +1,190 @@ +/* + * FreeModbus Libary: STM32 Port + * Copyright (C) 2013 Armink + * + * 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: port_m_serial.c add Master Functions,v 1.1 2013/08/13 15:07:05 Armink Exp $ + */ + +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbport.h" +/* ----------------------- static functions ---------------------------------*/ +static void prvvUARTTxReadyISR(void); +static void prvvUARTRxISR(void); +/* ----------------------- Start implementation -----------------------------*/ + +void vMBPortMasterSerialEnable(BOOL xRxEnable, BOOL xTxEnable) +{ + if (xRxEnable) + { + MASTER_RS485_RECEIVE_MODE; + USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); + } + else + { + MASTER_RS485_SEND_MODE; + USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); + } + if (xTxEnable) + { + USART_ITConfig(USART2, USART_IT_TXE, ENABLE); + } + else + { + USART_ITConfig(USART2, USART_IT_TXE, DISABLE); + } +} + +void vMBPortMasterClose(void) +{ + USART_ITConfig(USART2, USART_IT_TXE | USART_IT_RXNE, DISABLE); + USART_Cmd(USART2, DISABLE); +} +//Ĭһӻ 2 ʿ ż +BOOL xMBPortMasterSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, + eMBParity eParity) +{ + GPIO_InitTypeDef GPIO_InitStructure; + USART_InitTypeDef USART_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + //======================ʱӳʼ======================================= + RCC_APB2PeriphClockCmd( + RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB1Periph_USART2, + ENABLE); + //======================IOʼ======================================= + //USART2_TX + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; + GPIO_Init(GPIOA, &GPIO_InitStructure); + //USART2_RX + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; + GPIO_Init(GPIOA, &GPIO_InitStructure); + //485ͺͽģʽ +// TODO ʱдB13 ֮ʱ޸ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; + GPIO_Init(GPIOB, &GPIO_InitStructure); + //======================ڳʼ======================================= + USART_InitStructure.USART_BaudRate = ulBaudRate; + //Уģʽ + switch (eParity) + { + case MB_PAR_NONE: //У + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + break; + case MB_PAR_ODD: //У + USART_InitStructure.USART_Parity = USART_Parity_Odd; + USART_InitStructure.USART_WordLength = USART_WordLength_9b; + break; + case MB_PAR_EVEN: //żУ + USART_InitStructure.USART_Parity = USART_Parity_Even; + USART_InitStructure.USART_WordLength = USART_WordLength_9b; + break; + default: + return FALSE; + } + + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_HardwareFlowControl = + USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + if (ucPORT > 1) + return FALSE; + + ENTER_CRITICAL_SECTION(); //ȫж + + USART_Init(USART2, &USART_InitStructure); + USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); + USART_Cmd(USART2, ENABLE); + + //=====================жϳʼ====================================== + //NVICȼΪGroup20-3ռʽȼ0-3Ӧʽȼ + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); + NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + EXIT_CRITICAL_SECTION(); //ȫж + + return TRUE; +} + +BOOL xMBPortMasterSerialPutByte(CHAR ucByte) +{ + USART_SendData(USART2, ucByte); + return TRUE; +} + +BOOL xMBPortMasterSerialGetByte(CHAR * pucByte) +{ + *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. + */ +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. + */ +void prvvUARTRxISR(void) +{ + pxMBFrameCBByteReceived(); +} +/******************************************************************************* + * Function Name : USART2_IRQHandler + * Description : This function handles USART2 global interrupt request. + * Input : None + * Output : None + * Return : None + *******************************************************************************/ +void USART2_IRQHandler(void) +{ + rt_interrupt_enter(); + //ж + if (USART_GetITStatus(USART2, USART_IT_RXNE) == SET) + { + USART_ClearITPendingBit(USART2, USART_IT_RXNE); + prvvUARTRxISR(); + } + //ж + if (USART_GetITStatus(USART2, USART_IT_TXE) == SET) + { + USART_ClearITPendingBit(USART2, USART_IT_TXE); + prvvUARTTxReadyISR(); + } + rt_interrupt_leave(); +} diff --git a/FreeModbus/port/port_m_timer.c b/FreeModbus/port/port_m_timer.c new file mode 100644 index 0000000..036a094 --- /dev/null +++ b/FreeModbus/port/port_m_timer.c @@ -0,0 +1,108 @@ +/* + * FreeModbus Libary: STM32 Port + * Copyright (C) 2013 Armink + * + * 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: port_m_timer.c add Master Functions,v 1.1 2013/08/13 15:07:05 Armink Exp $ + */ + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbport.h" + +/* ----------------------- static functions ---------------------------------*/ +static void prvvTIMERExpiredISR(void); + +/* ----------------------- Start implementation -----------------------------*/ +BOOL xMBPortMasterTimersInit(USHORT usTim1Timerout50us) +{ + + uint16_t PrescalerValue = 0; + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + NVIC_InitTypeDef NVIC_InitStructure; + //====================================ʱӳʼ=========================== + //ʹܶʱ2ʱ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); + //====================================ʱʼ=========================== + //ʱʱ˵ + //HCLKΪ72MHzAPB12ƵΪ36MHz + //TIM2ʱӱƵΪ72MHzӲԶƵ,ﵽ + //TIM2ķƵϵΪ3599ʱƵΪ72 / (1 + Prescaler) = 20KHz,׼Ϊ50us + //TIMֵΪusTim1Timerout50u + + PrescalerValue = (uint16_t) (SystemCoreClock / 20000) - 1; + //ʱ1ʼ + TIM_TimeBaseStructure.TIM_Period = (uint16_t) usTim1Timerout50us; + TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; + TIM_TimeBaseStructure.TIM_ClockDivision = 0; + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); + //Ԥװʹ + TIM_ARRPreloadConfig(TIM2, ENABLE); + //====================================жϳʼ=========================== + //NVICȼΪGroup20-3ռʽȼ0-3Ӧʽȼ + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); + NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + //жϱ־λ + TIM_ClearITPendingBit(TIM2, TIM_IT_Update); + //ʱ3жϹر + TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE); + //ʱ3 + TIM_Cmd(TIM2, DISABLE); + return TRUE; +} + +void vMBPortMasterTimersEnable() +{ + TIM_ClearITPendingBit(TIM2, TIM_IT_Update); + TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); + TIM_SetCounter(TIM2, 0); + TIM_Cmd(TIM2, ENABLE); +} + +void vMBPortMasterTimersDisable() +{ + TIM_ClearITPendingBit(TIM2, TIM_IT_Update); + TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE); + TIM_SetCounter(TIM2, 0); + TIM_Cmd(TIM2, DISABLE); +} + +void prvvTIMERExpiredISR(void) +{ + //TODO ޸ʺ + (void) pxMBPortCBTimerExpired(); +} + +void TIM2_IRQHandler(void) +{ + rt_interrupt_enter(); + if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) + { + + TIM_ClearFlag(TIM2, TIM_FLAG_Update); //жϱ + TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //ʱTIM2жϱ־λ + prvvTIMERExpiredISR(); + } + rt_interrupt_leave(); +} diff --git a/FreeModbus/port/portevent.c b/FreeModbus/port/port_s_event.c similarity index 87% rename from FreeModbus/port/portevent.c rename to FreeModbus/port/port_s_event.c index 3f2fb54..584b4a3 100644 --- a/FreeModbus/port/portevent.c +++ b/FreeModbus/port/port_s_event.c @@ -1,6 +1,6 @@ /* - * FreeModbus Libary: LPC214X Port - * Copyright (C) 2007 Tiago Prado Lone + * FreeModbus Libary: STM32 Port + * Copyright (C) 2013 Armink * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,7 +16,7 @@ * 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: portevent.c,v 1.1 2007/04/24 23:15:18 wolti Exp $ + * File: $Id: port_s_event.c,v 1.1 2013/08/13 15:07:05 Armink Exp $ */ /* ----------------------- Modbus includes ----------------------------------*/ diff --git a/FreeModbus/port/portserial.c b/FreeModbus/port/port_s_serial.c similarity index 93% rename from FreeModbus/port/portserial.c rename to FreeModbus/port/port_s_serial.c index 79e803f..969af1c 100644 --- a/FreeModbus/port/portserial.c +++ b/FreeModbus/port/port_s_serial.c @@ -1,6 +1,6 @@ /* - * FreeModbus Libary: LPC214X Port - * Copyright (C) 2007 Tiago Prado Lone + * FreeModbus Libary: STM32 Port + * Copyright (C) 2013 Armink * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,7 +16,7 @@ * 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: portserial.c,v 1.1 2007/04/24 23:15:18 wolti Exp $ + * File: $Id: port_s_serial.c,v 1.1 2013/08/13 15:07:05 Armink Exp $ */ #include "port.h" @@ -33,12 +33,12 @@ void vMBPortSerialEnable(BOOL xRxEnable, BOOL xTxEnable) { if (xRxEnable) { - RS485_RECEIVE_MODE; + SLAVER_RS485_RECEIVE_MODE; USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); } else { - RS485_SEND_MODE; + SLAVER_RS485_SEND_MODE; USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); } if (xTxEnable) diff --git a/FreeModbus/port/porttimer.c b/FreeModbus/port/port_s_timer.c similarity index 87% rename from FreeModbus/port/porttimer.c rename to FreeModbus/port/port_s_timer.c index c2f17a3..736a471 100644 --- a/FreeModbus/port/porttimer.c +++ b/FreeModbus/port/port_s_timer.c @@ -1,6 +1,6 @@ /* - * FreeModbus Libary: LPC214X Port - * Copyright (C) 2007 Tiago Prado Lone + * FreeModbus Libary: STM32 Port + * Copyright (C) 2013 Armink * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,7 +16,7 @@ * 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: porttimer.c,v 1.1 2007/04/24 23:15:18 wolti Exp $ + * File: $Id: port_s_timer.c,v 1.1 2013/08/13 15:07:05 Armink Exp $ */ /* ----------------------- Platform includes --------------------------------*/ @@ -26,6 +26,9 @@ #include "mb.h" #include "mbport.h" +/* ----------------------- static functions ---------------------------------*/ +static void prvvTIMERExpiredISR(void); + /* ----------------------- Start implementation -----------------------------*/ BOOL xMBPortTimersInit(USHORT usTim1Timerout50us) { @@ -56,8 +59,8 @@ BOOL xMBPortTimersInit(USHORT usTim1Timerout50us) //NVICȼΪGroup20-3ռʽȼ0-3Ӧʽȼ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //жϱ־λ