任务说明
此次项目需要在LPC55S69上移植Micropython,并实现GPIO与串口通信。有关LPC55S69开发板的介绍参见:
👉 恩智浦官网;
板卡资源丰富,包含4位SDIO,及速度传感器,音频编解码,MikroElectronika Click拓展槽等。开发环境支持恩智浦的MCUXpresso、或通过生成LPC55S69的SDK在Keil5、IAR等环境中开发。
Micropython移植流程记录有关Micropython的简介及开发流程可参考:
在LPC55S69上移植Micropython,首先需要移植RT-Thread,再在此基础上完成Micropython的移植。RTT参见RT-Thread Github官方,其主要步骤及BSP(板级支持包)资源均配备。此外,需要配置RT-Thread Env。
⚠️ 最好git clone 最新的RTT,以确保更多的bug得到了修复。
配置好Env后,在git clone后RTT所在文件夹下,打开ConEmu,如下图:
输入menuconfig → Hardware Drivers Config → On-chip Peripheral Drivers,使能GPIO,UART0与UART2。
使能后退回上级菜单,在RT-Thread online packages → language packages → Micropython,使能并进入设置,“Heap size"改为20480,版本选用"latest”。
进入Hardware Module使能"machine uart"。
最后在RT-Thread Components,改变"stack size"为8192,最后Exit退出配置。
在ConEmu中,输入"pkgs --update"将将软件包拉取到本地。
返回文件夹,在".\bsp\lpc55sxx\lpc55s69_nxp_evk\packages\micropython-latest"下有一"SConscript"文件,对此进行修改,注意30行改为"-fgnu"。
改完后,在ConEmu中输入"scons --target=mdk5",生成Keil工程。根据Micropython用户手册,对main函数作出修改,在main线程中启动MicroPython,之后即可烧写到板卡中。
结合LPC55S69原理图及所生成Keil工程中drv_pin.c,板卡上LED_BLUE为Pin37,LED_RED为Pin39,LED_GREEN为Pin40,按键为Pin42。注意,板卡LPC-LINK2 占用了UART0,因此使用UART2做串口输入输出。
使用vscode中的RT-Thread MicroPython插件进行mpy开发。
编写了一个简单的用按键控制LED和串口输出的程序,为了LED灯显示清晰没有整些花里胡哨的,该程序实现当KEY按下时,LED_BLUE与LED_RED翻转,串口每1秒打印语句。效果如下:
代码片段
# Example of GPIO and UART by Micropython on LPC55S69-EVK
# Author: 葉SiR
# DateL 2021/10/30
# CSDN: https://blog.csdn.net/weixin_46422143?spm=3001.5343
import utime
from machine import Pin, UART
def main():
led_blue = Pin(("LED_BLUE_PIN", 37), Pin.OUT_PP);
led_red = Pin(("LED_RED_PIN", 39), Pin.OUT_PP);
led_green = Pin(("LED_GREEN_PIN", 40), Pin.OUT_PP);
user_key = Pin(("User_Key", 42), Pin.IN, Pin.PULL_UP);
print_time = 0;
led_blue.value(0);
led_red.value(1);
led_green.value(1);
print("Welcome to RT-Thread MicroPython!");
uart = UART(2, 115200);
uart.init(115200, bits=8, parity=None, stop=1);
while True:
utime.sleep(1);
print_time = print_time + 1;
uart.write('Hello World %d\r\n' % print_time);
if(user_key.value() == 0):
if(led_blue.value() == 1):
led_blue.value(0);
else:
led_blue.value(1);
if(led_red.value() == 1):
led_red.value(0);
else:
led_red.value(1);
if __name__ == '__main__':
main();
总结与心得
此次项目,实现了在LPC55S69上移植Micropython,移植过程中,我也初次了解到RT-Thread和Micropython是什么,是用来干什么的
感谢Thomas大佬提供的帮助,他对RT-Thread贡献的Pull Request帮助很大。感谢Funpack平台让我有机会学习到更多。