以下介紹Ubuntu下搭建用於HC32L110系列MCU的GCC工具鏈和VSCode的開發環境.
前一篇中已經介紹, 用於Linux環境下燒錄
以下是 AS06-VTB07H 產品頁連結. 這個開發板有新舊兩個版本. 4.0使用的是STM8, 5.0使用的是HC32L110, 現在能買到的都是後者, pin腳全部引出, 有預留燒錄口, 有一個功能按鈕, 兩個LED, 自帶USB2TTL通訊(P01, P02), 非常方便.
下面的介紹都基於這個開發板. 如果使用其他的板子, GPIO口自己調整一下就可以.
JLink軟體和對應的flash演演算法檔案, 在前一篇中已經介紹
安裝並設定好, 在網上有很多教學.
在GCC ARM網站下載工具連結https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/downloads, 然後解壓到合適的目錄
tar xvf gcc-arm-11.2-2022.02-x86_64-arm-none-eabi.tar.xz
cd /opt/gcc-arm/
sudo mv ~/Backup/linux/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/ .
sudo chown -R root:root gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/
檢查版本
/opt/gcc-arm/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/bin/arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Toolchain for the Arm Architecture 11.2-2022.02 (arm-11.14)) 11.2.1 20220111
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
git clone https://github.com/IOsetting/hc32l110-template.git
根據自己的環境引數修改下Makefile
PROJECT ?= app
# 改成原生的工具鏈路徑
ARM_TOOCHAIN ?= /opt/gcc-arm/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/bin
# 改成原生的JLinkExe的路徑
JLINKEXE ?= /opt/SEGGER/JLink/JLinkExe
# MCU型號, 這個是16K的版本, 如果是32K版本要改成 HC32L110x6, 對應下面的ld檔案也要修改
DEVICE ?= HC32L110x4
# The path for generated files
BUILD_DIR = Build
# Link descript file, hc32l110x4.ld or hc32l110x6.ld
LDSCRIPT = Libraries/LDScripts/hc32l110x4.ld
# ...
目錄 User 下有預設的點燈範例程式碼, 在上一步修改完Makefile後, 就可以編譯了
make clean
make
如果想看到詳細的命令列, 可以用
V=1 make
編譯完成後, 執行下面的命令燒錄
make flash
如果使用的是 AS06-VTB07H, 燒錄完成後可以看到兩個LED每隔一秒交替閃爍.
作為Linux下的生產力工具, VSCode是要用起來的, 開發C語言專案, 需要設定的就是兩個, c_cpp_properties.json 和 tasks.json
首先用VSCode開啟專案目錄, C/C++外掛未安裝會有提示, 按提示安裝即可.
快捷鍵Ctrl + Shift + P
調出選單, 輸入 C/C++, 可以看到 C/C++ Edit Configurations (JSON), 回車, 在建立的模板中按以下內容編輯, 路徑換成自己的
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/opt/gcc-arm/gcc-arm-11.2-2022.02-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
}
快捷鍵Ctrl + Shift + P
調出選單, 輸入 Task, 可以看到 Config Task, 回車 -> Create tasks.json from template -> Others, 編輯建立的 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": []
},
]
}
平時使用時, 用Alt + Shift + F10
就可以調出Task選單, 快速執行編譯和燒錄等操作.
User目錄下的程式碼, Makefile已經覆蓋, 會自動新增無需修改 Makefile. 如果新增其他的目錄需要包含整個目錄, 或包含單個原始檔, 可以編輯Makefile中的這部分
# C source folders
CDIRS := User \
Libraries/CMSIS \
Libraries/HC32L110_Driver/src
# C source files (if there are any single ones)
CFILES :=
其中 CDIRS 用於目錄的新增, CFILES 用於單個C原始檔的新增.
除此以外, 如果有新增的 include 路徑, 需要新增到 INCLUDES 這個變數中
# Include paths
INCLUDES := Libraries/CMSIS \
Libraries/HC32L110_Driver/inc \
User
如果編譯與預期不符, 在make時增加V=1
檢視實際的命令列.
編譯的引數都在 rules.mk 檔案中,
# Global compile flags
CFLAGS = -Wall -ggdb -ffunction-sections -fdata-sections
ASFLAGS = -g -Wa,--warn
# Arch and target specified flags
OPT ?= -Os
CSTD ?= -std=c99
ARCH_FLAGS := -fno-common -mcpu=cortex-m0plus -mthumb
# c flags
TGT_CFLAGS += $(ARCH_FLAGS) $(addprefix -D, $(LIB_FLAGS))
# asm flags
TGT_ASFLAGS += $(ARCH_FLAGS)
# ld flags
TGT_LDFLAGS += --specs=nano.specs -mcpu=cortex-m0plus -mthumb -nostartfiles -Wl,--gc-sections -Wl,-Map=$(BDIR)/$(PROJECT).map -Wl,--print-memory-usage
如果要優化編譯的結果大小或執行速度, 需要修改OPT引數, -O0
是無優化, -O1
是基礎優化, -Os
是尺寸壓縮, 具體優化項參考 https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
OPT ?= -Os
其中-ffunction-sections -fdata-sections
和-Wl,--gc-sections
是非常重要的引數, 如果不使用這些引數, 編譯的結果大概會超出HC32L110的16K位元組限制.