關於 Air32F103-Template, 項目地址: https://gitee.com/iosetting/air32f103-template, 這是為 GCC Arm 工具鏈準備的 AIR32F103x 項目開發模板 ...
目錄
- AIR32F103(一) 合宙AIR32F103CBT6開發板上手報告
- AIR32F103(二) Linux環境和LibOpenCM3項目模板
- AIR32F103(三) Linux環境基於標準外設庫的項目模板
Linux 開發環境
使用的 GCC Arm, st-flash 和 JLink 與前一篇相同, 可以參考前一篇的說明
關於 Air32F103-Template
項目地址: https://gitee.com/iosetting/air32f103-template
這是為 GCC Arm 工具鏈準備的 AIR32F103x 項目開發模板
項目結構
├── Build # 編譯結果
├── Examples # 示例代碼
│ ├── FreeRTOS # FreeRTOS示例代碼
│ └── NonFreeRTOS # 非FreeRTOS示例代碼
├── Libraries
│ ├── AIR32F10xLib # AIR32F103外設層庫代碼
│ │ ├── inc # .h頭文件
│ │ ├── lib
│ │ │ └── cryptlib
│ │ └── src # .c源文件
│ ├── CORE # Coretex M 核心外設層源文件
│ ├── Debug # delay和printf支持
│ ├── DeviceSupport # AIR32F103的gcc arm startup文件
│ │ └── startup
│ │ └── arm-gcc
│ ├── FreeRTOS # FreeRTOS 庫代碼
│ └── LDScripts # 連接腳本
├── Makefile
├── Misc
│ └── flash.jlink # JLink燒錄腳本
├── README.cn.md
├── README.md
├── rules.mk # make規則
└── User # 用戶項目代碼
快速開始
1. 導出項目
git clone https://github.com/IOsetting/hk32f030m-template.git
2. 根據本地環境修改 Makefile
修改 Makefile 設置, 確保 ARM_TOOCHAIN 和 JLINKEXE(或ST_Flash) 指向正確的路徑
##### Project #####
# 項目名稱
PROJECT ?= app
# 編譯結果目錄
BUILD_DIR = Build
##### Options #####
# 是否使用 FreeRTOS, y:yes, n:no
USE_FREERTOS ?= n
# 燒錄工具, jlink 或 stlink
FLASH_PROGRM ?= stlink
##### Toolchains #######
# 根據本地環境, 設置工具鏈路徑
ARM_TOOCHAIN ?= /opt/gcc-arm/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/bin
# st-flash 可執行文件路徑
ST_FLASH ?= st-flash
# JLinkExe 可執行文件路徑和設備類型
JLINKEXE ?= /opt/SEGGER/JLink/JLinkExe
JLINK_DEVICE ?= STM32F103CB
##### Paths ############
# 當前晶元的連接腳本
LDSCRIPT = Libraries/LDScripts/air32f103cbt6.ld
3. 編譯預設項目並燒錄
# 清理
make clean
# 編譯
make
# 帶詳細輸出的編譯
V=1 make
# 燒錄
make flash
預設的項目會點亮板載的三個LED
示例代碼
示例代碼位於 Examples 目錄下, 項目中的示例代碼幾乎都是遷移自合宙的Keil項目中的示例代碼, 已經在GCC Arm下運行驗證過.
如果需要運行示例代碼, 先將 User 目錄下的文件清空, 將示例代碼複製到 User 目錄下, make clean清空, 然後重新編譯和燒錄.
VSCode 配置文件
c_cpp_properties.json 供參考
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"HK32F030MF4P6"
],
"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
}
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": "build",
"type": "shell",
"command": "make",
"problemMatcher": []
},
{
"label": "clean",
"type": "shell",
"command": "make clean",
"problemMatcher": []
},
]
}
常見問題說明
切換GCC編譯器版本, 11.2, 11.3 和 12.2
項目模板測試過的最新的GCC Arm編譯器版本為12.2, 對比 11.2 和 11.3, 12.2 編譯會帶來一些性能提升, 但是檢查也更嚴格, 按11.2和11.3的配置會產生不少warning. 在GCC Arm 12.2編譯提示 LOAD segment with RWX permissions 警告 和 GCC Arm 11.3rel1, 12.2編譯提示 _close is not implemented and will always fail 中有說明
printf 無法輸出浮點數
printf輸出浮點數預設是關閉的, 列印浮點無輸出. 可以在TGT_LDFLAGS
中增加選項 -u _printf_float
開啟, 開啟後會明顯增加二進位程式尺寸.
TGT_LDFLAGS += $(ARCH_FLAGS) -specs=nano.specs -specs=nosys.specs -static -lc -lm \
-u _printf_float \
-Wl,-Map=$(BDIR)/$(PROJECT).map \
-Wl,--gc-sections \
-Wl,--print-memory-usage
開啟後, 連接時會檢查_getpid(void)
和_kill(pid_t pid, int sig)
這兩個函數是否定義, 如果沒定義會報warning.
對FreeRTOS的支持
運行 Examples/FreeRTOS 目錄下的例子時, 需要在 Makefile 中開啟對 FreeRTOS 的支持, 將需要下麵的配置改為y
# Build with FreeRTOS, y:yes, n:no
USE_FREERTOS ?= n
切換不同的MCU型號
Makefile預設配置的是 AIR32F103CBT6 的編譯選項, 如果需要切換到CCT6和RPT6, 需要在Makefile中修改兩處
# CCT6不用改, RPT6需要修改為 STM32F103RB
JLINK_DEVICE ?= STM32F103CB
...
# 對應的修改為 air32f103cct6.ld 和 air32f103rpt6.ld
LDSCRIPT = Libraries/LDScripts/air32f103cbt6.ld