[STM32N6] stm32移植lua,实现lua字符串控制led闪烁

[复制链接]
 楼主| 过期的塔头 发表于 2025-1-31 01:54 | 显示全部楼层 |阅读模式
stm32移植lua

1、官网下载lua源码包,每个版本的lua源码包都有小幅度的函数更行,下载最新源码包即可。

https://www.lua.org
1970679bbcbc8ed9d.png

 楼主| 过期的塔头 发表于 2025-1-31 01:54 | 显示全部楼层
解压下载的lua源码,将src文件夹复制粘贴到已有的项目工程中,新建分组LUA,并将.c添加到该分组中(去掉lua.c和luac.c)
2163679bbccdd47a3.png
 楼主| 过期的塔头 发表于 2025-1-31 01:54 | 显示全部楼层
添加lua头文件路径
89633679bbce19c752.png
 楼主| 过期的塔头 发表于 2025-1-31 01:55 | 显示全部楼层
编译工程,报错如下


77090679bbcf6d5340.png
 楼主| 过期的塔头 发表于 2025-1-31 01:55 | 显示全部楼层
更改 loslib.c 文件下部分内容

1)将 os_exit(lua_State * L)函数中 if(L) exit(status)注释,并添加 status=status 语句。

64869679bbd0ddbb41.png

 楼主| 过期的塔头 发表于 2025-1-31 01:56 | 显示全部楼层
添加 time(time_t *time)和 system(const char * string)


41272679bbd26be04d.png


 楼主| 过期的塔头 发表于 2025-1-31 01:56 | 显示全部楼层

报错如下图。串口重定义增加,注释掉下面内容

63507679bbd45aaa52.png




2372679bbd4e7c818.png





 楼主| 过期的塔头 发表于 2025-1-31 01:56 | 显示全部楼层
修改堆栈大小(根据开发板相应的增大)
57990679bbd685e60c.png


至此实现lua移植,下面来测试lua库是否移植成功。

 楼主| 过期的塔头 发表于 2025-1-31 01:57 | 显示全部楼层
实现lua字符串控制led闪烁

2.1在main.c中加入头文件

#include "sys.h"
#include "delay.h"
#include "led.h"

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
 楼主| 过期的塔头 发表于 2025-1-31 01:57 | 显示全部楼层
自定义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;
}
 楼主| 过期的塔头 发表于 2025-1-31 01:57 | 显示全部楼层
定义一个luaL_Reg结构数组,把上面的C函数列入,并以字符串的方式命名,

static const struct luaL_Reg mylib[]=
{
        {"led_on",lua_led_on},
        {"led_off",lua_led_off},
    {"delay",lua_delay},
        {NULL,NULL}
};



 楼主| 过期的塔头 发表于 2025-1-31 01:58 | 显示全部楼层
编写脚本字符串,实现led闪烁

const char LUA_SCRIPT_GLOBAL[] ={
    "  \
        off = 500     \
        on = 500       \
        while 1 do \
        led_on() \
        delay(on)   \
        led_off()        \
        delay(off)      \
    end "
};
 楼主| 过期的塔头 发表于 2025-1-31 01:58 | 显示全部楼层
主函数

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)
        {
        }
}

 楼主| 过期的塔头 发表于 2025-1-31 01:58 | 显示全部楼层
将代码下载到开发板中,可以实现led的闪烁。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

999

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部