本次带来的是基于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] = 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[i]);
- // /* Wait until end of reception */
- // while (USART_ReadStatusFlag(USART1, USART_FLAG_RXBNE) == RESET);
- // rxDataBufUSART1[i] = 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[i] = USART_RxData(USART1);
- // /* Wait until end of transmission */
- // while (USART_ReadStatusFlag(USART2, USART_FLAG_TXBE) == RESET);
- // USART_TxData(USART2, rxDataBufUSART1[i]);
- //
- // }
- }
- }
- void USART_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);
- }
- }
- void USART2_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可以多举办一些活动,更好的与我们这些开发者进行良好且有益的互动~祝国产芯片越来越好。
|