打印
[应用相关]

STM32与labview 2019 组成的测控系统

[复制链接]
楼主: 東南博士
手机看帖
扫描二维码
随时随地手机跟帖
21
東南博士|  楼主 | 2019-9-4 16:35 | 只看该作者 回帖奖励 |倒序浏览

使用特权

评论回复
22
東南博士|  楼主 | 2019-9-4 16:35 | 只看该作者

使用特权

评论回复
23
東南博士|  楼主 | 2019-9-4 16:36 | 只看该作者

使用特权

评论回复
24
東南博士|  楼主 | 2019-9-4 16:36 | 只看该作者

使用特权

评论回复
25
東南博士|  楼主 | 2019-9-4 16:37 | 只看该作者
下载freemodbus源码如上图所示,添加进去到你的工程里面!

使用特权

评论回复
26
東南博士|  楼主 | 2019-9-4 16:37 | 只看该作者
// 串口1-USART1

#define  DEBUG_USARTx                   USART1
#define  DEBUG_USART_CLK                RCC_APB2Periph_USART1
#define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200

// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd

#define  DEBUG_USART_TX_GPIO_PORT         GPIOA
#define  DEBUG_USART_TX_GPIO_PIN          GPIO_Pin_9
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10

#define  DEBUG_USART_IRQ                USART1_IRQn
#define  DEBUG_USART_IRQHandler         USART1_IRQHandler


#define  MODBUS_USARTx                   USART1
#define  MODBUS_USART_CLK                RCC_APB2Periph_USART1
#define  MODBUS_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  MODBUS_USART_BAUDRATE           115200

// USART GPIO 引脚宏定义
#define  MODBUS_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  MODBUS_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd

#define  MODBUS_USART_TX_GPIO_PORT         GPIOA
#define  MODBUS_USART_TX_GPIO_PIN          GPIO_Pin_9
#define  MODBUS_USART_RX_GPIO_PORT       GPIOA
#define  MODBUS_USART_RX_GPIO_PIN        GPIO_Pin_10

#define  MODBUS_USART_IRQ                USART1_IRQn
#define  MODBUS_USART_IRQHandler         USART1_IRQHandler

使用特权

评论回复
27
東南博士|  楼主 | 2019-9-4 16:37 | 只看该作者
在这里使用串口1 ----PA9 -PA10

使用特权

评论回复
28
東南博士|  楼主 | 2019-9-4 16:38 | 只看该作者
改动后三个文件!

使用特权

评论回复
29
東南博士|  楼主 | 2019-9-4 16:38 | 只看该作者
BOOL
xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef  NVIC_InitStructure;

    (void)ucPORT;  //不修改串口号
    (void)ucDataBits;  //不修改数据位长度
    (void)eParity;  //不修改检验格式

    // 打开串口GPIO的时钟
    MODBUS_USART_GPIO_APBxClkCmd(MODBUS_USART_GPIO_CLK, ENABLE);
    // 打开串口外设的时钟
    MODBUS_USART_APBxClkCmd(MODBUS_USART_CLK, ENABLE);

    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = MODBUS_USART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(MODBUS_USART_TX_GPIO_PORT, &GPIO_InitStructure);

    // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = MODBUS_USART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(MODBUS_USART_RX_GPIO_PORT, &GPIO_InitStructure);

    // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = ulBaudRate;
    // 配置 针数据字长
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    // 配置停止位
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    // 配置校验位
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    // 配置硬件流控制
    USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
    // 配置工作模式,收发一起
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    // 完成串口的初始化配置
    USART_Init(MODBUS_USARTx, &USART_InitStructure);

    // 串口中断优先级配置
    /* 嵌套向量中断控制器组选择 */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    /* 配置USART为中断源 */
    NVIC_InitStructure.NVIC_IRQChannel = MODBUS_USART_IRQ;
    /* 抢断优先级*/
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    /* 子优先级 */
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    /* 使能中断 */
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    /* 初始化配置NVIC */
    NVIC_Init(&NVIC_InitStructure);


    // 使能串口
    USART_Cmd(MODBUS_USARTx, ENABLE);


    return TRUE;
}

使用特权

评论回复
30
東南博士|  楼主 | 2019-9-4 16:38 | 只看该作者
串口的一个定义!这里,网上的移植方法与教程也是多的很!随便看一看,百度一下,就可以找到!

使用特权

