0.项目介绍 

ChameleonUltra 介绍

变色龙(Chameleon Ultra)-项目简史及对比_哔哩哔哩_bilibili


编译变色龙需要下载代码,工具包,编译器等等, 我们直接开始

1.下载代码

Github地址:RfidResearchGroup/ChameleonUltra: The new generation chameleon based on NRF52840 makes the performance of card emulation more stable. And gave the chameleon the ability to read, write, and decrypt cards.


2.解压上面下载的压缩包到英文目录下


3.安装make

Make 是一个广泛使用的构建工具,主要用于编译和管理软件项目中的文件。它通过读取名为 Makefilemakefile 的脚本文件来确定如何编译和链接程序。Make 最初是为了C语言程序设计而开发的,但现在也可以用于其他编程语言和任务自动化。 

下载make: https://gnuwin32.sourceforge.net/downlinks/make.php

下载后打开安装: 

 安装成功

请你手动添加环境变量,请你直接搜索添加make到环境变量


 4. 安装 nRF 工具

nRF Util 是一款专门为 Nordic Semiconductor 产品设计的统一命令行工具。它提供了多种功能,旨在简化 Nordic 芯片(如 nRF5 系列)的开发过程,特别是涉及到固件更新、设备管理以及安全相关的任务。以下是关于 nRF Util 的一些关键点:

主要功能

  • nrf5sdk-tools 命令: 提供了与 nRF5 SDK 相关的功能,包括设备固件更新(DFU)包生成、加密密钥的生成和管理、nRF5 SDK 引导加载程序设置生成等。支持通过多种传输方式进行 DFU,如蓝牙低能耗(BLE)、UART 上的串行通信、USB 上的串行通信、Thread 单播/多播以及 Zigbee。

  • device 命令: 支持列出、编程、恢复、擦除 Nordic 设备上的各种操作,并且兼容 MCUboot 和 J-Link。这对于管理和调试 Nordic 芯片非常有用。

  • completion 命令: 使得用户能够更容易地与 nRF Util 进行交互,提供命令、子命令及标志的自动完成功能。这大大提高了命令行操作的效率。

打开链接:nRF Util - Downloads - nordicsemi.com

下载完成后,然后在任意位置创建文件  nRF_install.bat,打开且修改成如下代码:

@echo off
setlocal

:: Set the target path
set "targetPath=C:\nrfutil"

:: Create the folder if it doesn't exist
if not exist "%targetPath%" (
    mkdir "%targetPath%"
    echo Folder %targetPath% has been created.
) else (
    echo Folder %targetPath% already exists.
)

:: Check if PATH already contains the target path
echo %PATH% | findstr /i /c:"%targetPath%" >nul
if %errorlevel% equ 0 (
    echo Path %targetPath% is already in the system PATH.
) else (
    :: Get current PATH from registry
    for /f "tokens=2*" %%a in ('reg query "HKCU\Environment" /v Path') do set "currentPath=%%b"

    :: Add new path to system PATH
    setx Path "%currentPath%;%targetPath%" /m
    echo Path %targetPath% has been added to the system PATH.
)

echo.
echo Done! You can now use nrfutil from any command prompt.
echo Please restart your command prompt to apply the new environment variables.

pause

管理员权限CMD运行

成功 ,然后把刚刚下载的程序 nrfutil.exe  移动到如下目录:

cmd 输入 nrfutil  ,显示下面安装成功: 

安装nrf5sdk-tools cmd输入:

nrfutil install completion device nrf5sdk-tools trace

安装成功 


5.下载GNU Arm Embedded Toolchain

 GNU Arm Embedded Toolchain 是一个由 ARM 维护的免费软件开发工具包,专门用于开发基于 ARM Cortex-M 和 Cortex-R 系列处理器的应用程序。它包含了 GNU Compiler Collection (GCC) 的一系列工具,如编译器、汇编器、链接器和库,以及其他一些必要的工具(如调试器),使得开发者可以编写、编译和调试针对 ARM 嵌入式系统的代码。

主要组件

  • GCC for ARM: 一个支持 ARM 架构的 C/C++ 编译器。
  • GDB (GNU Debugger): 用于调试应用程序。
  • Binutils: 包括汇编器(as)、链接器(ld)和其他工具,比如用于生成二进制文件、十六进制文件等的工具。
  • Newlib 或者其他 C 库: 提供标准C库支持,适合嵌入式环境使用。

 打开GNU Arm Embedded Toolchain下载链接:Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer

 下载完成后,打开安装程序(这里请你不要修改安装位置):

