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

Posted yangfengwu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于1-STM32嵌入LUA开发(控制小灯闪耀)的主要内容,如果未能解决你的问题,请参考以下文章

《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 1]

《32位嵌入式微控制器及应用》复习笔记大全(最终版)

《32位嵌入式微控制器及应用》复习笔记大全(持续更新中)

2-Wi-Fi无线控制器开发例程(开发8266的几种方式比较{AT,Lua,SDK,其它}开发工具安装,开发固件获取,刷固件)

驱动控制开发板上的四个LED小灯

第七章