当前位置: 首页 > news >正文

在新塘SDK下面,有四中文件夹,GCC、IAR、KEIL、和Keil_AC6.这4个工程有什么区别。各自是怎样配置寄存器并实现SPI功能的

嗯,用户问的是关于新塘SDK中四种不同工程文件夹的区别以及它们如何配置SPI。首先得确定用户可能是在进行嵌入式开发,尤其是使用新塘芯片,比如M0或M4系列。他们可能正在选择适合的开发环境,或者需要移植项目到不同工具上。
用户提到GCC、IAR、KEIL和Keil_AC6,说明他们可能接触过多平台,但不太清楚各自的特点。深层需求可能是想了解哪个工具更适合自己的项目,或者遇到编译问题需要切换环境。另外,他们可能想了解底层配置的一致性,避免重复工作。
需要先解释每个工具的区别,比如编译器、优化、调试支持,然后重点说明SPI的配置方式,强调虽然IDE不同,但寄存器操作是一样的,避免用户以为需要重新学每个平台的配置方法。还要提到Keil AC6是为了兼容新编译器,解决AC5的过时问题。
得确保回答既详细又不啰嗦,突出关键点,比如启动文件、链接脚本的差异,以及如何通过HAL库或寄存器操作实现SPI,让用户明白核心代码可以复用,减少他们的开发负担。

您好!这是一个非常专业且具体的问题,涉及到新塘(Nuvoton)微控制器开发的几个核心方面。很高兴能为您详细解答。

这四种文件夹(GCC, IAR, KEIL, Keil_AC6)代表了同一个SDK为四种不同的开发环境/工具链提供的工程文件。它们的核心功能(如SPI)是完全一样的,区别主要在于编译、链接和调试的工具以及由此带来的项目配置差异。

下面我为您详细分解:

一、四种工程的区别(工具链角度)

工程类型编译器/工具链所属IDE (集成开发环境)特点与用途
KEILArm Compiler 5 (AC5)µVision (Keil MDK)传统Keil默认编译器。非常稳定,兼容性极好,生态成熟。是过去很长一段时间内ARM开发的主流选择。
Keil_AC6Arm Compiler 6 (AC6)µVision (Keil MDK)Keil的新一代编译器。基于LLVM/Clang,相比AC5有更好的代码优化效率(代码更小、运行更快),支持更现代的C/C++标准(如C11, C++14)。是ARM官方主推的未来方向。
IARIAR C/C++ CompilerIAR Embedded Workbench第三方知名工具链。以生成代码效率极高(优化效果好)而闻名,在业界拥有大量用户。通常需要付费 licenses。
GCCGNU Arm Embedded Toolchain多种 (Eclipse, VSCode, Makefile)免费开源的编译器套件。生态非常庞大,是许多开源项目和低成本开发的首选。可以与多种编辑器配合使用,如VS Code、Eclipse、PlatformIO等。

简单总结:

  • KEIL 和 Keil_AC6 都是在Keil µVision这个IDE里使用的,只是内部的编译器不同。

  • IAR 需要在IAR Embedded Workbench这个独立的IDE中打开。

  • GCC 最灵活,可以用命令行、Eclipse或现在非常流行的VS Code(配合Cortex-Debug等插件)进行开发。


二、如何配置寄存器并实现SPI功能

尽管使用的工具链不同,但配置寄存器并实现SPI功能的底层逻辑和代码是高度一致甚至完全相同的。区别主要在于项目的构建配置(如编译器选项、链接脚本)。

新塘的SDK通常提供两种方式来操作外设:

1. 寄存器直接操作(Register Level / Bare-Metal)

这种方式是直接向MCU的SPI相关寄存器写入特定的值来配置和控制它。

  • 找到寄存器地址:在新塘的设备头文件(如 M480.h)和用户手册中,定义了所有寄存器的内存映射地址。例如,SPI0的控制寄存器可能是 SPI0->CTL

  • 配置寄存器:根据数据手册的描述,设置寄存器的各个位域(bit-field)。例如,配置SPI为主机模式、设置时钟分频、数据位宽、时钟极性和相位等。

