你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f103zet6在freertos环境使用freemodbus协议栈不通

[复制链接]
Lxfal 提问时间:2023-9-21 23:51 / 未解决

在freertos中移植的freemodbus协议按照协议栈初始化了发送的串口,以及485控制引脚,但是通过modbus poll ping 不通,一直显示timeout, 检查并没有发现那里有明显的错误,希望有移植过freemodbus协议栈的大佬能指点一下,万分感谢

image.png

BOOL
xMBPortTimersInit( USHORT usTim1Timerout50us )
{
    uint16_t PrescalerValue = 0;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

    PrescalerValue = (uint16_t)(SystemCoreClock / 20000) - 1;

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
    TIM_TimeBaseStructure.TIM_Period = usTim1Timerout50us;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
    TIM_ARRPreloadConfig(TIM6, ENABLE);

    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

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

    return TRUE;
}


void
vMBPortTimersEnable(  )
{
    TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
    TIM_SetCounter(TIM6,0x0000);
    TIM_Cmd(TIM6, ENABLE);
}

void
vMBPortTimersDisable(  )
{
    TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
    TIM_ITConfig(TIM6, TIM_IT_Update, DISABLE);
    TIM_SetCounter(TIM6,0x0000);
    TIM_Cmd(TIM6, DISABLE);
}

void TIM6_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
  {
    TIM_ClearITPendingBit(TIM6, TIM_IT_Update);

    prvvTIMERExpiredISR( );
  }
}
BOOL
xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
{
    (void)ucPORT;
    (void)ucDataBits;
    (void)eParity;

    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = ulBaudRate;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    USART_Init(USART2, &USART_InitStructure);
    USART_Cmd(USART2, ENABLE);

    NVIC_InitTypeDef NVIC_InitStructure;

    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);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOC, &GPIO_InitStructure);

    return TRUE;
}

BOOL
xMBPortSerialPutByte( CHAR ucByte )
{
    USART_SendData(USART2, ucByte);

    return TRUE;
}

BOOL
xMBPortSerialGetByte( CHAR * pucByte )
{
    *pucByte = USART_ReceiveData( USART2 );

    return TRUE;
}

void
vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
{
    if( xRxEnable )
    {
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
        RS485_Rx;
    }
    else
    {
        USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
        RS485_Tx;
    }

    if( xTxEnable )
    {
        USART_ITConfig(USART2, USART_IT_TC, ENABLE);
    }
    else
    {
        USART_ITConfig(USART2, USART_IT_TC, DISABLE);
    }
}

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);
    }
}
收藏 评论3 发布时间:2023-9-21 23:51

举报

3个回答
lemonboard 回答时间:2023-9-22 09:19:52

您这个问题挺多的了,

  1. 检查是否打开时基的中断
  2. mbpoll()的任务没有切换。是不是把其它task给饿死了

建议排查步骤:

  1. 检查串口能否正常接收与发送数据
  2. 检查中断能否进入到你的中断函数
  3. 参考别人调通的代码
Lxfal 回答时间:2023-9-22 10:18:19
lemonboard 发表于 2023-9-22 09:19
[md]您这个问题挺多的了,

1. 检查是否打开时基的中断

这个定时器配置我尝试换了几个定时器,也是不行,中断配置是参考别人的代码,应该没什么问题,只是没搞懂的就是ping的时候一直是timeout,串口这块我也检查了几遍,包括中断配置和串口设置。
立码赚 回答时间:2023-11-1 21:04:10

我移植OK了哦,485的

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版