轻松实现Lua脚本控制W5500

Uncategorized, 博客, 应用, 物聯網
※已刊登在“无线电”12月刊上轻松实现Lua脚本控制W5500 作者:孔东明,张博 1、引言 Lua是巴西里约热内卢天主教大学里的一个研究小组于1993年基于标准C开发的一个轻量级的嵌入式脚本语言,其设计目的是为了将传统嵌入式程序“编写→编译→链接→运行”的复杂过程简化为“编写→运行”两个环节,从而为嵌入应用程序提供灵活的扩展和定制功能。 Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。一个完整的Lua解释器不过200K,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。 2、项目背景 随着物联网的快速发展,传统的工控、电力、银行机、闸机甚至家电等设备也纷纷加入了连接互联网大军。工厂的车床需要把运行数据实时上传至PLC,水表、电表、燃气表实现了远程抄录,点验钞机可以实时将RMB的冠字号上传至银行数据库,停车场无人值守,家里的窗帘用某猫精灵很方便的进行语音控制…… 小编在一家做网络通信设备的公司上班,领导要求基于现有的串口转以太网模块开发出一款支持用户使用Lua语言进行二次开发的串口转以太网模块,项目工期1个月。小编刚刚毕业4个月,没有多少项目经验,只是在学校玩过ARM M3的开发板,C语言自我感觉勉强及格,以太网技术基本小白一枚,对如何实现用户使用Lua语言“二次开发”更是一窍不通。但是任务时间紧迫,再难也要搞定,要不然没有奖金就要勒紧裤腰带了。 接到项目当晚就去找度娘商讨对策。经过一番搜索,方才大致了解了什么是Lua,什么是脚本语言,为什么客户要二次开发。用户在使用串口转以太网模块时,由于应用场景的不同及嵌入式产品资源的限制,需要灵活的调用模块的各项功能去实现差异化应用,而传统的模块只能实现既定的功能,因此支持二次开发的产品应用范围将大为拓展。而用户二次开发输入的代码肯定是无法执行传统的“编写→编译→链接→运行”这整个过程,脚本语言将这个过程简化为“编写→运行”就可以完美的解决了这个问题,Lua便是一款最佳的嵌入式脚本语言。 原理理顺了,如何落实便成了当务之急,我需要先做一个Demo来模拟整个过程。我找来了之前开发串口转以太网模块用到的以太网开发板W5500EVB,如下图。W5500EVB是由ST的STM32F103RC+W5500网络芯片构成,STM32F103内部256K的Flash足以容纳最大200K的Lua驱动。W5500是一颗以太网接口芯片,它用全硬件逻辑门电路搭建了一整套全硬件TCP/IP协议栈,发送数据时单片机只需将用户数据通过SPI发送至W5500,W5500内部会自动完成数据TCP/IP封包,并发送至网口,接收数据时W5500内部自动完成解包,仅将MCU关心的用户数据提交。W5500内含8路完全独立的硬件Socket,这意味着W5500可以同时运行8个上层应用程序,而且传输速率互不影响,不会像软件协议栈那样线程增加,速度明显降下来。W5500内部还集成了MAC和PHY,符合了接入以太网的所有条件,对于刚刚接触以太网的攻城狮来说,是一款简单易上手的网络接口芯片。 图 1 W5500EVB 我想象中的Demo是这样的:用户通过Web网页向W5500EVB提交一段能让W5500EVB连接到TCP服务器的Lua脚本代码,W5500EVB解析出来这段代码后通过已经运行的Lua虚拟机中的Lua接口函数来解释用户代码要实现的功能,最后 W5500EVB按照用户代码中的参数连接到一个指定的TCP服务器实现以太网数据通信。这个过程可以参考W5500官网提供的HTTP Server和TCP Client的例程。 图 2 实施方案原理图 3、准备工作 (1)安装编译环境:Keil V5.11 (2)硬件:W5500EVB、Jlink调试器 (3)驱动:Lua最新驱动V5.3.2 4、宿主C部分 4.1 加载驱动 驱动包括STM32F103RC的单片机驱动、W5500以太网部分驱动以及Lua驱动。STM32F103RC驱动不必多说,W5500驱动和Lua驱动如下图所示,均可以在对应官网下载到。                                           图 3 W5500驱动                                                                                    图 4 Lua驱动-V5.3.2 4.2 初始化部分 初始化部分包括STM32初始化及W5500初始化,Lua在用的时候才需要初始化。 01 /******* STM32初始化********/ 02 Systick_Init(72); 03 RCC_Configuration(); 04 GPIO_Configuration(); 05 Timer_Configuration(); 06 NVIC_Configuration(); 07 USART1_Init(); 08 at24c16_init(); 09 10 /******* W5500初始化********/ 11 printf("W5500 Config....\r\n"); 12 Reset_W5500();                  //重启W5500 13…
Read More