STM32F407 LUA 串口代码传输进行功能热更新
1.首先放上LUA资源
2.整体思路
创建keil工程--->移植lua--->补充相应功能
3.移植Lua
Step 1
正常解压即可
只有这个文件有用
Step 2
在这个文件夹里搜索,删掉这两个文件(这两个文件在stm32中不使用)
剩余的文件按照添加BSP的流程添加即可
Step 3
打开工程,添加完毕后应该是这个样子的,如果不一样,可以跟着改一下
Step 4
修改Stack_Size 找到这个文件
Stack_Size必须修改 Heap_Size根据情况进行修改
Step 5
创建LUA所需函数
//随便找个文件丢进去就行(建议创建一个特定存放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 ̄)づ╭❤~
标签:LUA,lua,Lua,Step,ENV,串口,STM32F407 From: https://www.cnblogs.com/tiandaowang/p/17821699.html