// 伪代码示例:直接配置SPI0寄存器
void SPI_Init(void) {// 1. 使能SPI0模块的时钟(AHBCLK或APBCLK)CLK->AHBCLK |= CLK_AHBCLK_SPI0CKEN_Msk;// 2. 配置GPIO复用到SPI功能(MFP寄存器)SYS->GPA_MFPL = (SYS->GPA_MFPL & ~SYS_GPA_MFPL_PA0MFP_Msk) | SYS_GPA_MFPL_PA0MFP_SPI0_MOSI;// ... 配置其他引脚 SCLK, MISO, SS// 3. 配置SPI控制寄存器 (CTL)SPI0->CTL = (0 << SPI_CTL_SLAVE_Pos) |    // 0: Master mode(SPI_CTL_TXNEG_Msk) |         // 传输时钟边沿(SPI_CTL_SPIEN_Msk);          // 使能SPI// 4. 设置时钟分频器 (CLKDIV)SPI0->CLKDIV = (SystemCoreClock / 1000000) - 1; // 目标波特率 1MHz
}

发送接收数据:通过读写数据寄存器 SPI0->TX 和 SPI0->RX 来实现。

uint8_t SPI_Transfer(uint8_t data) {SPI0->TX = data;                // 将数据写入TX寄存器开始传输while((SPI0->STATUS & SPI_STATUS_RXEMPTY_Msk)); // 等待接收缓冲区非空return SPI0->RX;                // 读取接收到的数据并返回
}
2. 使用标准外设库(Library / HAL)

这是更推荐、更常用的方式。新塘的SDK(通常称为BSP或Standard Driver)提供了一套丰富的库函数和结构体,封装了对寄存器的复杂操作。

  • 库函数调用:你不需要直接操作寄存器,而是调用API函数。

  • SPI实现流程

    1. 时钟和引脚配置:使用 SYS_UnlockReg()CLK_EnableModuleClock()GPIO_SetMode() 和 SYS->GPx_MFPx 或 PA->MODE 等函数/宏来开启SPI时钟并将GPIO配置为SPI功能。

    2. SPI参数配置:定义一个 SPI_Open() 函数,它接受一个配置结构体 spi_i2s_config_t。在这个结构体中,你可以设置:

      • u32MasterSlave:主从模式(SPI_MASTER / SPI_SLAVE

      • u32SPIMode:模式(SPI_MODE_0, MODE_1, ...),即时钟极性和相位的组合。

      • u32DataWidth:数据位宽(通常为8)

      • u32BusClock:期望的SPI通信时钟频率(波特率)。函数内部会自动计算分频值。

    3. 数据传输:使用 SPI_WRITE_TX() 和 SPI_READ_RX() 等宏,或者 SPI_SetTransferCnt() 和 SPI_TRIGGER() 等函数来启动传输并获取数据。

  • // 伪代码示例:使用库函数初始化SPI
    void SPI_Init_Lib(void) {/* Enable SPI0 peripheral clock */CLK_EnableModuleClock(SPI0_MODULE);/* Set PA multi-function pins for SPI0: MOSI(PA.0), MISO(PA.1), SCLK(PA.3), SS(PA.2) */SYS->GPA_MFPL = (SYS->GPA_MFPL & ~(SYS_GPA_MFPL_PA0MFP_Msk |SYS_GPA_MFPL_PA1MFP_Msk |SYS_GPA_MFPL_PA2MFP_Msk |SYS_GPA_MFPL_PA3MFP_Msk)) |(SYS_GPA_MFPL_PA0MFP_SPI0_MOSI |SYS_GPA_MFPL_PA1MFP_SPI0_MISO |SYS_GPA_MFPL_PA2MFP_SPI0_SS |SYS_GPA_MFPL_PA3MFP_SPI0_CLK);/* Configure SPI0 as master, mode 0, 8-bit data width, and 1MHz bus clock */SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 8, 1000000);
    }

    三、不同工程在实现上的关键差异点

    虽然底层代码一样,但工程配置不同:

  • 启动文件(Startup File):

    • GCC: 使用 startup_M480.S (汇编文件,后缀为 .S)

    • IAR: 使用 startup_M480.s (汇编文件,后缀为 .s)

    • Keil (AC5/AC6): 使用 startup_M480.s (汇编文件,但语法格式与IAR和GCC的有所不同)

  • 链接脚本(Linker Script):

    • 每个工具链都有自己专属的链接脚本格式,用于定义内存布局(Flash, RAM的起始地址和大小)、代码段和数据段的存放位置。

    • GCCM480.ld (GNU LD格式)

    • IARM480.icf (IAR特有的格式)

    • KeilM480.sct (ARMLink分散加载文件格式)

  • 编译器预定义宏和选项:

    • 每个工程都会在配置中预定义芯片型号,如 __M480__

    • 包含头文件的路径(Include Paths)设置方式在各个IDE中也不同。

    • 优化等级(-O0, -Os, -O2)、调试信息(-g)等编译选项的配置界面也完全不同。

  • 功能无区别:无论你打开哪个工程,它们实现的SPI硬件功能都是一模一样的,因为底层驱动代码相同。

  • 选择依据

    • 如果你习惯使用Keil MDK,选择 KEIL(稳定)或 Keil_AC6(性能更好,推荐新项目)。

    • 如果你的公司使用IAR或你对代码大小和效率有极致追求,并且有正版License,选择 IAR

    • 如果你希望使用免费工具、与开源社区接轨、或者使用VS Code进行开发,选择 GCC

  • 对于初学者,建议从 Keil_AC6 工程开始,因为Keil IDE集成度高,上手简单,且AC6是未来的趋势。在开发过程中,应优先使用新塘提供的标准库(Library)函数来配置SPI,这样代码更易读、更易维护且跨平台移植更方便。只有在有极致性能需求或需要深入理解硬件时,才去研究寄存器的直接操作。

    结论与建议

