下载lua源代码
先到官网下载lua源代码,http://www.lua.org
然后解压出源码
源码移植
这里基于官方例程中的串口例程进行移植,USART_Printf例程
使用MounRiver Studio该工程,然后添加lua源码
需要将lua.c和luac.c移出工程。在源码目录中找到相应文件,选中文件,鼠标右键点击【参与/排出编译】。
设置头文件路径包含。
在main.c中添加lua相关头文件。
添加lua与单片机硬件支持。
编译后出错,发现无法找到math.h库,需要在设置里面找到Cross Linker,添加m表示添加math.h库
/********************************** (C) COPYRIGHT *******************************
* File Name : main.c
* Author : WCH
* Version : V1.0.0
* Date : 2021/06/06
* Description : Main program body.
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* SPDX-License-Identifier: Apache-2.0
*******************************************************************************/
/*
*@Note
串口打印调试例程:
USART1_Tx(PA9)。
本例程演示使用 USART1(PA9) 作打印调试口输出。
*/
#include "debug.h"
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
/* Global typedef */
/* Global define */
/* Global Variable */
static int lua_led_on(lua_State *L)
{
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
return 1;
}
static int lua_led_off(lua_State *L)
{
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
return 1;
}
static int lua_delay(lua_State *L)
{
uint16_t ms;
ms = (uint16_t)lua_tointeger(L,1);
Delay_Ms(ms);
return 1;
}
static const struct luaL_Reg my_lib_bsp[]=
{
{"delay",lua_delay},
{"led_on",lua_led_on},
{"led_off",lua_led_off},
{NULL,NULL}
};
const char LUA_SCRIPT_GLOBAL[]="\
off = 500 \
on = 500 \
while 1 do \
led_on() \
delay(off)\
led_off() \
delay(on) \
end";
static lua_State *luaL;
void lua_run(void)
{
luaL = luaL_newstate();
luaopen_base(luaL);
luaL_setfuncs(luaL,my_lib_bsp,0);
luaL_dostring(luaL,LUA_SCRIPT_GLOBAL);
while(1);
}
/*********************************************************************
* @fn main
*
* @brief Main program.
*
* @return none
*/
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n",SystemCoreClock);
GPIO_InitTypeDef GPIO_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
lua_run();
while(1)
{
}
}
编译成功,程序在163k左右
烧入到单片机,可以观察到灯闪。