选择下面这个,添加到环境变量:

这里如果环境变量没有成功添加,请你手动添加

 GNU Arm Embedded Toolchain安装完成.


6.Vscode

请你按照下面教程安装

从零开始:VSCode的详细安装与配置教程 - 知乎


7.安装Vscode插件

 安装上面插件


8.配置Vscode环境

VsCode打开项目文件夹 

 在 VS-Code 中按 F1 并输入 C/C++: Edit Configurations (UI)

 在这里添加配置名称输入 ChameleonUltra_GCC  然后确定

 下面这里修改成GNU Arm Embedded Toolchain的gcc.exe路径(请你注意是你的安装路径):

 将 IntelliSense 模式更改为   gcc-arm (legacy)


9.安装Git

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 

Git 详细安装教程(详解 Git 安装过程的每一个步骤)_git安装-CSDN博客

你需要添加安装目录到环境变量  


10.安装nRF Command Line Tools

nRF Command Line Tools - Downloads - nordicsemi.com

 工具包,这个自带jlink驱动


 11.安装zip

https://sourceforge.net/projects/gnuwin32/files/zip/3.0/

打开链接下载下面

 cmd输入zip,安装成功

你需要添加安装目录到环境变量 


12.编译项目

打开文件build.sh ,修改代码

 修改成:

#!/bin/env bash
# 创建符号链接
# nRF 工具路径设置
export PATH="/C/Program Files/Nordic Semiconductor/nrf-command-line-tools/bin:$PATH"

# 添加在脚本开头(cd命令之后)
function check_command() {
  if ! command -v "$1" &> /dev/null; then
    echo "❌ 命令 $1 未找到,请确保已安装并在环境变量PATH中"
    exit 1
  fi
}

# 检查所有依赖命令
check_command mergehex
check_command nrfutil
check_command zip
check_command make

