普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境
目录
以下介绍PY32F0系列在Ubuntu下如何使用GCC Arm Embedded Toolchain环境进行开发和烧录
项目模板
GitHub 仓库地址: https://github.com/IOsetting/py32f0-template
仓库文件结构
├── Build                       # 编译结果
├── Docs                        # 数据手册和用户手册
├── Examples
│   ├── FreeRTOS                # FreeRTOS 例子(暂时为空)
│   ├── Raw                     # 非 FreeRTOS 的例子
│   └── Raw_LL                  # 非 FreeRTOS 的例子, 基于LL外设库
├── Libraries
│   ├── BSP                     # delay 和 printf 的 BSP 库
│   ├── BSP_LL                  # delay 和 printf 的 BSP 库, 基于LL外设库
│   ├── CMSIS
│   ├── LDScripts               # 链接描述文件
│   ├── PY32F0xx_HAL_Driver     # 外设驱动库
│   └── PY32F0xx_LL_Driver      # LL(low layer)外设驱动库
├── Makefile                    # Make设置
├── Misc
│   ├── Flash
│   │   ├── Devices             # 全系列 Flash 算法文件
│   │   └── Sources             # Flash 算法文件源代码
│   └── SVD                     # SVD 文件, 用于 Debug
├── README.md
├── rules.mk                    # 预置的 make 规则
└── User                        # 用户项目代码目录
环境准备
硬件方面
- PY32F0 开发板, 或任何基于 PY32F002/003/030 系列的电路
 - 烧录工具(任一)
- J-Link: J-Link OB programmer
 - PyOCD: DAPLink or J-Link
 
 
注: STLink测试不成功, 写入会有Timeout错误
软件方面
- SEGGER J-Link 软件 https://www.segger.com/downloads/jlink/
 - 或者 PyOCD https://pyocd.io/
 - GNU Arm Embedded Toolchain
 
