ARM技术论坛
直播中

刘杰

7年用户 1311经验值
私信 关注
[经验]

在GD32F310上对浮点DSP运算及Modbus移植进行测评

1. 测评背景

GD32作为国产化ARM中的旗舰,其全系列产品不仅市场占有率高,而且各具特色,广受使用者好评。

笔者在测评这款GD32F310之前,曾经使用过GD32F450,其强大的性能,低廉的价格、使用方便程度和快速的技术支持,都给我留下非常深刻的印象。基于GD32F450芯片,我主导了公司主打产品DSP平台的国产化迁移。实践证明GD32 M4除了在ADC性能,其他完全可以全面取代业内中低端DSP芯片,同时也节省了通信和存储方面的扩展开支。

兆易推出的GD32F310同作为M4下的定位为超值型的产品系列,引起了我的好奇。从产品平台化的角度考虑,GD32F450可以作为中高端产品平台的核心,而低成本平台也需要一款性能强,价格优的芯片,GD32F310即可作为考虑。

基于此,测评一方面考虑其运算性能,另一方面考虑其工控通信功能。

2、浮点DSP运算测评

image.png

从数据手册可以看到,该款芯片支持FPU,集成DSP指令。

第一步,找相关库,因为之前F450已经有相关的移植,所以直接拿过来,添加库和头文件不再赘述。

微信截图_20220413205310.png

第二步,添加相关宏定义。

微信截图_20220413205518.png

第三步,编写数学运算测试代码,可以按自己的需求,这边测试基本浮点运算,和正弦余弦之类。

image.png

第四步,通过串口看时间消耗,以时钟tikc数为单位,当中涉及的串口外设初始化,和printf重定向也不必多说。

image.png

结论,用ARM MATH库时,GD32F310正弦余弦运算消耗与GD32F450基本等同,而基本数学运算消耗大约是GD32F450的两倍,不过这是超值版与超性能版的对比,不具备参考意义,可以将同样测试用于预取代的芯片上再作对比。

3、Modbus通信测评

在工业场合应用一款芯片,特别是低成本芯片,一般都会考虑用485通信,而大多采用的标准规约都是Modbus,所以,考虑实际应用GD32F310一定需要移植Modbus。

第一步,协议栈的选择,这里为了方便,选择FreeModbus作为移植测试对象,下载源码包,实际工业应用时,大多选择自研协议栈。

image.png

第二步,添加相关的源文件和头文件。

image.png

第三步,对portserial.c porttimer.c作驱动接口的修改移植。如:

void
vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
{
    /* If xRXEnable enable serial receive interrupts. If xTxENable enable
     * transmitter empty interrupts.
     */
    //只接收
    if (xRxEnable == TRUE)
    {
        usart_interrupt_enable(comPort, USART_INT_RBNE);
    }
    else
    {
        usart_interrupt_disable(comPort, USART_INT_RBNE);
    }

    //只发送
    if(xTxEnable == TRUE)
    {
        usart_interrupt_enable(comPort, USART_INT_TBE);
    }
    else
    {
        usart_interrupt_disable(comPort, USART_INT_TBE);
    }
}

BOOL
xMBPortSerialPutByte( CHAR ucByte )
{
    /* Put a byte in the UARTs transmit buffer. This function is called
     * by the protocol stack if pxMBFrameCBTransmitterEmpty( ) has been
     * called. */
    usart_data_transmit(comPort, (uint8_t)ucByte);
    // while(RESET == usart_flag_get(USART2, USART_FLAG_TBE));
    return TRUE;
}

BOOL
xMBPortSerialGetByte( CHAR * pucByte )
{
    /* Return the byte in the UARTs receive buffer. This function is called
     * by the protocol stack after pxMBFrameCBByteReceived( ) has been called.
     */
    *pucByte = usart_data_receive(comPort);
    return TRUE;
}

void vMBPortTimerPoll(void)
{
    uint32_t timeCurrentCount = 0;
    uint32_t timeGapCount = 0;

    if (bTimeOutEnable)
    {
        timeCurrentCount = runTimeTicks;
        if (timeCurrentCount < timeLastCount)
        {
            timeGapCount = 0xffffffff - timeLastCount + timeCurrentCount;
        }
        else
        {
            timeGapCount = timeCurrentCount - timeLastCount;
        }

        //进行超时判断
        if (timeGapCount > timeOutCount)
        {
            bTimeOutEnable = FALSE;
            (void)pxMBPortCBTimerExpired();     //关键的超时处理***********
        }
    }
}

第四步,测试使用合适的工具测试Modbus通信。

image.png

结论,该芯片在移植了FreeModbus协议栈后,能够非常好地支持modbus通信,具有广泛的应用场景。

原作者:Jearion

更多回帖

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