|
|
摘要
本文旨在验证micropython 下 rmii接口的lan8720芯片使用socket编程能否满足央广音频流的高速采集。
使用的电路板为正点原子阿波罗,主控h743iit6
有需求或疑问,欢迎交流。想实时沟通可进QQ群交流 532183273
Micropython的优缺点
优点:python语法简单,开发快,大量现成的库
缺点:实时性不好,运行速度较慢,可通过优化代码、编写c对接mpy、提前将py文件编译成mpy减少内存占用等方法加快运行速度
章节要点
《正点原子开发板上运行MicroPython与socket网络编程 兼 Micropython开发系列高级教程之 编译篇》
注意:
本文内容实操的话,需要读者具备一定 linux基础知识和技能,如vim命令行编辑器整改删除、命令行修改文件权限、复制文件夹(cp -r /a/b/* /a/c/)、修改makefile使用gcc编译文件等等。还需具备Python编程能力、socket编程经验等。
注意所有需修改的文件均以最高权限操作,否则无法修改和保存。
提出问题 : MicroPython在开发板上的移植与socket编程demo编写,从而估算socket通信性能 ??
为了评估MicroPython下的以太网通信性能是否远超wifi通信,故开此篇对以太网进行验证。当前esp32的wifi在python下还是性能有限,笔者试试以太网在python下的表现。
由于该开发板非官方移植好的board,故此需要找个接近的板子配置进行小改,重新编译生成hex固件。
那么如何为正点原子开发板适配我们需要的micropython固件呢?官方没有啊?有了这个,我们才能跑python,验证socket通信性能。
分析问题
关于MicroPython的背景知识,跳过介绍,非本章重点,有兴趣的可以去了解下。本篇属于笔者的随笔,记录下整个测试过程。
读者只需要知道MicroPython是为mcu这种资源和性能有限的chip专门设计的python语言就行了,考虑到性能,没法和pc端的完全一致,当阉割版的python看就行。
开发板说明:
用老版的【板载lan8720】,可以玩,注意lan8720和8742在软件上,可以认为是同一个东西【二者寄存器完全一致】,虽然封装有点差别,但是大小差不多,直接替换应该OK
MicroPython如何下载、修改与编译呢 ?
1.下载(翻墙 安装git arm-none-eabi-gcc make)
git clone https://github.com/micropython/micropython.git
Cloning into 'micropython'...
remote: Enumerating objects: 130986, done.
remote: Counting objects: 100% (278/278), done.
remote: Compressing objects: 100% (177/177), done.
remote: Total 130986 (delta 159), reused 101 (delta 101), pack-reused 130708 (from 4)
Receiving objects: 100% (130986/130986), 66.04 MiB | 2.23 MiB/s, done.
Resolving deltas: 100% (98358/98358), done.
2-1.需要修改特定开发板文件,则进行改动
2-1.编译(依赖 arm-none-eabi-gcc) --> 参考说明 https://github.com/micropython/micropython/tree/master/ports/stm32
cd micropython
make -C mpy-cross #先构建MicroPython交叉编译器;该编译器将用于将些内置脚本预先编译为字节码 [当然也可用于代码保护,字节码不可读]
cd ports/stm32/
make BOARD=NUCLEO_H743ZI submodules #boards/目录中任何子目录的名称都是有效的板。在调用make时,必须将板名作为 BOARD=的参数传递,所有板都需要在构建之前获取某些子模块,该句话旨在下载那些额外的库,例如lwip等。否则依赖的库没有会编译错误
make -j8 BOARD=NUCLEO_H743ZI #构建板子的固件
LINK build-VCC_GND_H743VI/firmware.elf //这里用的另一个板子的结果...
text data bss dec hex filename
385752 60 289444 675256 a4db8 build-VCC_GND_H743VI/firmware.elf
GEN build-VCC_GND_H743VI/firmware.bin
GEN build-VCC_GND_H743VI/firmware.hex
GEN build-VCC_GND_H743VI/firmware.dfu
生成的固件则在 ports/stm32/build-NUCLEO_H743ZI/ 目录里
如果修改了代码,一定要再重新编译前clean原来的编译产生的各种文件,否则有些修改未生效。
make -j8 BOARD=NUCLEO_H743ZI clean #本质调用的rm -rf 删除了编译产生的文件夹
3.jlink/stlink 下载hex文件
下载完成后,重新上电,Micropython固件会自动枚举u盘,cdc和hid复合设备。在里面修改main.py即可运行自己写的新代码了。
注:如果gcc安装了但是编译时提示未找到,说明环境变量未配置,可临时进行如下处理(重启失效)
export PATH=$PATH:/usr/local/arm-none-eabi/bin
source ~/.bashrc
linux下安装过的 arm-none-eabi-gcc但是系统找不到,如何使用source临时先启用?
>>>whereis arm-none-eabi-gcc
arm-none-eabi-gcc: /opt/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-eabi/bin/arm-none-eabi-gcc
>>>export PATH=/opt/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-eabi/bin
>>>arm-none-eabi-gcc -v
动手解决问题
具备了上面的背景知识后,可以开干正点原子开发板了。
这里,修改最小的就是官方的开发板 NUCLEO_H743ZI了,我们拷贝个副本,专门适配原子开发板。官方用的LAN8742,但是无须担心,经过笔者对手册和封装的研究,你把它们当成同一个芯片就行了,软件完全一致。
1. 创建新文件夹、拷贝副本、提升文件夹为最高权限 【了解shell命令、熟悉通配符】
mkdir TEST_H743
cp -r ./NUCLEO_H743ZI/* ./TEST_H743/
chmod 777 ./TEST_H743/*
2. 修改mpconfigboard.h文件
//-----------------改晶振为25M倍频到480MHz----------------------
// The board has an 25MHz HSE, the following gives 480MHz CPU speed
#define MICROPY_HW_CLK_PLLM (5)
#define MICROPY_HW_CLK_PLLN (192)
#define MICROPY_HW_CLK_PLLP (2)
#define MICROPY_HW_CLK_PLLQ (4)
#define MICROPY_HW_CLK_PLLR (2)
#define MICROPY_HW_CLK_PLLVCI (RCC_PLL1VCIRANGE_1)
#define MICROPY_HW_CLK_PLLVCO (RCC_PLL1VCOWIDE)
#define MICROPY_HW_CLK_PLLFRAC (0)
// The USB clock is set using PLL3
#define MICROPY_HW_CLK_PLL3M (5)
#define MICROPY_HW_CLK_PLL3N (48)
#define MICROPY_HW_CLK_PLL3P (2)
#define MICROPY_HW_CLK_PLL3Q (5)
#define MICROPY_HW_CLK_PLL3R (2)
#define MICROPY_HW_CLK_PLL3VCI (RCC_PLL3VCIRANGE_1)
#define MICROPY_HW_CLK_PLL3VCO (RCC_PLL3VCOWIDE)
#define MICROPY_HW_CLK_PLL3FRAC (0)
//-----------------USER KEY改成默认下拉,就不用跳杜邦线了----------------------
#define MICROPY_HW_USRSW_PULL (GPIO_PULLDOWN)
//-----------------修改ETH RMII接口引脚----------------------
#define MICROPY_HW_ETH_MDC (pin_C1)
#define MICROPY_HW_ETH_MDIO (pin_A2)
#define MICROPY_HW_ETH_RMII_REF_CLK (pin_A1)
#define MICROPY_HW_ETH_RMII_CRS_DV (pin_A7)
#define MICROPY_HW_ETH_RMII_RXD0 (pin_C4)
#define MICROPY_HW_ETH_RMII_RXD1 (pin_C5)
#define MICROPY_HW_ETH_RMII_TX_EN (pin_B11)//(pin_G11)
#define MICROPY_HW_ETH_RMII_TXD0 (pin_G13)
#define MICROPY_HW_ETH_RMII_TXD1 (pin_G14)//(pin_B13)
//ETH_RESET 由于该引脚由PCF8574T IIC扩展芯片控制,且该IIC在PH端口,故暂无法使用,只能找个普通GPIO跳线到该引脚上[chip Pin12-P7]~~~
3. 修改stm32h7xx_hal_conf.h文件
#define HSE_VALUE (25000000) //(8000000)
4. 修改pins.csv文件
D61,PF8 //这就是eth_rst控制引脚,跳线上来的
ETH_MDC,PC1
ETH_MDIO,PA2
ETH_RMII_REF_CLK,PA1
ETH_RMII_CRS_DV,PA7
ETH_RMII_RXD0,PC4
ETH_RMII_RXD1,PC5
ETH_RMII_TX_EN,PB11 //适配开发板的连线
ETH_RMII_TXD0,PG13
ETH_RMII_TXD1,PG14 //适配开发板的连线
测试代码编写
文件修改后,按上面说的编译过程,通过最终的编译命令得到了 适配原子开发板的micropython固件,跳线rst引脚,通过jlink/stlink/daplink 或者 boot0跳线 usb dfu方式 下载到mcu。
make -j8 BOARD=TEST_H743
注意:
跳线完和下载固件ok,插上usb,如果你电脑枚举出了一个u盘,就成功了。如下:
从上图我们可以看到,适配的固件 可用Flash为487KB【放脚本.py和各种资源的】,可用sram 439KB
import gc
'free sram --> {} KB'.format(gc.mem_free()/1024)
关于代码加密提一下,使用mpy-cross将 py转成.mpy字节码文件 就不可读了,这个步骤也简单,有需要的读者多了,笔者可以写写,太简单了就一笔带过了稍微提下。。。
测试代码全部内容如下:【由于不太会用论坛的编辑功能,故此格式随意了】
#-------------------------------------------------------
import network,time,requests,gc
from machine import Pin
#https://www.cnr.cn/gbzb/
#https://github.com/micropython/micropython/issues/6795
rst = Pin('D61', Pin.OUT);rst.value(0)
def rst_():
rst.value(1)
time.sleep_ms(10)
rst.value(0)
time.sleep_ms(20)
rst_()
lan=network.LAN(phy_addr=1, phy_type=network.LAN.PHY_LAN8720)
lan.active(True)
while not lan.isconnected():
time.sleep_ms(50)
print(".", end="")
print("\r\n", lan.ifconfig()) //默认DHCP获取网络参数
url = 'https://ngcdn001.cnr.cn/live/zgzs/13534211.ts' //这是临时测试的链接,照抄就返回错误了,过期了,读者需通过网页抓包最新的链接进行测试,见第一章内容
while True:
start = time.ticks_ms()
rsp=requests.get(url)
buf = rsp.content
print(len(buf),['{:02X}'.format(x) for x in buf[:32]])
rsp.close()
stop = time.ticks_ms()
print('time:%d ms'%(stop-start))
time.sleep(3)
del rsp
del buf
gc.collect()
#-------------------------------------------------------
测试结果揭晓
激动人心的时候到了,我们看看 247.3KB数据的传输时间是 -->
253236 ['47', '40', '00', '10', '00', '00', 'B0', '0D', '00', '01', 'C1', '00', '00', '00', '01', 'F0', '01', '2E', '70', '19', '05', 'FF', 'FF', 'FF', 'FF', 'FF', 'FF', 'FF', 'FF', 'FF', 'FF', 'FF']
time:1169 ms
253236 ['47', '40', '00', '10', '00', '00', 'B0', '0D', '00', '01', 'C1', '00', '00', '00', '01', 'F0', '01', '2E', '70', '19', '05', 'FF', 'FF', 'FF', 'FF', 'FF', 'FF', 'FF', 'FF', 'FF', 'FF', 'FF']
time:1198 ms
nice !!! 稳稳的1.2s左右啊,相当于 250KB/s的网速。esp32s3的实测结果是 最少2s,在2~几十秒之间(看实际网速),大概<=120KB/s, 以太网比较稳定,毕竟有线通信。
目前央广电台只有10s和3s 的ts音频,以太网对于3s的也能稳稳拿捏实现不断流,esp32s3对后者经过实测,不太稳定。
当然,之前说过,读者要是直接拿着c+idf/c+arduino 写esp32s3,当然性能没问题,很多开源的都这么玩。
根据目前结果,笔者更愿意玩玩以太网FM啊。。。当前的进度,本地RDA5807 FM也搞定了,网络+本地共存。见B站视频:https://www.bilibili.com/video/BV1eDmKBbEft/
参考资料
STM32H743开发板移植micropython并外扩32M的SQPI flash和32M的SDRAM
https://blog.csdn.net/liaoze22/article/details/106708796/
LAN8742替换LAN8720 这里告诉读者,你可以把这2个芯片当成同一个
https://blog.csdn.net/Flyaswing/article/details/103706515/
书籍 中国台湾《鸟哥的linux私房菜》,笔者当年学的鸟哥的,上手简单,理解容易。
micropython官方在线文档 --> https://docs.micropython.org/en/latest/
esp32+micropython+spi+w5500 驱动说明 --> https://docs.micropython.org/en/latest/esp32/quickref.html
PCF8574用来通过IIC协议IO扩展 --> https://blog.csdn.net/m0_62995834/article/details/142759097
直播流网站 --> https://worldradiomap.com/cn/xian#google_vignette
micropython开发IDE Thonny,下载链接---> https://thonny.org/
结语
有这个板子的,可以下载笔者提供的固件,玩玩socket编程,这个和PC端直接跑的socket代码,99%兼容,当然,很多库没有,注意修改/添加。
有更好玩法,更有意思的应用需求的,可以交流交流,进一步玩玩它。
这里的micropython版本基于当前时间下载的最新源码,写这个文章的时候,最新的版本也同步出来了。
https://mp.weixin.qq.com/s/t6iHBTtbsTGBxKtATH68bQ
主要更新 ESP32C5、ESP32P4 和 STM32U5 支持、增强测试套件、移植层级
附件为 修改后的适配原子开发板的 原文件,生成的bin/hex/dfu文件【map文件也放里面了,提高了很多micropython信息】。有兴趣的可以玩玩,笔者顺带也通过socket获取了下 天气信息、网络时间对时和百度热搜,挺有意思的网络小应用。
firmware.zip
(5.63 MB, 下载次数: 0)
TEST_H743.zip
(4.14 KB, 下载次数: 0)
|
-
|