普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境

服务器   发布日期:2023年05月29日   浏览次数:83

目录

以下介绍PY32F0系列在Ubuntu下如何使用GCC Arm Embedded Toolchain环境进行开发和烧录

项目模板

GitHub 仓库地址: https://github.com/IOsetting/py32f0-template

仓库文件结构

  1. ├── Build # 编译结果
  2. ├── Docs # 数据手册和用户手册
  3. ├── Examples
  4. ├── FreeRTOS # FreeRTOS 例子(暂时为空)
  5. ├── Raw # 非 FreeRTOS 的例子
  6. └── Raw_LL # 非 FreeRTOS 的例子, 基于LL外设库
  7. ├── Libraries
  8. ├── BSP # delay 和 printf 的 BSP 库
  9. ├── BSP_LL # delay 和 printf 的 BSP 库, 基于LL外设库
  10. ├── CMSIS
  11. ├── LDScripts # 链接描述文件
  12. ├── PY32F0xx_HAL_Driver # 外设驱动库
  13. └── PY32F0xx_LL_Driver # LL(low layer)外设驱动库
  14. ├── Makefile # Make设置
  15. ├── Misc
  16. ├── Flash
  17. ├── Devices # 全系列 Flash 算法文件
  18. └── Sources # Flash 算法文件源代码
  19. └── SVD # SVD 文件, 用于 Debug
  20. ├── README.md
  21. ├── rules.mk # 预置的 make 规则
  22. └── User # 用户项目代码目录

环境准备

硬件方面

  • PY32F0 开发板, 或任何基于 PY32F002/003/030 系列的电路
  • 烧录工具(任一)
    • J-Link: J-Link OB programmer
    • PyOCD: DAPLink or J-Link

注: STLink测试不成功, 写入会有Timeout错误

软件方面

环境配置和编译过程

1. 安装 GNU Arm Embedded Toolchain

根据你的PC架构, 从 Arm GNU Toolchain Downloads 下载工具链, 然后解压文件到合适的目录下, 例如

  1. sudo mkdir -p /opt/gcc-arm/
  2. sudo tar xvf arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi.tar.xz -C /opt/gcc-arm/
  3. cd /opt/gcc-arm/
  4. sudo chown -R root:root arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi/

J-Link / J-Trace Downloads 下载并安装 SEGGER JLink

  1. # installation command for .deb
  2. sudo dpkg -i JLink_Linux_V770a_x86_64.deb

默认的安装路径是 /opt/SEGGER

