STM32
直播中

李继明

8年用户 1170经验值
私信 关注
[问答]

stm32f103zet6在freertos环境使用freemodbus协议栈不通怎么解决?

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

BOOLxMBPortTimersInit( 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;}voidvMBPortTimersEnable(  ){    TIM_ClearITPendingBit(TIM6, TIM_IT_Update);    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);    TIM_SetCounter(TIM6,0x0000);    TIM_Cmd(TIM6, ENABLE);}voidvMBPortTimersDisable(  ){    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( );  }}BOOLxMBPortSerialInit( 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;}BOOLxMBPortSerialPutByte( CHAR ucByte ){    USART_SendData(USART2, ucByte);    return TRUE;}BOOLxMBPortSerialGetByte( CHAR * pucByte ){    *pucByte = USART_ReceiveData( USART2 );    return TRUE;}voidvMBPortSerialEnable( 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);    }}


回帖(1)

陈莉

2024-3-12 13:58:39
您这个问题挺多的了,


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


建议排查步骤:


  • 检查串口能否正常接收与发送数据
  • 检查中断能否进入到你的中断函数
  • 参考别人调通的代码
举报

更多回帖

发帖
×
20
完善资料,
赚取积分