评论回复
31
東南博士|  楼主 | 2019-9-4 16:39 | 只看该作者
/**
  *****************************************************************************
  * @name   : 串口中断服务函数
  *
  * @brief  : none
  *
  * @Input  : none
  *
  * @output : none
  *
  * @return : none
  *****************************************************************************
**/
void  MODBUS_USART_IRQHandler(void)
{
    if (USART_GetITStatus(MODBUS_USARTx, USART_IT_RXNE) == SET)  //接收中断
    {
        prvvUARTRxISR();
        USART_ClearITPendingBit(MODBUS_USARTx, USART_IT_RXNE);
    }

    if (USART_GetITStatus(MODBUS_USARTx, USART_IT_TXE) == SET)  //发送中断
    {
        prvvUARTTxReadyISR();
        USART_ClearITPendingBit(MODBUS_USARTx, USART_IT_TXE);
    }
}

使用特权

评论回复
32
東南博士|  楼主 | 2019-9-4 16:39 | 只看该作者
串口的中断函数,写到这里,改成上面的模式!

使用特权

评论回复
33
東南博士|  楼主 | 2019-9-4 16:39 | 只看该作者
修改完串口,修改一下定时器!

使用特权

评论回复
34
東南博士|  楼主 | 2019-9-4 16:39 | 只看该作者
/* ----------------------- Start implementation -----------------------------*/
BOOL
xMBPortTimersInit( USHORT usTim1Timerout50us )
{
//    return FALSE;

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    NVIC_InitTypeDef        NVIC_InitStructure;

    uint16_t PrescalerValue = 0;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    //
    //HCLK为72MHz
    //时基频率72 / (1 + Prescaler) = 20KHz
    //
    PrescalerValue = (uint16_t)((SystemCoreClock / 20000) - 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_InitStructure.NVIC_IRQChannel                   = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
    TIM_Cmd(TIM2, DISABLE);

    return TRUE;
}

使用特权

评论回复
35
東南博士|  楼主 | 2019-9-4 16:40 | 只看该作者
void
vMBPortTimersEnable(  )
{
    /* Enable the timer with the timeout passed to xMBPortTimersInit( ) */

    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    TIM_SetCounter(TIM2, 0x00000000);
    TIM_Cmd(TIM2, ENABLE);
}

void
vMBPortTimersDisable(  )
{
    /* Disable any pending timers. */

    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
    TIM_SetCounter(TIM2, 0x00000000);
    TIM_Cmd(TIM2, DISABLE);
}

使用特权

评论回复
36
東南博士|  楼主 | 2019-9-4 16:40 | 只看该作者
void TIM2_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        prvvTIMERExpiredISR();
    }
}

使用特权

评论回复
37
東南博士|  楼主 | 2019-9-4 16:40 | 只看该作者
定时器修改完毕!

使用特权

评论回复
38
東南博士|  楼主 | 2019-9-4 16:40 | 只看该作者
/* ----------------------- Variables ---------------------------------*/
//Slave mode use these variables
//开关输入状态
USHORT   usSDiscInStart                             = S_DISCRETE_INPUT_START;
UCHAR    ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8];
//线圈状态
USHORT   usSCoilStart                               = S_COIL_START;
UCHAR    ucSCoilBuf[S_COIL_NCOILS/8]                ;
//输入寄存器内容
USHORT   usSRegInStart                              = S_REG_INPUT_START;
USHORT   usSRegInBuf[S_REG_INPUT_NREGS]             ;
//保持寄存器内容
USHORT   usSRegHoldStart                            = S_REG_HOLDING_START;
USHORT   usSRegHoldBuf[S_REG_HOLDING_NREGS]         ;

使用特权

评论回复
39
東南博士|  楼主 | 2019-9-4 16:40 | 只看该作者
修改 mb_app.c的内容!

使用特权

评论回复
40
東南博士|  楼主 | 2019-9-4 16:40 | 只看该作者
/* -----------------------Slave Defines -------------------------------------*/
#define S_DISCRETE_INPUT_START        1
#define S_DISCRETE_INPUT_NDISCRETES   255
#define S_COIL_START                  1
#define S_COIL_NCOILS                 255
#define S_REG_INPUT_START             1
#define S_REG_INPUT_NREGS             255
#define S_REG_HOLDING_START           1
#define S_REG_HOLDING_NREGS           255

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则