【APM32E030R Micro-EVB开发板评测】DTU的交互
本次带来的是基于APM32E030R Micro-EVB开发板所实现的DTU模块,DTU 是 DataTransfer Unit(数据传输单元) 的缩写,是一种专门用于实现设备与远程服务器之间稳定、可靠数据传输的工业级通信设备。它的核心功能是将现场设备(如传感器、PLC、仪表等)产生的串口数据(如 RS232/RS485/RS422)或以太网数据,通过无线通信网络(如 4G/5G、NB-IoT、LoRa、GPRS 等)或有线网络,传输到云端平台或远程监控中心,同时也能接收来自平台的控制指令,实现 “双向数据交互”。我这次是使用的DTU模式是485转以太网功能。通过原理图可知,APM32E030这款芯片有2个串口,并且都以引出,通过开发板的H2和H3是串口2,串口1引至DAPlink仿真器之中,并且通过虚拟串口实现数据交互,这样就可以省一个串口转换模块,非常不错。利用焊台将板载的H2和H3与GND这些排针都焊接好。焊接好之后,开发板这边的硬件的准备工作基本就OK了。接下来就哪一个DTU模块,本次DTU模块采用的沁恒的CH9120,自己设计的模块方便后续更换MCU。硬件准备工作完成之后,就可以编写代码了,其实极海的MCU开发模式我之前是使用过的,所以本次也比较熟悉也不会因为新开发板而导致开发碰壁。APM32E030可以使用IAR,keil或者是Eclipse,这里由于我的习惯,因此使用keil。使用keil要注意就是提前安装好pack,极海官方已经提前给准备好了,自己下载好并且安装就好了。安装好之后就可以通过官方提供的例程和SDK来进行开发了。 int main(void)
{
BOOL state = TRUE;
/* Init txDataBufUSART2 */
for (int i = 0; i < DATA_BUF_SIZE; i++)
{
txDataBufUSART2 = i;
}
APM_TINY_LEDInit(LED2);
APM_TINY_LEDInit(LED3);
APM_TINY_COMInit(COM1);
APM_TINY_COMInit(COM2);
// USART_EnableInterrupt(TINY_COM1, USART_INT_RXBNEIE);
// USART_EnableInterrupt(TINY_COM2, USART_INT_RXBNEIE);
// for (int i = 0; i < DATA_BUF_SIZE; i++)
// {
// /* Wait until end of transmission */
// while (USART_ReadStatusFlag(USART2, USART_FLAG_TXBE) == RESET);
// USART_TxData(USART2, txDataBufUSART2);
// /* Wait until end of reception */
// while (USART_ReadStatusFlag(USART1, USART_FLAG_RXBNE) == RESET);
// rxDataBufUSART1 = USART_RxData(USART1);
// }
// /* Verify data */
// state = BufferCompare(rxDataBufUSART1, txDataBufUSART2, DATA_BUF_SIZE);
// /* Data is ok then turn off LED2 */
// if (state == TRUE)
// {
// APM_TINY_LEDOn(LED2);
// printf("The DATA IS PASS, LED2 ON\r\n");
// }
while (1)
{
// APM_TINY_LEDToggle(LED3);
// Delay(0x7ffff);
// for (int i = 0; i < DATA_BUF_SIZE; i++)
// {
// /* Wait until end of reception */
// while (USART_ReadStatusFlag(USART1, USART_FLAG_RXBNE) == RESET);
// rxDataBufUSART1 = USART_RxData(USART1);
// /* Wait until end of transmission */
// while (USART_ReadStatusFlag(USART2, USART_FLAG_TXBE) == RESET);
// USART_TxData(USART2, rxDataBufUSART1);
//
// }
}
}
voidUSART_Receive_Isr(void)
{
uint8_t dat;
if (USART_ReadStatusFlag(TINY_COM1, USART_FLAG_RXBNE) == SET)
{
dat = (uint8_t)USART_RxData(TINY_COM1);
USART_TxData(USART2, dat);
// printf("%c", dat);
}
}
voidUSART2_Receive_Isr(void)
{
uint8_t dat;
if (USART_ReadStatusFlag(TINY_COM2, USART_FLAG_RXBNE) == SET)
{
dat = (uint8_t)USART_RxData(TINY_COM2);
USART_TxData(USART1, dat);
// printf("%c", dat);
}
}
本次基于官方例程APM32E030_SDK_V1.0.3\Examples\BOARD_APM32E030_TINY\USART\USART_Polling进行开发,打开工程之后进行基本的程序初始化配置,本次使用的是9600波特率,官方使用的115200,这里需要修改,其他通过熟读代码,发现串口1与串口2均初始化完成,因此不需要自己重复配置了。接下来需要通过网络和小工具来配置CH9120。这里仅需要配置IP,还有网络模式,端口和目的IP,还有串口波特率这些必要参数即可。本次使用的是TCP客户端模式,波特率是9600。 由于DTU是需要收发模式,因此,这里需要开启串口1与串口2的中断接收功能,这里比较有意思,串口的中断配置可以参考USART_Interrupt这里的例程。在apm32e030_int.c中添加好串口中断的函数,在main.h添加好串口中断函数的声明。通过修改main.c中的串口中断接收使能和串口接收中断函数就可以实现DTU的收发模式的功能了。 总结:通过本次的评测,觉得极海的例程还是提供的比较容易上手的,芯片的原理图设计也可以看出,芯片的外围电路设计也是比较简单,不需要过多的思考即可实现一个不错的MCU的基本运行功能。本次使用的DTU芯片也是国产的无代码芯片,仅需要简单的配置就可以实现复杂的功能,极大的帮助了开发者快速实现所想的功能。可见国产芯片正在崛起,也十分贴切国内用户的大部分的需求。最后,希望极海与21ic可以多举办一些活动,更好的与我们这些开发者进行良好且有益的互动~祝国产芯片越来越好。
没有看出来啥啊 VelvetNight 发表于 2025-9-4 23:28
没有看出来啥啊
你想看出来啥啊? 楼主,我想了解一下和DTU交互的协议是啥样子的? VelvetNight 发表于 2025-9-5 10:31
楼主,我想了解一下和DTU交互的协议是啥样子的?
你好,串口透传即可,你串口发什么数据,DTU直接封包好发出去(封包不需要自己做,CH9120内部自己会做好),接收也是一样。采用的是CH9120芯片设计的DTU模块。 DTU模块的485转以太网功能在工业应用中非常实用,楼主的评测提供了一个很好的参考。
谢谢楼主。我去查查CH9120芯片去
页:
[1]