一、stm32移植lua
1、官网下载lua源码包,每个版本的lua源码包都有小幅度的函数更行,下载最新源码包即可。
https://www.lua.org
2、解压下载的lua源码,将src文件夹复制粘贴到已有的项目工程中,新建分组LUA,并将.c添加到该分组中(去掉lua.c和luac.c)
3、添加lua头文件路径
4、编译工程,报错如下
4.1更改 loslib.c 文件下部分内容
1)将 os_exit(lua_State * L)函数中 if(L) exit(status)注释,并添加 status=status 语句。
2)添加 time(time_t *time)和 system(const char * string)
4.2报错如下图。串口重定义增加,注释掉下面内容
5、修改堆栈大小(根据开发板相应的增大)
至此实现lua移植,下面来测试lua库是否移植成功。
二、实现lua字符串控制led闪烁
2.1在main.c中加入头文件
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
2.2自定义C函数
static int lua_led_on(lua_State *L)
{
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET);
return 1;
}
static int lua_led_off(lua_State *L)
{
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
return 1;
}
static int lua_delay(lua_State *L)
{
int num;
num= lua_tointeger(L, 1);
delay_ms(num);
return 1;
}
2.3定义一个luaL_Reg结构数组,把上面的C函数列入,并以字符串的方式命名,
static const struct luaL_Reg mylib[]=
{
{"led_on",lua_led_on},
{"led_off",lua_led_off},
{"delay",lua_delay},
{NULL,NULL}
};
2.4编写脚本字符串,实现led闪烁
const char LUA_SCRIPT_GLOBAL[] ={
" \
off = 500 \
on = 500 \
while 1 do \
led_on() \
delay(on) \
led_off() \
delay(off) \
end "
};
2.5主函数
int main(void)
{
HAL_Init();
LED_Init(); /* LED初始化 */
Stm32_Clock_Init(336,8,2,7);/* 时钟初始化 */
delay_init(168);
lua_State *L; /* 创建Lua编译器*/
L = luaL_newstate(); /* 建立Lua运行环境 */
luaopen_base(L); /* 注册基本函数 */
luaL_setfuncs(L, mylib, 0);
luaL_dostring(L, LUA_SCRIPT_GLOBAL); /* 运行Lua脚本 */
while(1)
{
}
}
将代码下载到开发板中,可以实现led的闪烁。