GD32作为国产化ARM中的旗舰,其全系列产品不仅市场占有率高,而且各具特色,广受使用者好评。
笔者在测评这款GD32F310之前,曾经使用过GD32F450,其强大的性能,低廉的价格、使用方便程度和快速的技术支持,都给我留下非常深刻的印象。基于GD32F450芯片,我主导了公司主打产品DSP平台的国产化迁移。实践证明GD32 M4除了在ADC性能,其他完全可以全面取代业内中低端DSP芯片,同时也节省了通信和存储方面的扩展开支。
兆易推出的GD32F310同作为M4下的定位为超值型的产品系列,引起了我的好奇。从产品平台化的角度考虑,GD32F450可以作为中高端产品平台的核心,而低成本平台也需要一款性能强,价格优的芯片,GD32F310即可作为考虑。
基于此,测评一方面考虑其运算性能,另一方面考虑其工控通信功能。
从数据手册可以看到,该款芯片支持FPU,集成DSP指令。
第一步,找相关库,因为之前F450已经有相关的移植,所以直接拿过来,添加库和头文件不再赘述。
第二步,添加相关宏定义。
第三步,编写数学运算测试代码,可以按自己的需求,这边测试基本浮点运算,和正弦余弦之类。
第四步,通过串口看时间消耗,以时钟tikc数为单位,当中涉及的串口外设初始化,和printf重定向也不必多说。
结论,用ARM MATH库时,GD32F310正弦余弦运算消耗与GD32F450基本等同,而基本数学运算消耗大约是GD32F450的两倍,不过这是超值版与超性能版的对比,不具备参考意义,可以将同样测试用于预取代的芯片上再作对比。
在工业场合应用一款芯片,特别是低成本芯片,一般都会考虑用485通信,而大多采用的标准规约都是Modbus,所以,考虑实际应用GD32F310一定需要移植Modbus。
第一步,协议栈的选择,这里为了方便,选择FreeModbus作为移植测试对象,下载源码包,实际工业应用时,大多选择自研协议栈。
第二步,添加相关的源文件和头文件。
第三步,对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通信。
结论,该芯片在移植了FreeModbus协议栈后,能够非常好地支持modbus通信,具有广泛的应用场景。
原作者:Jearion
更多回帖