自从开始了FreeModbus的移植,就会碰到多种多样的问题,目前主要关注几个方面。
1、下载最新的FreeModbus文件,放到工程文件中,网上有很多资料可以参考。
2、修改代码,主要是几个文件portserial.c,porttimer.c,user_mb_app.c,stm32f4xx_it.c,freertos.c。
3、修改内容参考网址http://www.stm32cube.com/question/19中的内容。
4、需要注意的是portserial.c文件中需要将函数中的FALSE,修改为TRUE。
BOOL
xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
{
return FALSE;
}
5、porttimer.c文件中需要将函数中的FALSE,修改为TRUE。
BOOL
xMBPortTimersInit( USHORT usTim1Timerout50us )
{
return FALSE;
}
6、stm32f4xx_it.c文件中,修改中断函数中的内容。
void TIM4_IRQHandler(void)
{
/* USER CODE BEGIN TIM4_IRQn 0 */
prvvTIMERExpiredISR( );
/* USER CODE END TIM4_IRQn 0 */
HAL_TIM_IRQHandler(&htim4);
/* USER CODE BEGIN TIM4_IRQn 1 */
/* USER CODE END TIM4_IRQn 1 */
}
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if(__HAL_UART_GET_IT_SOURCE(&huart1, UART_IT_RXNE)!= RESET)
{
prvvUARTRxISR();
}
if(__HAL_UART_GET_IT_SOURCE(&huart1, UART_IT_TXE)!= RESET)
{
prvvUARTTxReadyISR();
}
HAL_NVIC_ClearPendingIRQ(USART1_IRQn);
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
7、最后在freertos.c的任务中添加Modbus处理函数。
void StartTaskMbSP(void const * argument)
{
/* USER CODE BEGIN StartTaskMbSP */
eMBInit(MB_RTU, 0x01, 1, 115200, MB_PAR_NONE);
eMBEnable();
/* Infinite loop */
for(;;)
{
osDelay(1);
eMBPoll();
}
/* USER CODE END StartTaskMbSP */
}
通过上述修改可实现FreeModbus的程序移植。