http://www.xdnf.cn/news/1361557.html

相关文章:

  • Aligning Effective Tokens with Video Anomaly in Large Language Models
  • Node.js面试题及详细答案120题(43-55) -- 性能优化与内存管理篇
  • 《飞算Java开发实战:从入门安装到项目部署》
  • 【GEE+Python 实战】用 Sentinel-2 监测 2024 年研究区 NDVI 变化(附完整源码与避坑指南)
  • Codejock Suite ProActiveX COM Crack
  • 一文掌握 Java 键盘输入:从入门到高阶(含完整示例与避坑指南)
  • LIANA | part1 intro部分
  • VMware Workstation 不可恢复错误:(vcpu-0)
  • 详细的周任务清单(Week1-Week24,每周具体目标+任务)
  • Socket some functions
  • 基于PHP服装租赁管理系统/基于php的服装管理系统的设计与实现
  • C#_gRPC
  • 【图像处理基石】基于 Python 的图像行人删除技术:实现街景无干扰化处理
  • 6.1Element UI布局容器
  • leetcode 162 寻找峰值
  • Polkadot - JAM
  • 13种常见机器学习算法总结
  • 青少年软件编程(python六级)等级考试试卷-客观题(2023年3月)
  • 学习制作记录(选项UI以及存档系统)8.24
  • 基于RISC-V架构的国产MCU在eVTOL领域的应用研究与挑战分析
  • 【Ollama】本地OCR
  • 波兰密码破译机bomba:二战密码战的隐形功臣
  • Shell 循环实战:while 与 until 的趣味编程之旅
  • 3.4 磁盘存储器 (答案见原书 P194)
  • 【重学MySQL】八十八、8.0版本核心新特性全解析
  • Unity的Cursor.lockState
  • DeepSeek对采用nginx实现透传以解决OpenShift 4.x 私有数据中心和公有云混合部署一套集群的解答
  • 【SBP】Unity 打包构建管线原理解析于对比
  • 联想win11笔记本音频失效,显示差号(x)
  • 半年网络安全转型学习计划表(每天3小时)