硬汉嵌入式论坛

 找回密码
 立即注册
查看: 113|回复: 0
收起左侧

[STM32H7] 基于STM32H7和ESP32S3的网络收音机开发实战指南[番外篇1]正点原子开发板上运行MicroPython与socket网络编程【1-1】

[复制链接]

7

主题

13

回帖

39

积分

新手上路

积分
39
发表于 3 天前 | 显示全部楼层 |阅读模式
摘要


       本文旨在验证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,但是无须担心,经过笔者对手册和封装的研究,你把它们当成同一个芯片就行了,软件完全一致。
       模版.png
      1. 创建新文件夹、拷贝副本、提升文件夹为最高权限 【了解shell命令、熟悉通配符】
             mkdir TEST_H743
             cp -r ./NUCLEO_H743ZI/* ./TEST_H743/
             chmod 777 ./TEST_H743/*        
               chmod.png
      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)
    改.png 原.png

    //-----------------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
hex.png board.jpg
  注意:
    跳线完和下载固件ok,插上usb,如果你电脑枚举出了一个u盘,就成功了。如下:
udisk.png sram.png
      从上图我们可以看到,适配的固件 可用Flash为487KB【放脚本.py和各种资源的】,可用sram 439KB
import gc
     'free sram --> {} KB'.format(gc.mem_free()/1024)
     关于代码加密提一下,使用mpy-crosspy转成.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
test_s.png test.png
       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 支持、增强测试套件、移植层级
    ver.png


     附件为  修改后的适配原子开发板的 原文件,生成的bin/hex/dfu文件【map文件也放里面了,提高了很多micropython信息】。有兴趣的可以玩玩,笔者顺带也通过socket获取了下 天气信息、网络时间对时和百度热搜,挺有意思的网络小应用。

    firmware.zip (5.63 MB, 下载次数: 0)    TEST_H743.zip (4.14 KB, 下载次数: 0)




help.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-12-14 05:52 , Processed in 0.057007 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表