AIR32F103(三) Linux環境基於標準外設庫的專案模板

2022-10-27 06:00:30

目錄

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