zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    POJ 1887 Testing the CATCHER
    HDU 3374 String Problem
    HDU 2609 How many
    POJ 1509 Glass Beads
    POJ 1458 Common Subsequence
    POJ 1159 Palindrome
    POJ 1056 IMMEDIATE DECODABILITY
    POJ 3080 Blue Jeans
    POJ 1200 Crazy Search
    软件体系结构的艺术阅读笔记1
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/9315841.html
Copyright © 2011-2022 走看看