今天因为想让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上,所以,唉,不开心......
现在说一下移植(赋值粘贴加修改)的步骤
参考文章
https://blog.csdn.net/tinyfar/article/details/73727484
首先是下载Lua的源码
http://www.lua.org/ftp/lua-5.3.5.tar.gz
下载之后
把这个文件夹拷贝出来
放在自己的工程目录下,位置随意,只要自己知道就行,因为需要手动设置告诉软件一些.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
源码下载
链接:https://pan.baidu.com/s/13N0sPkM1f8Egoap0oZCR1g 密码:slxt