STM32F407 LUA 串口代码传输进行功能热更新

发布时间 2023-11-09 16:04:36作者: qdyaodao

STM32F407 LUA 串口代码传输进行功能热更新

1.首先放上LUA资源

LUA

img

2.整体思路

创建keil工程--->移植lua--->补充相应功能

3.移植Lua

Step 1

正常解压即可
只有这个文件有用
img


Step 2

在这个文件夹里搜索,删掉这两个文件(这两个文件在stm32中不使用)
img
剩余的文件按照添加BSP的流程添加即可

Step 3

打开工程,添加完毕后应该是这个样子的,如果不一样,可以跟着改一下
img


Step 4

修改Stack_Size 找到这个文件
img
Stack_Size必须修改 Heap_Size根据情况进行修改
img


Step 5

创建LUA所需函数
img

//随便找个文件丢进去就行(建议创建一个特定存放lua函数的c文件)
time_t time(time_t * time){
	return 0;
}

void exit(int status){

}

int system(const char * string){
	return 0;
}



Step 6

编译一下,没报错,就OK了!


4.LUA的基本使用

Step 1 基本LUA函数的创建

 int Lua_LED(lua_State *L)
{
	uint8_t flag = lua_tointeger(L,1);					//	读取传入函数的参数,数字是传入的所有数据的第几个
	if(flag){
		switch (flag)
		{
			case 1:{LED0_TOGGLE();}break;               //LED0_TOGGLE()是写好的c语言函数
			case 2:{LED1_TOGGLE();};break;
			case 3:{LED0_TOGGLE();};break;
		};
			
	}
	return 1;                                           //返回的是个数 不是参数
}



Step 2 关于Lua函数的注册

只有注册过的Lua函数 才能被Lua解释器识别

const struct luaL_Reg mylib[] ={
{"Lua_LED",Lua_LED},//字符串自己随便定义,我的习惯是定义成一样的,不需要加()
{"Lua_delay_ms",Lua_delay_ms},
{"Lua_ADC",Lua_ADC},
{NULL,NULL}
};



Step 3 关于Lua语句

首先要创建一个符合Lua语法规则的字符串
Lua_LED(1)见Step 1


 char  lua_test[] = {
    "print(\"LUA 启动\")\nLua_LED(1)\nLua_delay_ms(1000)\n",

};



Step 4 关于Lua解释器的创建

没啥可说的,都是死的,这是个最简易的,还有一些启动lua库一类的东西,有兴趣和需要可以自己查查

lua_State *LUA_ENV;
int LUA_Start(){
	
	LUA_ENV = luaL_newstate(); 			//	创建Lua编译器
	luaopen_base(LUA_ENV);				//	注册基本函数
	luaL_setfuncs(LUA_ENV, mylib, 0);

	return 0;
};



Step 5 关于Lua的启动

我直接写在主循环里了,有大佬有好的想法可以教一下XD;

    while(1)
    {
			
			usart_code_Get();//我写的串口指令接收

			
			if(receive_code_complete == 1)
			{	
				
					int a = luaL_dostring(LUA_ENV,lua_test); 	//	执行脚本语句
					if(a == 1)
					{
						printf("Lua-Code Running Error!\r\n");
						printf("Error: %s\n", lua_tostring(LUA_ENV, -1));//如果出错了,Lua解释器会把报错压入栈中,直接读取就行
						
						receive_code_complete = 0;
					}
					//
					//receive_code_complete = 0;
			}
			else
			{LED0_TOGGLE();
				delay_ms(3000);}			
		}



Step 6 关于串口传输语句的规则

串口传输语句还是按照lua语法直接传输就可以,但是要注意的是,你自己串口协议和串口助手的不同,很多例程里以\r\n作为串口接收的结束,如果你在串口传输的时候,在串口助手中依靠回车换行,请务必转换成16进制,查看是否为0D 0A或是单独的0A,有条件的最好可以自己写一个上位机.
针对程序更新后,如果重新上电丢失的问题,可以使用flash(毕竟字符串才多大啊



Step 7 总结

Lua的移植并不是很困难,个人来看,Lua移植到嵌入式环境下,能更好的热更新一些功能,但是前提是要封装好自己的BSP部分,这种通过串口(或其他通信方式)的更新程序的方式,还是比较有意思的(づ ̄3 ̄)づ╭❤~