环境配置和编译过程
1. 安装 GNU Arm Embedded Toolchain
根据你的PC架构, 从 Arm GNU Toolchain Downloads 下载工具链, 然后解压文件到合适的目录下, 例如
sudo mkdir -p /opt/gcc-arm/
sudo tar xvf arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi.tar.xz -C /opt/gcc-arm/
cd /opt/gcc-arm/
sudo chown -R root:root arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi/
2. (选项一) 安装 SEGGER J-Link
从 J-Link / J-Trace Downloads 下载并安装 SEGGER JLink
# installation command for .deb
sudo dpkg -i JLink_Linux_V770a_x86_64.deb
默认的安装路径是 /opt/SEGGER
将目录 [项目目录]/Misc/Flash/Devices/Puya 下的所有Flash算法文件(.FLM 文件), 复制到 [JLink 安装目录]/Devices/Puya 目录下
cd py32f0-template
sudo cp -r Misc/Flash/Devices/* /opt/SEGGER/JLink/Devices/
编辑 JLinkDevices.xml
sudo vi /opt/SEGGER/JLink/JLinkDevices.xml
在 <DataBase> 中增加以下内容
  <!--                 -->
  <!-- Puya            -->
  <!--                 -->
  <Device>
    <ChipInfo Vendor="Puya" Name="PY32F002AX5"  WorkRAMAddr="0x20000000" WorkRAMSize="0xC00" Core="JLINK_CORE_CORTEX_M0"/>
    <FlashBankInfo Name="Flash_20K" BaseAddr="0x08000000" MaxSize="0x5000" Loader="Devices/Puya/PY32F0xx_20.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  </Device>
  <Device>
    <ChipInfo Vendor="Puya" Name="PY32F002X5"  WorkRAMAddr="0x20000000" WorkRAMSize="0xC00" Core="JLINK_CORE_CORTEX_M0"/>
    <FlashBankInfo Name="Flash_20K" BaseAddr="0x08000000" MaxSize="0x5000" Loader="Devices/Puya/PY32F0xx_20.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  </Device>
  <Device>
    <ChipInfo Vendor="Puya" Name="PY32F003X4"  WorkRAMAddr="0x20000000" WorkRAMSize="0x800" Core="JLINK_CORE_CORTEX_M0"/>
    <FlashBankInfo Name="Flash_16K" BaseAddr="0x08000000" MaxSize="0x4000" Loader="Devices/Puya/PY32F003xx_16.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  </Device>
  <Device>
    <ChipInfo Vendor="Puya" Name="PY32F003X6"  WorkRAMAddr="0x20000000" WorkRAMSize="0x1000" Core="JLINK_CORE_CORTEX_M0"/>
    <FlashBankInfo Name="Flash_32K" BaseAddr="0x08000000" MaxSize="0x8000" Loader="Devices/Puya/PY32F003xx_32.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  </Device>
  <Device>
    <ChipInfo Vendor="Puya" Name="PY32F003X8"  WorkRAMAddr="0x20000000" WorkRAMSize="0x2000" Core="JLINK_CORE_CORTEX_M0"/>
    <FlashBankInfo Name="Flash_64K" BaseAddr="0x08000000" MaxSize="0x10000" Loader="Devices/Puya/PY32F003xx_64.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  </Device>
    <Device>
    <ChipInfo Vendor="Puya" Name="PY32F030X4"  WorkRAMAddr="0x20000000" WorkRAMSize="0x800" Core="JLINK_CORE_CORTEX_M0"/>
    <FlashBankInfo Name="Flash_16K" BaseAddr="0x08000000" MaxSize="0x4000" Loader="Devices/Puya/PY32F030xx_16.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  </Device>
  <Device>
    <ChipInfo Vendor="Puya" Name="PY32F030X6"  WorkRAMAddr="0x20000000" WorkRAMSize="0x1000" Core="JLINK_CORE_CORTEX_M0"/>
    <FlashBankInfo Name="Flash_32K" BaseAddr="0x08000000" MaxSize="0x8000" Loader="Devices/Puya/PY32F030xx_32.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  </Device>
  <Device>
    <ChipInfo Vendor="Puya" Name="PY32F030X7"  WorkRAMAddr="0x20000000" WorkRAMSize="0x1800" Core="JLINK_CORE_CORTEX_M0"/>
    <FlashBankInfo Name="Flash_48K" BaseAddr="0x08000000" MaxSize="0xC000" Loader="Devices/Puya/PY32F030xx_48.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  </Device>
  <Device>
    <ChipInfo Vendor="Puya" Name="PY32F030X8"  WorkRAMAddr="0x20000000" WorkRAMSize="0x2000" Core="JLINK_CORE_CORTEX_M0"/>
    <FlashBankInfo Name="Flash_64K" BaseAddr="0x08000000" MaxSize="0x10000" Loader="Devices/Puya/PY32F030xx_64.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  </Device>
2. (选项二): 安装 PyOCD
不要使用Ubuntu自带的apt仓库里的PyOCD, 这个版本 0.13.1+dfsg-1 太低, 无法识别 JLink OB
从Pip安装PyOCD
pip uninstall pyocd
这样会将 PyOCD 安装到这些目录
/home/[user]/.local/bin/pyocd
/home/[user]/.local/bin/pyocd-gdbserver
/home/[user]/.local/lib/python3.10/site-packages/pyocd-0.34.2.dist-info/*
/home/[user]/.local/lib/python3.10/site-packages/pyocd/*
在 Ubuntu 中, .profile 会自动把 .local 加入 PATH, 所以只需要执行一下 source ~/.profile 就能用 pyocd 命令了
3. 导出这个模板仓库
Clone到本地目录下
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, 会大大增加最后生成的烧录文件尺寸. 
##### Project #####
PROJECT			?= app
# The path for generated files
BUILD_DIR		= Build
##### Options #####
# 是否使用 LL 库
USE_LL_LIB ?= y
# 是否启用 printf float %f 支持, y:yes, n:no
ENABLE_PRINTF_FLOAT	?= n
# 是否使用 CMSIS DSP 函数, y:yes, n:no
USE_DSP			?= n
# 编程器选择, jlink 或 pyocd
FLASH_PROGRM	?= pyocd
##### Toolchains #######
ARM_TOOCHAIN	?= /opt/gcc-arm/arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi/bin
# JLinkExe 的路径
JLINKEXE		?= /opt/SEGGER/JLink/JLinkExe
# JLink 设备类型, 选项:
#   PY32F002AX5, PY32F002X5,
#   PY32F003X4, PY32F003X6, PY32F003X8,
#   PY32F030X4, PY32F030X6, PY32F030X7, PY32F030X8
JLINK_DEVICE	?= PY32F003X8
# PyOCD 路径
PYOCD_EXE		?= pyocd
# PyOCD 设备类型, 选项:
# 	py32f002ax5, py32f002x5,
#   py32f003x4,  py32f003x6, py32f003x8,
#   py32f030x3,  py32f030x4, py32f030x6, py32f030x7, py32f030x8
#   py32f072xb
PYOCD_DEVICE	?= py32f003x8
##### Paths ############
# Link descript file: py32f003x6.ld, py32f003x8.ld, py32f030x6.ld, py32f030x8.ld
LDSCRIPT		= Libraries/LDScripts/py32f003x8.ld
# Library 编译附加参数:
#   PY32F002x5, PY32F002Ax5,
#   PY32F003x4, PY32F003x6, PY32F003x8,
#   PY32F030x3, PY32F030x4, PY32F030x6, PY32F030x7, PY32F030x8,
#   PY32F072xB
LIB_FLAGS       = PY32F003x8
5. 编译和烧录
编译执行
# clean source code
make clean
# build
make
# or make with verbose output
V=1 make
写入, 会根据前面的配置调用对应的烧录方法
# flash
make flash
尝试其它例子
在 Examples 目录下有更多的代码示例, 可以复制替换掉 User 目录下的文件, 然后编译烧录查看运行效果
普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境的更多相关文章
- [eShopOnContainers 学习系列] - 03 - 在远程 Ubuntu 16.04 上配置开发环境
		
直接把 md 粘出来了,博客园的富文本编辑器换成 markdown,没啥效果呀 ,先凑合吧.实在不行换地方 # 在远程 Ubuntu 16.04 上配置开发环境 ## 零.因 为什么要用这么麻烦的 ...
 - HC32L110(三) HC32L110的GCC工具链和VSCode开发环境
		
目录 HC32L110(一) HC32L110芯片介绍和Win10下的烧录 HC32L110(二) HC32L110在Ubuntu下的烧录 HC32L110(三) HC32L110的GCC工具链和VS ...
 - 沁恒CH32V003(二): Ubuntu20.04 MRS和Makefile开发环境配置
		
目录 沁恒CH32V003(一): CH32V003F4P6开发板上手报告和Win10环境配置 沁恒CH32V003(二): Ubuntu20.04 MRS和Makefile开发环境配置 硬件准备 沁 ...
 - Ubuntu下配置C/C++开发环境
		
在 Ubuntu 下配置 C/C++ 开发环境 转自:白巴的临时空间 Submitted by 白巴 on 2009-04-27 19:52:12. 学习笔记 虽然 Ubuntu 的版本已经是9.04 ...
 - Ubuntu 12.04 搭建Android开发环境
		
Ubuntu 12.04 搭建Android开发环境 2013/7/29 Linux环境下搭建Android开发环境 大部分开发人员可能都在Windows下做开发,可能是感觉在Windows下比较方便 ...
 - 从零开始在ubuntu上配置深度学习开发环境
		
从零开始在ubuntu上配置深度学习开发环境 昨天一不小心把原来配置好的台式机的开发环境破坏了,调了半天没有调回来,索性就重装一次ubuntu系统.这篇文章主要记录一个简单的.‘傻瓜式’教程. 一.U ...
 - 39 Ubuntu下配置python的vscode开发环境
		
0 引言 最近想在ubuntu下搞深度学习,首先配置了python的vscode开发环境.在配置python时,选择了Anaconda3.x,保证了其相对于系统python2.x的独立性.另外,vsc ...
 - Ubuntu 14.04下java开发环境的搭建--3--Tomcat及MySQL的安装
		
前面两篇文章,已经说明了JDK和Eclipse 的安装方法,下面简单说一下,Tomcat及MySQL的安装方法. Tomcat的安装. 在合适的地方解压apache-tomcat-6.0.39.tar ...
 - 如何在Ubuntu下搭建Android NDK开发环境
		
1 搭建Android SDK开发环境 参考在在Ubuntu下搭建Android SDK开发环境(图文)首先在Ubuntu下搭建Android SDK开发环境. 2 下载NDK开发包 打开官网: ht ...
 - HK32F030MF4P6的Linux GCC工具链和VSCode开发环境
		
HK32F030MF4P6简介 航顺的 HK32F030MF4P6, TSSOP20封装, Arm Cortex M0 内核, 内建32MHz时钟, 16K Flash, 2K RAM(实际上可用的有 ...
 
随机推荐
- 闻道Go语言,6月龄必知必会
			
大家好,我是马甲哥, 学习新知识, 我的策略是模仿-->归纳--->举一反三, 在同程倒腾Go语言一年有余,本次记录<闻道Go语言,6月龄必知必会>,形式是同我的主力语言C#做 ...
 - maven 重复依赖不同版本 选择规则
			
maven 重复依赖不同版本 选择规则 本篇主要来看看 maven 对于 重复依赖的jar的不同版本时候 它内部的选择规则, 很多时候我们在搭建环境的时候 不注意就会存在依赖冲突等问题 那依赖冲突的时 ...
 - 题解 P4058 [Code+#1]木材
			
前言 这什么题啊,不就是个二分答案我从65到100都经历了一遍--(瞬间气哭) \(\sf {Solution}\) 题目理解起来不难的,大意就懒得写了. 一眼二分答案. 此题属于在形如 \(\{0, ...
 - letcode刷题记录-day03-罗马转整数
			
题目 罗马转整数 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 ...
 - MFC 学习笔记
			
MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...
 - python基础类型,字符串
			
python基本类型小结 # str,可以用索引取值,但是不能通过索引改变值, # a = "123" a[0]=10,直接TypeError因为字符串是不可变类型 # list, ...
 - Day3:学习Java的第一步:Hello World!
			
HelloWorld 新建一个文件夹存放代码 新建一个JAVA文件 文件后缀名为.java Hello.java 打开文件扩展名,即可查看到文件类型 运行文件:右键Hello.java文件用notep ...
 - Mysql InnoDB多版本并发控制MVCC
			
参考书籍<mysql是怎样运行的> 系列文章目录和关于我 一丶为什么需要事务隔离级别 mysql是一个客户端/服务断软件,对于同一个服务器来说,可以有多个客户端进行连接,每一个客户端进行连 ...
 - jquery 中的 $(“#”) 与 js中的document.getElementById(“”) 的区别
			
以前没注意过,认为jquery 中的 $("#") 与 document.getElementById("") 是一回事,指的是同一个东西. 这次项目开发在使用 ...
 - PGL图学习之图神经网络ERNIESage、UniMP进阶模型[系列八]
			
PGL图学习之图神经网络ERNIESage.UniMP进阶模型[系列八] 原项目链接:fork一下即可:https://aistudio.baidu.com/aistudio/projectdetai ...