Jearion · 2022年04月20日

【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通信,具有广泛的应用场景。

最后,贴一张测评板照片,感谢“技术社区”给予的宝贵测评机会。
ed8e30023bf99ba22653c58e7dce28b.jpg

推荐阅读
关注数
10691
内容数
187
中国高性能通用微控制器领域的领跑者兆易创新GD系列芯片技术专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息