• 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

  • 相关阅读:
    上传文件,经过Zuul,中文文件名乱码解决办法
    Spring Cloud Sleuth进阶实战
    如何在IDEA启动多个Spring Boot工程实例
    深入理解Zuul之源码解析
    深入理解Hystrix之文档翻译
    Spring 之BeanFactory(转)
    spring之BeanFactoryAware接口
    ExecutorService线程池
    POJO
    newInstance 与new的区别
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/9315841.html
Copyright © 2020-2023  润新知