大家好, 我是james, 一名hacker. 平时喜欢研究一些可编程的小东西.
第十一期funpack活动的板卡是来自恩智浦(NXP)的LPC55S69. 该板卡搭载的MCU 是LPC55S69JBD100. 核心是150MHz的arm cortex-m33双核处理器, sram为320KB, flash为640KB.
在本期的活动中, 我使用了最简单的方法把MicroPython移植到了LPC55S69EVK这 个板卡上. MicroPython需要MCU至少有16KB的RAM和256KB的FLASH, LPC55S69轻 松达到了这个要求, 所以从资源的角度看, 这个移植应该不会有什么问题. 一种 编程语言其实描述的是对硬件编程的方式方法, 所以对外设也没有具体要求, 可 以灵活裁剪.
对一种编程语言进行移植的过程可以很简单, 也可以非常复杂. 如果这个编程语 言是使用某种汇编语言实现, 那么一定是很复杂的, 因为汇编代码不具备可移植 性, 每一种不通的指令集都会导致最终实现的代码差别很大. 好在现代的编程语 言大都用C语言实现, C语言的一个很重要, 但是也容易因为习以为常被大家忽略 的特性就是可移植性. 只要兼容比如C99标准, 那么在任何具有C语言编译器的机 器上均能够实现任何程序的可移植性, 只要这段程序是用C语言实现, 包括编译 器本身, 都能通过简单的修改在目标机器上编译通过.
MicroPython大部分代码都是C语言描述, 所以比较容易移植, 只要实现它需要的 所有接口函数即可. 困难总是相对的, 实现接口函数相对使用一种汇编语言重新 描述是简单的, 但是相对hello world代码仍然复杂. 为了更简单, 最好使用用 已有的基础接口, 直接完成迁移. 这就需要在MCU上跑RTOS了, 因为RTOS提供了 统一的API, 作为硬件资源的管理者, 为上层应用开发者折叠了操作底层硬件的 复杂细节.
能不能更简单一些? 当然可以, 复用已有的代码即可. 最终我选择了这种最简单 的方法. 在RT-Thread这种RTOS上通过配置安装MicroPython包的方式, 实现了移 植. 但是还是那个道理, 简单是相对的, 理论上讲, 这种方法应该不费吹灰之力, 实际操作过程中还是遇到了各种问题.
按照RT-Thread的安装方法, 使用ENV工具建立一个RT-Thread开发环境. 笔者认 为最简单的环境是使用GCC工具链, 直接apt install arm-none-eabi-gcc即可, 但是还是遇到了一些问题, 最终还需要有一台安装有KEIL IDE的Windows电脑. 因为mdk已经被大佬跑通了, GCC工具链还需要修改调试, 截止笔者写这篇文章的 时间, GCC工具链虽然能够成功编译出application但是烧录到板子上是无法正常 运行的. 于是环境变得稍微复杂, 整体包含两部分:
- 使用Linux/MacOS工作站安装一个基础的RT-Thread环境, 可以运行配置命令 和包管理命令
- 在Windows工作站上安装KEIL IDE, 使用KEIL IDE编译配置好并导出的项目和 源文件
当然如果在Windows上安装RT-Thread环境, 只用Windows也不是不行, 但是仍然 要导出成MDK工程, 在KEIL里面编辑, 还是需要两部分, 而且对于不习惯Windows 开发环境的开发人员可能不是太友好.
点灯是万物的开端. 这个实现"控制IO口", 如上图, 是负逻辑
from machine import Pin
import utime
led = Pin(("rgb_blue_led", 37), Pin.OUT_PP)
while True:
led.value(0)
utime.sleep(1)
led.value(1)
utime.sleep(1)
UART仍然是非常好用的与上位机通信的方法, 这个实现"串口通信"
import utime
from machine import UART
uart = UART(2, 115200)
uart.init(115200, bits=8, parity=None, stop=1)
while True:
uart.write('hello world')
utime.sleep(1)
}
例子:
蓝色LED的LPC引脚名字是P1_4,代入计算函数,pin_lpc_to_mpy(1, 4)得到mpy引脚37。
反过来,37代入pin_mpy_to_lpc,得到LPC引脚[1, 4]。
import math
def pin_lpc_to_mpy(port, pin):
return (port * 32) + pin + 1
def pin_mpy_to_lpc(pin):
return [math.floor((pin - 1) / 32), (pin - 1) % 32]
本期没有硬件变动.
- LPC55S69可玩性非常高, EVK评估板做工扎实, 还集成有RGB LED等常用器件对 于评估LPC55S69系列MCU是非常好用的工具.
- 先有鸡还是先有蛋, 这是个永恒的话题 如果把操作系统比喻成鸡, 编程语言比喻成蛋, 那么到底是先有鸡还是先有蛋? GNU的答案是先有蛋, 因为现在GNU的操作系统仍然没有完成(从实用投产的角 度), 而GCC已经是最重要的软件基础设施之一. 笔者作为一名hacker当然也认 为编程语言的创新非常重要, 但是最终得有系统来支撑.
- 这回遇到了一些坑, 以后有机会再回顾填一下也是有意思的体验.
- RT-Thread的LPC55S69的bsp还有坑要填 虽然大佬们已经填了不少, 但是还有坑可以填, 特别是使用GCC工具链这块儿, 希望后面有人能拿起接力棒, 前人栽树后人乘凉.
https://github.com/picospuch/eetree-funpack-workshop/tree/phase-eleven
感谢硬禾学堂和得捷电子,让我接触到了LPC55S69-EVK开发板,让我能在业余时 间参与更多有趣项目的学习,也感谢群的小伙伴提供很多种实现题目功能的思路, 感谢各大佬的代码铺垫, 要不然没法快速完成这个小任务, 感谢大家一路的折腾 与陪伴,谢谢!