joe 发表于 2022-6-20 15:00:27

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

本帖来源:https://www.cnblogs.com/yangfengwu/p/9315841.html今天因为想让STM32完美的处理字符串,所以就想着让STM32嵌入lua,本来想用f103c8t6,但是一编译就提示内存不足......所以单片机的型号选择的https://images2018.cnblogs.com/blog/819239/201807/819239-20180716055447386-1364855807.png
我下载到了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上,所以,唉,不开心......现在说一下移植(赋值粘贴加修改)的步骤参考文章https://blog.csdn.net/tinyfar/article/details/73727484首先是下载Lua的源码http://www.lua.org/ftp/lua-5.3.5.tar.gzhttps://images2018.cnblogs.com/blog/819239/201807/819239-20180716060423845-495682325.png下载之后
把这个文件夹拷贝出来
https://images2018.cnblogs.com/blog/819239/201807/819239-20180716060651371-1938119915.png
放在自己的工程目录下,位置随意,只要自己知道就行,因为需要手动设置告诉软件一些.h的位置,这个大家应该知道
https://images2018.cnblogs.com/blog/819239/201807/819239-20180716060808621-1106858091.pnghttps://images2018.cnblogs.com/blog/819239/201807/819239-20180716061243054-103026798.png
https://images2018.cnblogs.com/blog/819239/201807/819239-20180716061422254-1477488744.pnghttps://images2018.cnblogs.com/blog/819239/201807/819239-20180716061518030-365089738.png


设置头文件位置https://images2018.cnblogs.com/blog/819239/201807/819239-20180716061549575-1426245581.png



https://images2018.cnblogs.com/blog/819239/201807/819239-20180716061625070-351992700.pnghttps://images2018.cnblogs.com/blog/819239/201807/819239-20180716061705084-8459866.png
https://images2018.cnblogs.com/blog/819239/201807/819239-20180716061854908-1219585605.png
现在可以编译可能会报这种错误https://images2018.cnblogs.com/blog/819239/201807/819239-20180716062126347-1530259669.png


https://images2018.cnblogs.com/blog/819239/201807/819239-20180716062408350-1230772030.pnghttps://images2018.cnblogs.com/blog/819239/201807/819239-20180716062510567-1458909265.png
按理说这样其实可以测试了,,我的源码还修改了个地方https://images2018.cnblogs.com/blog/819239/201807/819239-20180716063345970-861094836.png其实就是重定向一些函数现在看主函数#include "include.h"
#include "main.h"
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"






const char __stdin_name;
const char __stdout_name;
const char __stderr_name;


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
* @paramNone
* @paramNone
* @retval None
* @example
**/
void Testing(void)
{
   
}

其实就执行了lua语言https://images2018.cnblogs.com/blog/819239/201807/819239-20180716063711546-1597395863.png实质是Lua调用C 源码下载链接:https://pan.baidu.com/s/13N0sPkM1f8Egoap0oZCR1g 密码:slxt

页: [1]
查看完整版本: STM32嵌入LUA开发(控制小灯闪耀)