将目录 [项目目录]/Misc/Flash/Devices/Puya 下的所有Flash算法文件(.FLM 文件), 复制到 [JLink 安装目录]/Devices/Puya 目录下

  1. cd py32f0-template
  2. sudo cp -r Misc/Flash/Devices/* /opt/SEGGER/JLink/Devices/

编辑 JLinkDevices.xml

  1. sudo vi /opt/SEGGER/JLink/JLinkDevices.xml

<DataBase> 中增加以下内容

  1. <!-- -->
  2. <!-- Puya -->
  3. <!-- -->
  4. <Device>
  5. <ChipInfo Vendor="Puya" Name="PY32F002AX5" WorkRAMAddr="0x20000000" WorkRAMSize="0xC00" Core="JLINK_CORE_CORTEX_M0"/>
  6. <FlashBankInfo Name="Flash_20K" BaseAddr="0x08000000" MaxSize="0x5000" Loader="Devices/Puya/PY32F0xx_20.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  7. </Device>
  8. <Device>
  9. <ChipInfo Vendor="Puya" Name="PY32F002X5" WorkRAMAddr="0x20000000" WorkRAMSize="0xC00" Core="JLINK_CORE_CORTEX_M0"/>
  10. <FlashBankInfo Name="Flash_20K" BaseAddr="0x08000000" MaxSize="0x5000" Loader="Devices/Puya/PY32F0xx_20.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  11. </Device>
  12. <Device>
  13. <ChipInfo Vendor="Puya" Name="PY32F003X4" WorkRAMAddr="0x20000000" WorkRAMSize="0x800" Core="JLINK_CORE_CORTEX_M0"/>
  14. <FlashBankInfo Name="Flash_16K" BaseAddr="0x08000000" MaxSize="0x4000" Loader="Devices/Puya/PY32F003xx_16.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  15. </Device>
  16. <Device>
  17. <ChipInfo Vendor="Puya" Name="PY32F003X6" WorkRAMAddr="0x20000000" WorkRAMSize="0x1000" Core="JLINK_CORE_CORTEX_M0"/>
  18. <FlashBankInfo Name="Flash_32K" BaseAddr="0x08000000" MaxSize="0x8000" Loader="Devices/Puya/PY32F003xx_32.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  19. </Device>
  20. <Device>
  21. <ChipInfo Vendor="Puya" Name="PY32F003X8" WorkRAMAddr="0x20000000" WorkRAMSize="0x2000" Core="JLINK_CORE_CORTEX_M0"/>
  22. <FlashBankInfo Name="Flash_64K" BaseAddr="0x08000000" MaxSize="0x10000" Loader="Devices/Puya/PY32F003xx_64.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  23. </Device>
  24. <Device>
  25. <ChipInfo Vendor="Puya" Name="PY32F030X4" WorkRAMAddr="0x20000000" WorkRAMSize="0x800" Core="JLINK_CORE_CORTEX_M0"/>
  26. <FlashBankInfo Name="Flash_16K" BaseAddr="0x08000000" MaxSize="0x4000" Loader="Devices/Puya/PY32F030xx_16.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  27. </Device>
  28. <Device>
  29. <ChipInfo Vendor="Puya" Name="PY32F030X6" WorkRAMAddr="0x20000000" WorkRAMSize="0x1000" Core="JLINK_CORE_CORTEX_M0"/>
  30. <FlashBankInfo Name="Flash_32K" BaseAddr="0x08000000" MaxSize="0x8000" Loader="Devices/Puya/PY32F030xx_32.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  31. </Device>
  32. <Device>
  33. <ChipInfo Vendor="Puya" Name="PY32F030X7" WorkRAMAddr="0x20000000" WorkRAMSize="0x1800" Core="JLINK_CORE_CORTEX_M0"/>
  34. <FlashBankInfo Name="Flash_48K" BaseAddr="0x08000000" MaxSize="0xC000" Loader="Devices/Puya/PY32F030xx_48.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  35. </Device>
  36. <Device>
  37. <ChipInfo Vendor="Puya" Name="PY32F030X8" WorkRAMAddr="0x20000000" WorkRAMSize="0x2000" Core="JLINK_CORE_CORTEX_M0"/>
  38. <FlashBankInfo Name="Flash_64K" BaseAddr="0x08000000" MaxSize="0x10000" Loader="Devices/Puya/PY32F030xx_64.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  39. </Device>

2. (选项二): 安装 PyOCD

不要使用Ubuntu自带的apt仓库里的PyOCD, 这个版本 0.13.1+dfsg-1 太低, 无法识别 JLink OB

从Pip安装PyOCD

  1. pip uninstall pyocd

这样会将 PyOCD 安装到这些目录

  1. /home/[user]/.local/bin/pyocd
  2. /home/[user]/.local/bin/pyocd-gdbserver
  3. /home/[user]/.local/lib/python3.10/site-packages/pyocd-0.34.2.dist-info/*
  4. /home/[user]/.local/lib/python3.10/site-packages/pyocd/*

在 Ubuntu 中, .profile 会自动把 .local 加入 PATH, 所以只需要执行一下 source ~/.profile 就能用 pyocd 命令了

3. 导出这个模板仓库

Clone到本地目录下

  1. git clone https://github.com/IOsetting/py32f0-template.git

4. 修改 Makefile

根据自己本地环境, 修改Makefile

  • 确认 ARM_TOOCHAIN 指向的是正确的 arm-none-eabi-gcc 路径
  • 如果使用 J-Link, FLASH_PROGRM 可以用 jlink 或 pyocd
  • 如果使用 DAPLink, 要把 FLASH_PROGRM 设为 pyocd
  • ST-LINK 还不支持. ST-LINK 在 Windows Keil5 下可以使用, 但是在 Ubuntu 烧录 PY32 会报错
  • Puya 提供了两套外设驱动库, HAL lib 和 LL lib, 可以在 USE_LL_LIB 选项中切换, 默认的 User 应用使用的是 HAL 库
  • ENABLE_PRINTF_FLOAT 用于对 printf 中的 %f 增加支持, 会在连接参数中增加 -u _printf_float, 会大大增加最后生成的烧录文件尺寸.
  1. ##### Project #####
  2. PROJECT ?= app
  3. # The path for generated files
  4. BUILD_DIR = Build
  5. ##### Options #####
  6. # 是否使用 LL 库
  7. USE_LL_LIB ?= y
  8. # 是否启用 printf float %f 支持, y:yes, n:no
  9. ENABLE_PRINTF_FLOAT ?= n
  10. # 是否使用 CMSIS DSP 函数, y:yes, n:no
  11. USE_DSP ?= n
  12. # 编程器选择, jlink 或 pyocd
  13. FLASH_PROGRM ?= pyocd
  14. ##### Toolchains #######
  15. ARM_TOOCHAIN ?= /opt/gcc-arm/arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi/bin
  16. # JLinkExe 的路径
  17. JLINKEXE ?= /opt/SEGGER/JLink/JLinkExe
  18. # JLink 设备类型, 选项:
  19. # PY32F002AX5, PY32F002X5,
  20. # PY32F003X4, PY32F003X6, PY32F003X8,
  21. # PY32F030X4, PY32F030X6, PY32F030X7, PY32F030X8
  22. JLINK_DEVICE ?= PY32F003X8
  23. # PyOCD 路径
  24. PYOCD_EXE ?= pyocd
  25. # PyOCD 设备类型, 选项:
  26. # py32f002ax5, py32f002x5,
  27. # py32f003x4, py32f003x6, py32f003x8,
  28. # py32f030x3, py32f030x4, py32f030x6, py32f030x7, py32f030x8
  29. # py32f072xb
  30. PYOCD_DEVICE ?= py32f003x8
  31. ##### Paths ############
  32. # Link descript file: py32f003x6.ld, py32f003x8.ld, py32f030x6.ld, py32f030x8.ld
  33. LDSCRIPT = Libraries/LDScripts/py32f003x8.ld
  34. # Library 编译附加参数:
  35. # PY32F002x5, PY32F002Ax5,
  36. # PY32F003x4, PY32F003x6, PY32F003x8,
  37. # PY32F030x3, PY32F030x4, PY32F030x6, PY32F030x7, PY32F030x8,
  38. # PY32F072xB
  39. LIB_FLAGS = PY32F003x8

5. 编译和烧录

编译执行

  1. # clean source code
  2. make clean
  3. # build
  4. make
  5. # or make with verbose output
  6. V=1 make

写入, 会根据前面的配置调用对应的烧录方法

  1. # flash
  2. make flash

这个例子会展示

  • 驱动 PB5 上的LED灯亮灭, 如果你使用的型号不带 PB5 pin, 需要修改一下 main.c, 换成其它的pin.
  • PA2, PA3 通过UART输出echo字符串, 需要接在 USB2TTL 上通过PC端串口软件查看, Ubuntu下可以用 Screen 或 CuteCOM 等软件

尝试其它例子

Examples 目录下有更多的代码示例, 可以复制替换掉 User 目录下的文件, 然后编译烧录查看运行效果

以上就是普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境的详细内容,更多关于普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境的资料请关注九品源码其它相关文章!