环境搭建
环境搭建就不多说了,按照官方的wiki进行搭建就好了。
移植步骤
说明
micropytho使用gcc进行编译,因此使用官方的lpcopen_2_10_lpcxpresso_ea_devkit_1788开发包。将MCUXpresso IDE也下载安装好,后面有用。
需要的文件
ports目录下有个minimal目录,这是micropython的最小移植,后面都所有操作都在这个移植的基础上进行。
文件 | 说明 |
---|---|
main.c | micropython的入口,初始化啥的都在这了 |
Makefile | 这个不多说,编译就靠这个了 |
mpconfigport.h | micropython的功能配置,根据自己的需要进行更改 |
mphalport.h | 暂时用不到 |
qstrdefsport.h | 暂时用不到 |
stm32f405.ld | GNU链接文件,需要根据芯片和板子进行编写 |
uart_core.c | 这个移植使用串口访问板子,因此这里是串口收发的实现 |
So,
- 拷贝一份minimal,然后重命名为lpc17xx_40xx,里面的stm32f405.ld重命名为lpc1788.ld。
- 然后从lpcopen_2_10_lpcxpresso_ea_devkit_1788中拷贝lpc_chip_177x_8x到这并重命名为Library,将lpc_board_ea_devkit_1788拷贝到boards并重命名为Edeboy(这是我板子的名字)。
- 此外,从lpcopen_2_10_lpcxpresso_ea_devkit_1788\periph_uart_rb\example\src中拷贝cr_startup_lpc177x_8x.c、sysinit.c到下图中位置。
链接文件
.ld文件一般厂家都会提供,但是lpcopen_2_10_lpcxpresso_ea_devkit_1788开发包里并没有这个,因此前面安装的MCUXpresso IDE就派上用场了。导入开发包,并编译一次periph_uart_rb工程,就可以得到了。
配置文件
mpconfigport.h 中作如下改动
#define MICROPY_HW_BOARD_NAME "Edeboy"
#define MICROPY_HW_MCU_NAME "LPC1788"
#ifdef __thumb__
#define MICROPY_MIN_USE_CORTEX_CPU (0) // 本移植不使用micropython官方通用的IRQ和reset框架
#define MICROPY_MIN_USE_LPC1788_MCU (1) // 用于uart_core.c
#endif
串口
#if MICROPY_MIN_USE_LPC1788_MCU
#include "board_api.h"
// Receive single character
int mp_hal_stdin_rx_chr(void)
{
unsigned char c = 0;
#if MICROPY_MIN_USE_STDOUT
int r = read(0, &c, 1);
(void)r;
#elif MICROPY_MIN_USE_LPC1788_MCU
c = Board_UARTGetChar();
#endif
return c;
}
// Send string of given length
void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len)
{
#if MICROPY_MIN_USE_STDOUT
int r = write(1, str, len);
(void)r;
#elif MICROPY_MIN_USE_LPC1788_MCU
while (len--)
{
Board_UARTPutChar(*str++);
}
#endif
}
#endif
Make file
make file只改动这部分,别的都保持原样。
-
INC
是头文件搜索路径,DEFS
是宏定义,这里定义了__CODE_RED
、__USE_LPCOPEN
、DCORE_M3
这三个宏,因为源码里需要打开,不然编译失败。 -
LDFLAGS
将stm32f405.ld改为lpc1788.ld。 - 接下来重点说一下这个
CFLAGS
里边的选项。LPC1788是M3内核,因此-mcpu=cortex-m3
,-march=armv7-m
(指令集),-mfloat-abi=soft
(M3没有硬件浮点),去掉-mfpu
,使用默认值即可。-Werror
表示把警告当错误处理,这个要求太高,去掉。debug选项增加一个宏DEBUG_ENABLE
。 -
SRC_C
为源文件路径。
INC += -I.
INC += -I$(TOP)
INC += -I$(BUILD)
INC += -I./boards/Edeboy/inc
INC += -I./Libraries/inc
ifeq ($(CROSS), 1)
DFU = $(TOP)/tools/dfu.py
PYDFU = $(TOP)/tools/pydfu.py
DEFS = -D__CODE_RED -D__USE_LPCOPEN -DCORE_M3
CFLAGS_CORTEX_M3 = -mthumb -march=armv7-m -mabi=aapcs -mcpu=cortex-m3 -mfloat-abi=soft -fsingle-precision-constant -Wdouble-promotion
CFLAGS = $(INC) -Wall -std=c99 -nostdlib $(CFLAGS_CORTEX_M3) $(COPT) $(DEFS)
LDFLAGS = -nostdlib -T lpc1788.ld -Map=$@.map --cref --gc-sections
else
LD = gcc
CFLAGS = -m32 $(INC) -Wall -Werror -std=c99 $(COPT)
LDFLAGS = -m32 -Wl,-Map=$@.map,--cref -Wl,--gc-sections
endif
# Tune for Debugging or Optimization
ifeq ($(DEBUG), 1)
CFLAGS += -O0 -ggdb -DDEBUG_ENABLE
else
CFLAGS += -Os
CFLAGS += -fdata-sections -ffunction-sections
endif
LIBS =
SRC_C = \
main.c \
uart_core.c \
lib/utils/printf.c \
lib/utils/stdout_helpers.c \
lib/utils/pyexec.c \
lib/libc/string0.c \
lib/mp-readline/readline.c \
$(BUILD)/_frozen_mpy.c \
cr_startup_lpc177x_8x.c \
sysinit.c \
./boards/Edeboy/src/board_sysinit.c \
./boards/Edeboy/src/board.c \
./Libraries/src/sysinit_17xx_40xx.c \
./Libraries/src/clock_17xx_40xx.c \
./Libraries/src/sysctl_17xx_40xx.c \
./Libraries/src/gpio_17xx_40xx.c \
./Libraries/src/iocon_17xx_40xx.c \
./Libraries/src/uart_17xx_40xx.c
编译
- make clean —— 清除编译结果
- make CROSS=1 —— 编译
启动流程
大致说一下启动流程:
- 芯片上电
- 进入复位中断
ResetISR
- 复位中断程序中加载数据到SRAM、初始化一下bss段
- 调用SystemInit()配置中断向量表、系统时钟、片内外设、板载外设
- 调用main()初始化micropython