if [[ $BASH_SOURCE = */* ]]; then
  cd -- "${BASH_SOURCE%/*}/" || exit
fi

function check_build() {
  if [ $? -ne 0 ]; then
    echo "❌ 编译失败: $1"
    exit 1
  else
    echo "✅ $1 编译成功"
  fi
}

softdevice=s140
softdevice_version=7.2.0
softdevice_id=0x0100

# 扩展版本定义
application_version_major=1
application_version_minor=0
application_version_patch=0
application_version_build=0

# 计算nrfutil使用的整型版本号
application_version_integer=$(( 
  (application_version_major << 24) | 
  (application_version_minor << 16) | 
  (application_version_patch << 8) | 
  application_version_build 
))

bootloader_version=1

device_type=${CURRENT_DEVICE_TYPE:-ultra}
case $device_type in
  "ultra") hw_version=0 ;;
  "lite")  hw_version=1 ;;
  *)       echo "Unknown CURRENT_DEVICE_TYPE $CURRENT_DEVICE_TYPE, aborting."; exit 1 ;;
esac

echo "Building firmware for $device_type (hw_version=$hw_version)"
echo "Application版本: ${application_version_major}.${application_version_minor}.${application_version_patch}.${application_version_build}"

rm -rf "objects"
mkdir -p objects

echo "🛠  编译bootloader..."
(
  cd bootloader
  make -j
)
check_build "Bootloader"

echo "🛠  编译application..."
(
  cd application
  # 传递所有需要的版本变量
  make -j \
    APP_FW_VER_MAJOR=$application_version_major \
    APP_FW_VER_MINOR=$application_version_minor \
    APP_FW_VER_REVISION=$application_version_patch \
    APP_FW_VER_BUILD=$application_version_build
)
check_build "Application"

(
  cd objects
  cp ../nrf52_sdk/components/softdevice/${softdevice}/hex/${softdevice}_nrf52_${softdevice_version}_softdevice.hex softdevice.hex
  
  nrfutil nrf5sdk-tools pkg generate \
    --hw-version $hw_version \
    --bootloader  bootloader.hex   --bootloader-version  $bootloader_version  --key-file ../../resource/dfu_key/chameleon.pem \
    --application application.hex  --application-version $application_version_integer \
    --softdevice  softdevice.hex \
    --sd-req ${softdevice_id} --sd-id ${softdevice_id} \
    ${device_type}-dfu-full.zip
  
  nrfutil nrf5sdk-tools pkg generate \
    --hw-version $hw_version --key-file ../../resource/dfu_key/chameleon.pem \
    --application application.hex  --application-version $application_version_integer \
    --sd-req ${softdevice_id} \
    ${device_type}-dfu-app.zip

  nrfutil nrf5sdk-tools settings generate \
    --family NRF52840 \
    --application application.hex --application-version $application_version_integer \
    --softdevice softdevice.hex \
    --bootloader-version $bootloader_version --bl-settings-version 2 \
    settings.hex
  mergehex \
    --merge \
    settings.hex \
    application.hex \
    --output application_merged.hex

  mergehex \
    --merge \
      bootloader.hex \
      application_merged.hex \
      softdevice.hex \
    --output fullimage.hex

  tmp_dir=$(mktemp -d -t cu_binaries_XXXXXXXXXX)
  cp *.hex "$tmp_dir"
  mv $tmp_dir/application_merged.hex $tmp_dir/application.hex
  rm $tmp_dir/settings.hex
  zip -j ${device_type}-binaries.zip $tmp_dir/*.hex
  rm -rf $tmp_dir
)

然后点击运行 build.sh 就可以编译代码

 build.sh 会编译Bootloader与 应用application程序

 

会弹出编译结果

 生成多个类型的固件

 编译成功 ,点个关注把

13.参考 

development · RfidResearchGroup/ChameleonUltra Wiki

14.附件

下面是clion cmakefile.txt ,方便clion进行开发

cmake_minimum_required(VERSION 3.25)

project(ChameleonUltra C CXX ASM)

# ========================================================
# 基础配置
# ========================================================
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR ARM)

# 设置C/C++标准
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 定义关键目录路径
set(PROJ_DIR application/src)
set(SRC_COMMON common)
set(SDK_ROOT nrf52_sdk)
set(LD_DIR application)

# ========================================================
# 编译器设置 (使用GNU Arm Embedded Toolchain)
# ========================================================
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_SIZE arm-none-eabi-size)

# ========================================================
# 源文件配置 (来自Makefile)
# ========================================================
set(SRC_FILES
        ${SRC_COMMON}/hw_connect.c
        ${SRC_COMMON}/libc_nano_stubs.c
        ${PROJ_DIR}/app_main.c
        ${PROJ_DIR}/app_cmd.c
        ${PROJ_DIR}/ble_main.c
        ${PROJ_DIR}/rfid_main.c
        ${PROJ_DIR}/settings.c
        ${PROJ_DIR}/usb_main.c
        ${PROJ_DIR}/rgb_marquee.c
        ${PROJ_DIR}/bsp/bsp_delay.c
        ${PROJ_DIR}/bsp/bsp_time.c
        ${PROJ_DIR}/bsp/bsp_wdt.c
        ${PROJ_DIR}/rfid/crc_utils.c
        ${PROJ_DIR}/rfid/hex_utils.c
        ${PROJ_DIR}/rfid/mf1_crapto1.c
        ${PROJ_DIR}/rfid/mf1_crypto1.c
        ${PROJ_DIR}/rfid/parity.c
        ${PROJ_DIR}/rfid/nfctag/tag_emulation.c
        ${PROJ_DIR}/rfid/nfctag/tag_persistence.c
        ${PROJ_DIR}/rfid/nfctag/hf/crypto1_helper.c
        ${PROJ_DIR}/rfid/nfctag/hf/nfc_14a.c
        ${PROJ_DIR}/rfid/nfctag/hf/nfc_mf1.c
        ${PROJ_DIR}/rfid/nfctag/hf/nfc_mf0_ntag.c
        ${PROJ_DIR}/rfid/nfctag/lf/lf_tag_em.c
        ${PROJ_DIR}/utils/dataframe.c
        ${PROJ_DIR}/utils/delayed_reset.c
        ${PROJ_DIR}/utils/fds_util.c
        ${PROJ_DIR}/utils/syssleep.c
        ${PROJ_DIR}/utils/timeslot.c
        ${SDK_ROOT}/modules/nrfx/mdk/gcc_startup_nrf52840.S
        ${SDK_ROOT}/components/libraries/log/src/nrf_log_backend_rtt.c
        ${SDK_ROOT}/components/libraries/log/src/nrf_log_backend_serial.c
        ${SDK_ROOT}/components/libraries/log/src/nrf_log_default_backends.c
        ${SDK_ROOT}/components/libraries/log/src/nrf_log_frontend.c
        ${SDK_ROOT}/components/libraries/log/src/nrf_log_str_formatter.c
        ${SDK_ROOT}/components/libraries/button/app_button.c
        ${SDK_ROOT}/components/libraries/util/app_error.c
        ${SDK_ROOT}/components/libraries/util/app_error_handler_gcc.c
        ${SDK_ROOT}/components/libraries/util/app_error_weak.c
        ${SDK_ROOT}/components/libraries/fifo/app_fifo.c
        ${SDK_ROOT}/components/libraries/scheduler/app_scheduler.c
        ${SDK_ROOT}/components/libraries/timer/app_timer2.c
        ${SDK_ROOT}/components/libraries/usbd/app_usbd.c
        ${SDK_ROOT}/components/libraries/usbd/class/cdc/acm/app_usbd_cdc_acm.c
        ${SDK_ROOT}/components/libraries/usbd/app_usbd_core.c
        ${SDK_ROOT}/components/libraries/usbd/app_usbd_serial_num.c
        ${SDK_ROOT}/components/libraries/usbd/app_usbd_string_desc.c
        ${SDK_ROOT}/components/libraries/util/app_util_platform.c
        ${SDK_ROOT}/components/libraries/timer/drv_rtc.c
        ${SDK_ROOT}/components/libraries/hardfault/nrf52/handler/hardfault_handler_gcc.c
        ${SDK_ROOT}/components/libraries/hardfault/hardfault_implementation.c
        ${SDK_ROOT}/components/libraries/util/nrf_assert.c
        ${SDK_ROOT}/components/libraries/atomic_fifo/nrf_atfifo.c
        ${SDK_ROOT}/components/libraries/atomic_flags/nrf_atflags.c
        ${SDK_ROOT}/components/libraries/atomic/nrf_atomic.c
        ${SDK_ROOT}/components/libraries/balloc/nrf_balloc.c
        ${SDK_ROOT}/external/fprintf/nrf_fprintf.c
        ${SDK_ROOT}/external/fprintf/nrf_fprintf_format.c
        ${SDK_ROOT}/components/libraries/memobj/nrf_memobj.c
        ${SDK_ROOT}/components/libraries/pwr_mgmt/nrf_pwr_mgmt.c
        ${SDK_ROOT}/components/libraries/ringbuf/nrf_ringbuf.c
        ${SDK_ROOT}/components/libraries/experimental_section_vars/nrf_section_iter.c
        ${SDK_ROOT}/components/libraries/sortlist/nrf_sortlist.c
        ${SDK_ROOT}/components/libraries/strerror/nrf_strerror.c
        ${SDK_ROOT}/components/libraries/queue/nrf_queue.c
        ${SDK_ROOT}/components/libraries/fstorage/nrf_fstorage.c
        ${SDK_ROOT}/components/libraries/fstorage/nrf_fstorage_sd.c
        ${SDK_ROOT}/components/libraries/fds/fds.c
        ${SDK_ROOT}/modules/nrfx/mdk/system_nrf52840.c
        ${SDK_ROOT}/integration/nrfx/legacy/nrf_drv_clock.c
        ${SDK_ROOT}/integration/nrfx/legacy/nrf_drv_power.c
        ${SDK_ROOT}/integration/nrfx/legacy/nrf_drv_rng.c
        ${SDK_ROOT}/integration/nrfx/legacy/nrf_drv_spi.c
        ${SDK_ROOT}/integration/nrfx/legacy/nrf_drv_ppi.c
        ${SDK_ROOT}/modules/nrfx/soc/nrfx_atomic.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_saadc.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_clock.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_gpiote.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_power.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/prs/nrfx_prs.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_systick.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_usbd.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_nfct.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_timer.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_lpcomp.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_pwm.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_spi.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_rng.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_ppi.c
        ${SDK_ROOT}/modules/nrfx/drivers/src/nrfx_wdt.c
        ${SDK_ROOT}/external/segger_rtt/SEGGER_RTT.c
        ${SDK_ROOT}/external/segger_rtt/SEGGER_RTT_Syscalls_GCC.c
        ${SDK_ROOT}/external/segger_rtt/SEGGER_RTT_printf.c
        ${SDK_ROOT}/components/ble/common/ble_advdata.c
        ${SDK_ROOT}/components/ble/ble_advertising/ble_advertising.c
        ${SDK_ROOT}/components/ble/common/ble_conn_params.c
        ${SDK_ROOT}/components/ble/common/ble_conn_state.c
        ${SDK_ROOT}/components/ble/ble_link_ctx_manager/ble_link_ctx_manager.c
        ${SDK_ROOT}/components/ble/common/ble_srv_common.c
        ${SDK_ROOT}/components/ble/nrf_ble_gatt/nrf_ble_gatt.c
        ${SDK_ROOT}/external/utf_converter/utf.c
        ${SDK_ROOT}/components/ble/ble_services/ble_nus/ble_nus.c
        ${SDK_ROOT}/components/ble/ble_services/ble_bas/ble_bas.c
        ${SDK_ROOT}/components/ble/nrf_ble_qwr/nrf_ble_qwr.c
        ${SDK_ROOT}/components/softdevice/common/nrf_sdh.c
        ${SDK_ROOT}/components/softdevice/common/nrf_sdh_ble.c
        ${SDK_ROOT}/components/softdevice/common/nrf_sdh_soc.c
        ${SDK_ROOT}/components/ble/peer_manager/auth_status_tracker.c
        ${SDK_ROOT}/components/ble/peer_manager/gatt_cache_manager.c
        ${SDK_ROOT}/components/ble/peer_manager/gatts_cache_manager.c
        ${SDK_ROOT}/components/ble/peer_manager/id_manager.c
        ${SDK_ROOT}/components/ble/peer_manager/nrf_ble_lesc.c
        ${SDK_ROOT}/components/ble/peer_manager/peer_data_storage.c
        ${SDK_ROOT}/components/ble/peer_manager/peer_database.c
        ${SDK_ROOT}/components/ble/peer_manager/peer_id.c
        ${SDK_ROOT}/components/ble/peer_manager/peer_manager.c
        ${SDK_ROOT}/components/ble/peer_manager/peer_manager_handler.c
        ${SDK_ROOT}/components/ble/peer_manager/pm_buffer.c
        ${SDK_ROOT}/components/ble/peer_manager/security_dispatcher.c
        ${SDK_ROOT}/components/ble/peer_manager/security_manager.c
        ${SDK_ROOT}/components/libraries/crypto/backend/nrf_hw/nrf_hw_backend_init.c
        ${SDK_ROOT}/components/libraries/crypto/backend/nrf_hw/nrf_hw_backend_rng.c
        ${SDK_ROOT}/components/libraries/crypto/backend/nrf_hw/nrf_hw_backend_rng_mbedtls.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_aead.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_aes.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_aes_shared.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_ecc.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_ecdh.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_ecdsa.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_eddsa.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_error.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_hash.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_hkdf.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_hmac.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_init.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_rng.c
        ${SDK_ROOT}/components/libraries/crypto/nrf_crypto_shared.c
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310/cc310_backend_aes.c
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310/cc310_backend_aes_aead.c
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310/cc310_backend_chacha_poly_aead.c
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310/cc310_backend_ecc.c
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310/cc310_backend_ecdh.c
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310/cc310_backend_ecdsa.c
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310/cc310_backend_eddsa.c
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310/cc310_backend_hash.c
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310/cc310_backend_hmac.c
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310/cc310_backend_init.c
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310/cc310_backend_mutex.c
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310/cc310_backend_rng.c
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310/cc310_backend_shared.c
        ${SDK_ROOT}/components/libraries/crypto/backend/oberon/oberon_backend_chacha_poly_aead.c
        ${SDK_ROOT}/components/libraries/crypto/backend/oberon/oberon_backend_ecc.c
        ${SDK_ROOT}/components/libraries/crypto/backend/oberon/oberon_backend_ecdh.c
        ${SDK_ROOT}/components/libraries/crypto/backend/oberon/oberon_backend_ecdsa.c
        ${SDK_ROOT}/components/libraries/crypto/backend/oberon/oberon_backend_eddsa.c
        ${SDK_ROOT}/components/libraries/crypto/backend/oberon/oberon_backend_hash.c
        ${SDK_ROOT}/components/libraries/crypto/backend/oberon/oberon_backend_hmac.c
)

# ========================================================
# 设备特定源文件 (ChameleonUltra)
# ========================================================
list(APPEND SRC_FILES
        ${PROJ_DIR}/rfid/reader/hf/mf1_toolbox.c
        ${PROJ_DIR}/rfid/reader/hf/rc522.c
        ${PROJ_DIR}/rfid/reader/lf/data_utils.c
        ${PROJ_DIR}/rfid/reader/lf/lf_125khz_radio.c
        ${PROJ_DIR}/rfid/reader/lf/lf_em410x_data.c
        ${PROJ_DIR}/rfid/reader/lf/lf_reader_data.c
        ${PROJ_DIR}/rfid/reader/lf/lf_reader_main.c
        ${PROJ_DIR}/rfid/reader/lf/lf_t55xx_data.c
)

# ========================================================
# 包含目录配置 (来自Makefile)
# ========================================================
include_directories(
        ${PROJ_DIR}
        ${SRC_COMMON}
        ${PROJ_DIR}/bsp/
        ${PROJ_DIR}/utils/
        ${PROJ_DIR}/rfid/
        ${PROJ_DIR}/rfid/nfctag/
        ${PROJ_DIR}/rfid/nfctag/hf
        ${PROJ_DIR}/rfid/nfctag/lf
        ${PROJ_DIR}/rfid/reader/
        ${PROJ_DIR}/rfid/reader/hf
        ${PROJ_DIR}/rfid/reader/lf
        ${SDK_ROOT}/components/nfc/ndef/generic/message
        ${SDK_ROOT}/components/nfc/t2t_lib
        ${SDK_ROOT}/components/nfc/t4t_parser/hl_detection_procedure
        ${SDK_ROOT}/components/ble/ble_services/ble_ancs_c
        ${SDK_ROOT}/components/nfc/platform
        ${SDK_ROOT}/components/ble/ble_services/ble_ias_c
        ${SDK_ROOT}/components/libraries/pwm
        ${SDK_ROOT}/components/libraries/usbd/class/cdc/acm
        ${SDK_ROOT}/components/libraries/usbd/class/hid/generic
        ${SDK_ROOT}/components/libraries/usbd/class/msc
        ${SDK_ROOT}/components/libraries/usbd/class/hid
        ${SDK_ROOT}/modules/nrfx/hal
        ${SDK_ROOT}/components/nfc/ndef/conn_hand_parser/le_oob_rec_parser
        ${SDK_ROOT}/components/libraries/log
        ${SDK_ROOT}/components/ble/ble_services/ble_gls
        ${SDK_ROOT}/components/libraries/fstorage
        ${SDK_ROOT}/components/nfc/ndef/text
        ${SDK_ROOT}/components/libraries/mutex
        ${SDK_ROOT}/components/libraries/gfx
        ${SDK_ROOT}/components/libraries/bootloader/ble_dfu
        ${SDK_ROOT}/components/nfc/ndef/connection_handover/common
        ${SDK_ROOT}/components/libraries/fifo
        ${SDK_ROOT}/components/libraries/stack_info
        ${SDK_ROOT}/components/boards
        ${SDK_ROOT}/components/nfc/ndef/generic/record
        ${SDK_ROOT}/components/nfc/t4t_parser/cc_file
        ${SDK_ROOT}/components/ble/ble_advertising
        ${SDK_ROOT}/external/utf_converter
        ${SDK_ROOT}/components/ble/ble_services/ble_bas_c
        ${SDK_ROOT}/modules/nrfx/drivers/include
        ${SDK_ROOT}/components/libraries/experimental_task_manager
        ${SDK_ROOT}/components/ble/ble_services/ble_hrs_c
        ${SDK_ROOT}/components/softdevice/s140/headers/nrf52
        ${SDK_ROOT}/components/nfc/ndef/connection_handover/le_oob_rec
        ${SDK_ROOT}/components/libraries/queue
        ${SDK_ROOT}/components/libraries/pwr_mgmt
        ${SDK_ROOT}/components/ble/ble_dtm
        ${SDK_ROOT}/components/toolchain/cmsis/include
        ${SDK_ROOT}/components/ble/ble_services/ble_rscs_c
        ${SDK_ROOT}/components/ble/common
        ${SDK_ROOT}/components/ble/ble_services/ble_lls
        ${SDK_ROOT}/components/libraries/hardfault/nrf52
        ${SDK_ROOT}/components/libraries/bsp
        ${SDK_ROOT}/components/nfc/ndef/connection_handover/ac_rec
        ${SDK_ROOT}/components/ble/ble_services/ble_bas
        ${SDK_ROOT}/components/libraries/mpu
        ${SDK_ROOT}/components/libraries/experimental_section_vars
        ${SDK_ROOT}/components/ble/ble_services/ble_ans_c
        ${SDK_ROOT}/components/libraries/slip
        ${SDK_ROOT}/components/libraries/delay
        ${SDK_ROOT}/components/libraries/csense_drv
        ${SDK_ROOT}/components/libraries/memobj
        ${SDK_ROOT}/components/ble/ble_services/ble_nus_c
        ${SDK_ROOT}/components/ble/ble_services/ble_bas_c
        ${SDK_ROOT}/components/softdevice/common
        ${SDK_ROOT}/components/ble/ble_services/ble_ias
        ${SDK_ROOT}/components/libraries/usbd/class/hid/mouse
        ${SDK_ROOT}/components/libraries/low_power_pwm
        ${SDK_ROOT}/components/nfc/ndef/conn_hand_parser/ble_oob_advdata_parser
        ${SDK_ROOT}/components/ble/ble_services/ble_dfu
        ${SDK_ROOT}/external/fprintf
        ${SDK_ROOT}/components/libraries/svc
        ${SDK_ROOT}/components/libraries/atomic
        ${SDK_ROOT}/components
        ${SDK_ROOT}/components/libraries/scheduler
        ${SDK_ROOT}/components/libraries/cli
        ${SDK_ROOT}/components/ble/ble_services/ble_lbs
        ${SDK_ROOT}/components/ble/ble_services/ble_hts
        ${SDK_ROOT}/components/ble/ble_services/ble_cts_c
        ${SDK_ROOT}/components/libraries/crc16
        ${SDK_ROOT}/components/nfc/t4t_parser/apdu
        ${SDK_ROOT}/components/libraries/util
        ${SDK_ROOT}/components/libraries/usbd/class/cdc
        ${SDK_ROOT}/components/libraries/csense
        ${SDK_ROOT}/components/libraries/balloc
        ${SDK_ROOT}/components/libraries/ecc
        ${SDK_ROOT}/components/libraries/hardfault
        ${SDK_ROOT}/components/ble/ble_services/ble_cscs
        ${SDK_ROOT}/components/libraries/hci
        ${SDK_ROOT}/components/libraries/usbd/class/hid/kbd
        ${SDK_ROOT}/components/libraries/timer
        ${SDK_ROOT}/components/softdevice/s140/headers
        ${SDK_ROOT}/integration/nrfx
        ${SDK_ROOT}/components/nfc/t4t_parser/tlv
        ${SDK_ROOT}/components/libraries/sortlist
        ${SDK_ROOT}/components/libraries/spi_mngr
        ${SDK_ROOT}/components/libraries/led_softblink
        ${SDK_ROOT}/components/nfc/ndef/conn_hand_parser
        ${SDK_ROOT}/components/libraries/sdcard
        ${SDK_ROOT}/components/nfc/ndef/parser/record
        ${SDK_ROOT}/modules/nrfx/mdk
        ${SDK_ROOT}/components/ble/ble_link_ctx_manager
        ${SDK_ROOT}/components/ble/ble_services/ble_nus
        ${SDK_ROOT}/components/libraries/twi_mngr
        ${SDK_ROOT}/components/ble/ble_services/ble_hids
        ${SDK_ROOT}/components/libraries/strerror
        ${SDK_ROOT}/components/libraries/crc32
        ${SDK_ROOT}/components/nfc/ndef/connection_handover/ble_oob_advdata
        ${SDK_ROOT}/components/nfc/t2t_parser
        ${SDK_ROOT}/components/nfc/ndef/connection_handover/ble_pair_msg
        ${SDK_ROOT}/components/libraries/usbd/class/audio
        ${SDK_ROOT}/components/nfc/t4t_lib
        ${SDK_ROOT}/components/ble/peer_manager
        ${SDK_ROOT}/components/libraries/mem_manager
        ${SDK_ROOT}/components/libraries/ringbuf
        ${SDK_ROOT}/components/ble/ble_services/ble_tps
        ${SDK_ROOT}/components/nfc/ndef/parser/message
        ${SDK_ROOT}/components/ble/ble_services/ble_dis
        ${SDK_ROOT}/components/nfc/ndef/uri
        ${SDK_ROOT}/components/ble/nrf_ble_gatt
        ${SDK_ROOT}/components/ble/nrf_ble_qwr
        ${SDK_ROOT}/components/libraries/gpiote
        ${SDK_ROOT}/components/libraries/button
        ${SDK_ROOT}/modules/nrfx
        ${SDK_ROOT}/components/libraries/twi_sensor
        ${SDK_ROOT}/integration/nrfx/legacy
        ${SDK_ROOT}/components/libraries/usbd
        ${SDK_ROOT}/components/nfc/ndef/connection_handover/ep_oob_rec
        ${SDK_ROOT}/external/segger_rtt
        ${SDK_ROOT}/components/libraries/atomic_fifo
        ${SDK_ROOT}/components/ble/ble_services/ble_lbs_c
        ${SDK_ROOT}/components/nfc/ndef/connection_handover/ble_pair_lib
        ${SDK_ROOT}/components/libraries/crypto
        ${SDK_ROOT}/components/ble/ble_racp
        ${SDK_ROOT}/components/libraries/fds
        ${SDK_ROOT}/components/nfc/ndef/launchapp
        ${SDK_ROOT}/components/libraries/atomic_flags
        ${SDK_ROOT}/components/ble/ble_services/ble_hrs
        ${SDK_ROOT}/components/ble/ble_services/ble_rscs
        ${SDK_ROOT}/components/nfc/ndef/connection_handover/hs_rec
        ${SDK_ROOT}/components/nfc/ndef/conn_hand_parser/ac_rec_parser
        ${SDK_ROOT}/components/libraries/stack_guard
        ${SDK_ROOT}/components/libraries/log/src
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310
        ${SDK_ROOT}/components/libraries/crypto/backend/cc310_bl
        ${SDK_ROOT}/components/libraries/crypto/backend/mbedtls
        ${SDK_ROOT}/components/libraries/crypto/backend/oberon
        ${SDK_ROOT}/components/libraries/crypto/backend/micro_ecc
        ${SDK_ROOT}/external/nrf_cc310/include
        ${SDK_ROOT}/external/nrf_cc310_bl/include
        ${SDK_ROOT}/components/libraries/crypto/backend/optiga
        ${SDK_ROOT}/components/libraries/crypto/backend/nrf_sw
        ${SDK_ROOT}/components/libraries/crypto/backend/nrf_hw
        ${SDK_ROOT}/components/libraries/crypto/backend/cifra
)

# ========================================================
# 编译器选项 (来自Makefile)
# ========================================================
add_compile_options(
        -O3
        -g3
        -DAPP_TIMER_V2
        -DAPP_TIMER_V2_RTC1_ENABLED
        -DFLOAT_ABI_HARD
        -DNRF52840_XXAA
        -DNRF_SD_BLE_API_VERSION=7
        -DS140
        -DSOFTDEVICE_PRESENT
        -mcpu=cortex-m4
        -mthumb
        -mabi=aapcs
        -Wall
        -Werror
        -mfloat-abi=hard
        -mfpu=fpv4-sp-d16
        -ffunction-sections
        -fdata-sections
        -fno-strict-aliasing
        -fno-builtin
        -fshort-enums
        -D__HEAP_SIZE=8192
        -D__STACK_SIZE=8192
        -DPROJECT_CHAMELEON_ULTRA
)

# 设备特定定义
add_compile_definitions(
        APP_FW_VER_MAJOR=1
        APP_FW_VER_MINOR=0
)

# 汇编器选项
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -DAPP_TIMER_V2 -DAPP_TIMER_V2_RTC1_ENABLED -DCONFIG_GPIO_AS_PINRESET -DFLOAT_ABI_HARD -DNRF52840_XXAA -DNRF_SD_BLE_API_VERSION=7 -DS140 -DSOFTDEVICE_PRESENT")

# ========================================================
# 链接器配置
# ========================================================
set(LINKER_SCRIPT ${LD_DIR}/application.ld)

set(CMAKE_EXE_LINKER_FLAGS
        "${CMAKE_EXE_LINKER_FLAGS} \
    -T ${LINKER_SCRIPT} \
    -specs=nano.specs \
    -Wl,--gc-sections \
    -mcpu=cortex-m4 \
    -mthumb \
    -mabi=aapcs \
    -mfloat-abi=hard \
    -mfpu=fpv4-sp-d16"
)

add_executable(new_target ${SRC_FILES})

# 链接库
target_link_libraries(new_target
        ${SDK_ROOT}/external/nrf_cc310/lib/cortex-m4/hard-float/libnrf_cc310_0.9.13.a
        ${SDK_ROOT}/external/nrf_oberon/lib/cortex-m4/hard-float/liboberon_3.0.8.a
        -lc
        -lnosys
        -lm
)

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