普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode開發環境

来源:https://www.cnblogs.com/milton/archive/2023/01/14/17051966.html
-Advertisement-
Play Games

以下介紹PY32F0系列在Ubuntu下如何使用GCC Arm Embedded Toolchain環境進行開發和燒錄. GitHub 倉庫地址: https://github.com/IOsetting/py32f0-template ...


目錄

以下介紹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錯誤

軟體方面

環境配置和編譯過程

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/

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

這個例子會展示

  • 驅動 PB5 上的LED燈亮滅, 如果你使用的型號不帶 PB5 pin, 需要修改一下 main.c, 換成其它的pin.
  • PA2, PA3 通過UART輸出echo字元串, 需要接在 USB2TTL 上通過PC端串口軟體查看, Ubuntu下可以用 Screen 或 CuteCOM 等軟體

嘗試其它例子

Examples 目錄下有更多的代碼示例, 可以複製替換掉 User 目錄下的文件, 然後編譯燒錄查看運行效果

配置 VSCode 開發環境

安裝好 VSCode 的 c/cpp 擴展後, 直接打開項目所在目錄就好了, 代碼高亮, 倉庫方法都是可用的, 需要的額外配置一個是c/cpp配置, 另一個是task

C/C++配置

Ctrl+Shift+P調出快捷菜單, 在裡面選擇 C/C++ Edit Configurations(JSON), 會創建對應的初始化配置, 然後根據自己的環境修改, 以下是我用的環境. 如果換了不同型號的晶元, defines 裡面的參數也要跟著換

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "${workspaceFolder}/User/**",
                "${workspaceFolder}/Libraries/CMSIS/Include",
                "/opt/gcc-arm/arm-gnu-toolchain-12.2.mpacbti-bet1-x86_64-arm-none-eabi/arm-none-eabi/include",
                "/opt/gcc-arm/arm-gnu-toolchain-12.2.mpacbti-bet1-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/12.2.0/include"
            ],
            "defines": [
                "PY32F002Ax5"
            ],
            "compilerPath": "/opt/gcc-arm/arm-gnu-toolchain-12.2.mpacbti-bet1-x86_64-arm-none-eabi/bin/arm-none-eabi-gcc",
            "cStandard": "gnu99",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "gcc-arm",
            "configurationProvider": "ms-vscode.makefile-tools"
        }
    ],
    "version": 4
}

Task 配置

同樣喚出快捷菜單後, 在Task中創建預設模板進行配置, 我使用的tasks.json內容為

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "clean, build",
            "type": "shell",
            "command": "make clean;make",
            "problemMatcher": []
        },
        {
            "label": "build, download",
            "type": "shell",
            "command": "make;make flash",
            "problemMatcher": []
        },
        {
            "label": "download",
            "type": "shell",
            "command": "make flash",
            "problemMatcher": []
        },
        {
            "label": "build",
            "type": "shell",
            "command": "make",
            "problemMatcher": []
        },
        {
            "label": "clean",
            "type": "shell",
            "command": "make clean",
            "problemMatcher": []
        }
    ]
}

用 Shift + Alt + F10 調出 Task 菜單, 選擇對應的條目進行編譯或燒錄


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 簡介 谷歌雲GCP(Google Cloud Platform)是由Google提供的雲平臺,還是為用戶提供了許多免費的產品,還是可以嘗試一下的。對於學習或者小項目,都可以使用。 2 創建一個新項目 要使用GCP,我們需要創建一個項目,它所有的資源都是在項目之下管理的: 3 創建Service ...
  • 在 Lua 或者 Python 中可以使用多值賦值語句來交換兩個數。例如:a, b = b, a。在 C++ 中有沒有類似的操作? 先解析一下多值賦值的原理,a, b = b, a 等價於 t1, t2 = b, a a, b = t1, t2 可以看到多值賦值還是用到了中間變數,而且還是兩個。想到 ...
  • 2023-01-12 一、Mybatis中緩存機制 1、一級緩存 (1)概述:一級緩存(即本地緩存或SqlSession級別緩存) (2)特點: ①一級緩存預設開啟 ②不能關閉 ③可以清空 (3)緩存原理 ①當第一次獲取數據時,需要先從資料庫中載入數據,將數據緩衝到Mybatis一級緩存中(緩存底層 ...
  • 1 簡介 為了更好的版本控制和問題定位,我們需要知道正在運行的應用是什麼版本,什麼時候打包的,Git的相關信息等。通過/actuator/info可以幫助我們獲取這些信息。 2 配置 首先要有actuator的依賴: <dependency> <groupId>org.springframework ...
  • .Net6中想實現對某個網址截屏,可通過Selenium模擬訪問網址並實現截圖。 實現 安裝Nuget包 <PackageReference Include="Selenium.Chrome.WebDriver" Version="85.0.0" /> <PackageReference Inclu ...
  • ABP Framework 在架構上有四大目標:模塊化、DDD、多租戶和微服務。從 `7.0` 更新的功能來看,其側重點轉向微服務場景的實現,比如:Dapr 集成、動態許可權和功能、外部本地化、分散式實體緩存服務,都是對微服務和分散式架構所提出的解決方案。 ...
  • public class SerializeHelper { #region 二進位格式 /// <summary> /// Binary 序列化使用前需要標記類可序列化 /// </summary> /// <param name="fileName">序列化到指定的文件</param> /// ...
  • Helix 解碼庫提供了MP3內容的MPEG相容解碼, 支持可變比特率, 恆定比特率以及立體聲和單聲道音頻格式. Helix 的定點解碼庫專門針對ARM處理器進行了優化. Helix 解碼庫是以幀為解碼單位的, 一次解碼一幀, 運行需要占用的資源很少, 可以在任何能夠執行長整數乘法運算(兩個32位輸... ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...