硬件介绍:
funpack第十一期活动带来的LPC55S69-EVK开发板是基于恩智浦公司LPC55S69芯片的开发板。该芯片采用Armv8-M架构,性能和高级安全功能达到新水平,包括TrustZone-M和协处理器扩展。LPC55S6x家族利用协处理器扩展型号,大幅提高信号处理效率,采用专有DSP加速器,使计算的时钟周期减少了10倍。还可选择使用第二个Cortex-M33内核,支持灵活地平衡高性能与功率效率。LPC55S69采用安全设计,并由驱动片上系统(SoC)的安全软件提供支持。
任务选择:
这款开发板自带调试器,官网有提供IDE工具,也支持用MDK,使用C语言编程。还支持MicroPython。所以这里我选择了任务4:移植Micropython,并实现串口通信和控制IO口。
实现过程:
简单的实现
从恩智浦的论坛上有帖子“基于LPC55S69的Micropython平台测试版大公开”,从这个帖子中下载了MicroPython的固件,从恩智浦官网下载blhost工具。准备好之后,再找一个USB线插到开发板的Hight spd口上,然后在按下ISP按钮的同时,把USB线插到PC上(不能先插USB线,再按按钮)。然后在PC上打开一个CMD窗口,找到适当的目录,敲入这个命令:
blhost -u 0x1fc9,0x21 -- flash-image LPC55S69_mpy.hex erase
烧写完成后,reset开发板。usb线依然要接到Hight psd口上,然后电脑就可以看见多了两个串口了,Thonny中选择MicroPython(一般 )就可以用Thonny连接开发板进行编程了。这里切记不要插入SD卡,否则烧写会失败。这里存在一个问题,由于不能插入SD卡,python程序脚本就没有办法保存,只能贴上去运行。2、实现串口通信和控制IO口。MicroPython编程还是相对比较简单的。何况论坛还提供了对应固件的说明文档。按照文档很快就完成了通过串口控制板载LED灯的程序。串口是接到debug link口上。还通过pyqt做了个简单的上位机,控制三个LED灯的亮灭。
from lpc55 import Pin,UART
b = Pin('PIO1_4',Pin.OUT, pull=Pin.PULL_UP)
r = Pin('PIO1_6',Pin.OUT, pull=Pin.PULL_UP)
g = Pin('PIO1_7',Pin.OUT, pull=Pin.PULL_UP)
def ledctl(ledctl):
r.value(ledctl[0])
g.value(ledctl[1])
b.value(ledctl[2])
if __name__ == '__main__':
uart = UART(0)
uart.init(baudrate=115200)
while True:
if uart.any()>=3:
buf=uart.read(3)
ledctl(buf)
# print(buf[0],buf[1],buf[2])
任务的功能实现了,可是移植Micropython呢?我陷入了沉思。Micropython也算使用了很多次了,不同的芯片有不同的MicroPython的固件,自己也有思考过,这些固件是从哪里来的,但是从来没有深究过。也从来没有想过自己做一个MicroPython。在群里Thomas大神告诉说:只要支持rtt的芯片都可以跑mpy。于是在大神的指导下,开始了从rt-thread编译MicroPython的操作。
再次实现:
首先RT-Thread是一个开源的物联网操作系统,从官网可以找到最新版源码的github的链接。然后在RT-Thread文档中心可以找到“MicroPython 固件开发指南“按指南调整配置参数。调用menuconfig来进行配置。有几个地方需要注意。调整好 main 线程的栈大小,这里我们将栈大小增加到 8k。MicroPython对系统 RAM 资源有了一定的y要求,按文档分配 20k 内存用于 MicroPython 运行时环境。MicroPython运行需要用到串口,这里还要添加Flexcomm2,设置波特率为115200。
配置完成后运行pkgs --update命令将软件包拉取到本地。这时候要修改编译配置文件,将编译参数换为 -fgnu
最后使用 scons --target=mkd5 重新生成工程,使配置在工程中生效。这样一个MicroPython的keil的工程就创建出来啦!打开keil进行编译,没有意外的话就编译成功了。修改main函数:
#include <rtdevice.h>
#include "drv_pin.h"
/* defined the LED pin: GPIO1_IO4 */
/* GPIO1_4 is Blue LED */
#define LEDB_PIN GET_PINS(1, 4)
int main(void)
{
#if defined(__CC_ARM)
rt_kprintf("using armcc, version: %d\n", __ARMCC_VERSION);
#elif defined(__CLANG_ARM)
rt_kprintf("using armclang, version: %d\n", __ARMCC_VERSION);
#elif defined(__ICCARM__)
rt_kprintf("using iccarm, version: %d\n", __VER__);
#elif defined(__GNUC__)
rt_kprintf("using gcc, version: %d.%d\n", __GNUC__, __GNUC_MINOR__);
#endif
rt_pin_mode(LEDB_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */
while (1)
{
//rt_pin_write(LEDB_PIN, PIN_HIGH); /* Set GPIO output 1 */
//rt_thread_mdelay(500); /* Delay 500mS */
//rt_pin_write(LEDB_PIN, PIN_LOW); /* Set GPIO output 0 */
//rt_thread_mdelay(500); /* Delay 500mS */
extern void mpy_main(const char *filename);
mpy_main(RT_NULL);
}
}
通过usb线连接debug link口烧写到开发板中。重启开发板,使用vscode中的RT-Thread MicroPython插件通过串口就可以连接到开发板了。至此自制的MicroPython就做好了!
测试:
自制的MicroPython只集成了基础的包,编程与论坛的略有不同。查看电路图FC2_USART我使用P24的3、4脚。使用Usb转串口模块与电脑连接。这样就可以使用先前的上位机控制LED灯了。不过不能使用Thonny,只能使用Vscode,原因暂时未知。
import utime as time
from machine import Pin, UART
b = Pin(('led_blue', 37), Pin.OUT_PP)
r = Pin(('led_red', 39), Pin.OUT_PP)
g = Pin(('led_green', 40), Pin.OUT_PP)
uart=UART(2,115200)
def ledctl(ledctl):
r.value(ledctl[0])
g.value(ledctl[1])
b.value(ledctl[2])
if __name__ == '__main__':
while True:
msg=uart.read()
print(msg,len(msg))
time.sleep(0.1)
if len(msg)==3:
ledctl(msg)
心得体会:
编译完MicroPython后非常兴奋,从来没想过自己来尝试编译。瞬间觉着世界又有一扇门被打开了。感谢硬禾学堂提供的活动,感谢坛友的大力指导。