普冉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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...