risc-v中文社区

 找回密码
 立即注册
查看: 1299|回复: 0

STM32嵌入LUA开发(控制小灯闪耀)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-6-20 15:00:27 | 显示全部楼层 |阅读模式
本帖来源:https://www.cnblogs.com/yangfengwu/p/9315841.html
今天因为想让STM32完美的处理字符串,所以就想着让STM32嵌入lua,本来想用f103c8t6,但是一编译就提示内存不足......
所以单片机的型号选择的

我下载到了RBT6的芯片上测试的
先说一下最终实现的效果吧,就是用lua语言控制单片机的PC13  每间隔500Ms反转一次
实现功能的部分
static int lua_led_on(lua_State *L)
{
  PCout(13) = 1;
  return 1;
}
static int lua_led_off(lua_State *L)
{
  PCout(13) = 0;
  return 1;
}

static int lua_delay(lua_State *L)
{
  int num;
  num= lua_tointeger(L, 1);
  delay_ms(num);
  return 1;
}


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




const char LUA_SCRIPT_GLOBAL[] ="  \
off = 500     \
on = 500       \
while 1 do \
led_on() \
delay(off)    \
led_off()        \
delay(on)      \
end";

调用部分
while(1)
    {
        lua_State *L;
        L = luaL_newstate(); /* 建立Lua运行环境 */
      luaopen_base(L);
        luaL_setfuncs(L, mylib, 0);
    luaL_dostring(L, LUA_SCRIPT_GLOBAL); /* 运行Lua脚本 */
   
        
        while(1);

其实虽然可以了,但是也没什么感觉....因为可能需要裁剪很多功能才能运行在c8t6上,所以,唉,不开心......
现在说一下移植(赋值粘贴加修改)的步骤
参考文章
首先是下载Lua的源码
下载之后

把这个文件夹拷贝出来


放在自己的工程目录下,位置随意,只要自己知道就行,因为需要手动设置告诉软件一些.h的位置,这个大家应该知道





设置头文件位置






现在可以编译
可能会报这种错误




按理说这样其实可以测试了,,我的源码还修改了个地方
其实就是重定向一些函数
现在看主函数
#include "include.h"
#include "main.h"
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"






const char __stdin_name[150];
const char __stdout_name[150];
const char __stderr_name[150];


typedef int FILEHANDLE;
FILEHANDLE _sys_open(const char *name,int openmode)
{
return 0;
}
int _sys_close(FILEHANDLE fh)
{
    return 0;
}
int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)
{
    return 0;
}
int _sys_read(FILEHANDLE fh, unsigned char*buf, unsigned len, int mode)
{
    return 0;
}
//检查句柄是否为终端
int _sys_istty(FILEHANDLE fh)
{
    return 0;
}
int _sys_seek(FILEHANDLE fh, long pos)
{
    return 0;
}
//刷新句柄关联的缓冲区
int _sys_ensure(FILEHANDLE fh)
{
    return 0;
}
//返回文件当前长度
long _sys_flen(FILEHANDLE fh)
{
    return 0;
}
void _sys_exit(int status)
{
    //while(1);
}
int _sys_tmpnam(char *name, int fileno, unsigned maxlength)
{
    return 0;
}
//将一个字符写入控制台
void _ttywrch(int ch)
{
}
int remove(const char *filename)
{
    return 0;
}
char *_sys_command_string(char *cmd, int len)
{
return NULL;
}


static int lua_led_on(lua_State *L)
{
  PCout(13) = 1;
  return 1;
}
static int lua_led_off(lua_State *L)
{
  PCout(13) = 0;
  return 1;
}

static int lua_delay(lua_State *L)
{
  int num;
  num= lua_tointeger(L, 1);
  delay_ms(num);
  return 1;
}


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




const char LUA_SCRIPT_GLOBAL[] ="  \
off = 500     \
on = 500       \
while 1 do \
led_on() \
delay(off)    \
led_off()        \
delay(on)      \
end";




int main(void)
{
    NVIC_Configuration();
    GpioInit();
   
    Timer2_Config();
    Uart123Init(115200,115200,115200);     //串口初始化
    rbCreate(&Uart1rb,Usart1SendBuff,Usart1SendLen);//创建环形队列--串口1
    rbCreate(&Uart2rb,Usart2SendBuff,Usart2SendLen);//创建环形队列--串口2
    rbCreate(&Uart3rb,Usart3SendBuff,Usart3SendLen);//创建环形队列--串口3
//     FlashReadSaveDataInit();//
   
  //ADC_Config();//配置ADC采集(不使用DMA)
   
    DMA_ADC_Config();//使用DMA采集ADC
    DMA_Config();
   
    AdcGpioConfig();//配置ADC采集引脚
   
//     IWDG_Init(IWDG_Prescaler_256,156*5); //时钟40K,分频数为256,156.25HZ,6.4ms;喂狗最小间隔5S
   
    while(1)
    {
        lua_State *L;
        L = luaL_newstate(); /* 建立Lua运行环境 */
      luaopen_base(L);
        luaL_setfuncs(L, mylib, 0);
    luaL_dostring(L, LUA_SCRIPT_GLOBAL); /* 运行Lua脚本 */
   
        
        while(1);
        
        
//         IWDG_Feed();//喂狗
//     Testing();//测试函数
//         
//         if(Usart1ReadFlage)
//         {
//             Usart1ReadFlage = 0;
//             PutData(&Uart1rb,USART1,Usart1ReadBuff,Usart1ReadCntCopy);
//     }
        
    }
}


/**
* @brief  测试函数
* @param  
* @param  None
* @param  None
* @retval None
* @example
**/
void Testing(void)
{
   
}

其实就执行了lua语言
实质是Lua调用C
源码下载


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-9 01:54 , Processed in 0.015813 second(s), 18 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表