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

今天因为想让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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

JAVAWEB开发的微信公众号H5支付

一切需求都是来源于业务需要,前一阵子做了微信扫码支付,的确相对PC用户来说方便了很多。但是如果手机下单,你总不能让用户自己扫自己吧?查看了一下文档,微信还是支持...

1.7K5
来自专栏Felix的技术分享

《一个操作系统的实现》笔记(5)--内核雏形

2024
来自专栏积累沉淀

java事物处理

事物处理 什么是事物:个人认为事物,就是对数据库进行一组操作动作的集合,如果一组处理步骤要么全发生,要么一步也不执行,称这组处理步骤为一个事物。当所...

2679
来自专栏伦少的博客

Spark读取压缩文件

1.9K10
来自专栏坚毅的PHP

[node.js]开放平台接口调用测试

遇到的问题:Node.js JSON parsing error,syntax error unexpect end of input 测试代码 //测试/st...

4346
来自专栏圣杰的专栏

Asp.net mvc 知多少(二)

本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想...

2228
来自专栏闵开慧

大数据面试题整理

JAVA相关 1-1)List 与set 的区别? 老掉牙的问题了,还在这里老生常谈:List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,...

4.6K14
来自专栏祝威廉

Kafka Zero-Copy 使用分析

Kafka 我个人感觉是性能优化的典范。而且使用Scala开发,代码写的也很漂亮的。重点我觉得有四个

2062
来自专栏信安之路

HCTF2017的三个WriteUp

解决方法就是先 undefine 掉函数,再右键选择 Code,最后 Create function 就可以正常反编译了。

1170
来自专栏技术小讲堂

ASP.NET AJAX(1)__Microsoft AJAX LibraryASP.NET AJAX(1)__Microsoft AJAX Library

ASP.NET AJAX(1)__Microsoft AJAX Library Microsoft AJAX Library为我们提供的客户端框架,提供的内容大...

2904

扫码关注云+社区

领取腾讯云代金券