Rec 0001
proj.zip
(2.41 MB, 下载次数: 3)
前言
目前市面上有很多嵌入式平台使用MicroPython进行脚本开发,很是方便。实际上还有一门优秀的脚本语言,LUA也适合移植到嵌入式平台中使用。鉴于MicroPython的内容网上已经够多了,所以这里不再移植MicroPython,而是LUA。
参考http://www.lua.org/
过程
准备
从http://www.lua.org/ftp/下载最新版本
解压到我们自己的工程,并添加所有c文件(除了luac.c
)到工程中。
串口
交互操作使用串口,我们使用PA9和PA10对应USART1,接到了板载STLINK的虚拟串口,这样只要接一个USB即可供电,仿真,又可以串口通讯。
串口的操作参见https://bbs.eeworld.com.cn/thread-1228718-1-1.html
https://bbs.eeworld.com.cn/thread-1228720-1-1.html
打印输出时增加回显
int fputc(int c, FILE *stream)
{
/* Your implementation of fputc(). */
uint8_t ch=0;
if((uint8_t)ch == (uint8_t)'\n')
{
ch = '\r';
uart_write(&ch,1);
}
ch = (uint8_t)c;
uart_write(&ch,1);
if((uint8_t)ch == (uint8_t)'\r')
{
ch = '\n';
uart_write(&ch,1);
}
return c;
}
不用fgets所以fgetc不用,而是使用xprintf的xgets
移植修改
Lua.c时一个交互式的解释器,我们可以直接使用
#include "xprintf.h"
436行 fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */改为
xgets(b,LUA_MAXINPUT) != NULL)
因为fgets有点问题,所以使用xprintf的xgets。参见https://bbs.eeworld.com.cn/thread-1228721-1-1.html
int main (int argc, char **argv) {改为
int lua_main (int argc, char **argv) {
在我们的main中调用lua_main即可
实现三个接口函数
volatile uint32_t s_ms_u32 = 0;
time_t time(time_t * t)
{
if(t != 0)
{
*t = s_ms_u32/1000;
}
return s_ms_u32/1000;
}
int system(const char s)
{
return 0;
}
void exit(int p)
{
}
其中s_ms_u32在systick中断中递增
void SysTick_Handler(void)
{
static volatile uint32_t num = 0;
s_ms_u32++;
if(num++ >= 1000)
{
LL_GPIO_TogglePin(GPIOB, 1u<<7);
LL_GPIO_TogglePin(GPIOG, 1u<<2);
LL_GPIO_TogglePin(GPIOC, 1u<<7);
num=0;
}
HAL_IncTick();
}
修改堆栈加大一点
Main中调用 lua_main(3,cmd);即可
测试
编译下载运行
先来个HelloWorld
打印时间
打印日期
其他操作可以参考lua的相关文档。
总结
LUA是MicroPython外一个优秀的脚本语言,可以移植到MCU等资源较小的嵌入式平台。代码用ANSI-C写成,移植很简单,只需要实现几个接口即可。后面我们就可以发挥脚本语言的优势,移植外设部分,就可以实现lua操作硬件了。