三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Windows下搭建杰里AC79XX芯片CodeBlocks开发环境完整指南

Windows下搭建杰里AC79XX芯片CodeBlocks开发环境完整指南

1. 项目概述:为什么是AC79XX和CodeBlocks?

最近在捣鼓一个基于杰里AC79XX系列芯片的小项目,发现网上关于这个平台的开发环境搭建资料,要么是零零散散的,要么就是版本老旧对不上。尤其是很多朋友在搜索“杰里过滤文件夹”、“codeblocks安装教程”这些关键词时,其实背后真正的需求,是想在Windows系统上,快速搭建一个能编译、调试AC79XX固件的稳定开发环境。AC79XX作为一款在消费电子领域应用广泛的蓝牙音频SoC,其开发环境的搭建是后续一切应用开发、驱动调试乃至UI(比如LVGL)移植的基础。这个第一步走不顺,后面的所有想法都只能是空中楼阁。

我这次搭建的目标很明确:在Windows 10/11 64位系统上,使用官方推荐的CodeBlocks作为集成开发环境(IDE),配合杰里提供的工具链,构建一个从代码编辑、编译到烧录的完整工作流。虽然也有朋友问“lvgl8.3的codeblocks模拟器能在win7 32位机上编译模拟运行吗”,这其实指向了另一个话题——模拟器环境。对于AC79XX这种嵌入式开发,我们首要搭建的是针对真实硬件的交叉编译环境,模拟器通常是桌面应用开发时才更需要。所以,本文将聚焦于硬件开发环境的搭建,过程清晰,步骤详尽,你只要跟着做,就能避开我踩过的那些坑,顺利把环境跑起来。

2. 核心工具链解析与获取

搭建AC79XX开发环境,本质上是配置一套针对ARM Cortex-M系列内核的交叉编译工具链,并让它与CodeBlocks这个IDE无缝协作。核心组件包括编译器、调试器、烧录工具以及杰里自家的SDK和配置工具。理解每个组件的作用,后续配置时才能心中有数,遇到问题也知道该查哪里。

2.1 工具链组成与作用

一套完整的AC79XX开发工具链主要包含以下几部分:

  1. ARM GCC交叉编译器:这是核心中的核心。我们的开发机(Windows)是x86架构,而AC79XX芯片是ARM Cortex-M架构。交叉编译器的作用,就是在x86机器上生成能在ARM芯片上运行的机器码。通常是一个包含arm-none-eabi-gccarm-none-eabi-gdb等命令的工具包。
  2. 杰里SDK(软件开发工具包):这是杰里官方提供的软件库,包含了芯片的寄存器定义、外设驱动(如GPIO、UART、I2C、音频编码器等)、RTOS(实时操作系统)内核、以及一些基础应用框架。SDK是我们编写应用程序的基础,提供了大量的API接口。
  3. 配置与烧录工具:杰里通常会提供一个图形化工具(可能叫“杰里配置工具”或“Production Tool”),用于生成芯片的初始化代码、配置时钟、引脚复用等。另一个关键工具是烧录器(Download Tool),用于将编译好的固件(.bin或.hex文件)写入到芯片的Flash存储器中。
  4. CodeBlocks IDE:这是一个免费、开源的C/C++集成开发环境。它本身不包含编译器,但可以非常灵活地配置外部工具链。我们用它来管理项目文件、编写代码、调用交叉编译器进行构建,以及配置调试器。它的优势在于轻量、可定制性强,非常适合嵌入式开发。

注意:在寻找和下载这些工具时,务必通过杰里官方或其授权的渠道获取。网络上流传的某些版本可能不完整、有病毒或与你的芯片型号不匹配,会导致各种诡异的问题。建议直接联系杰里的技术支持或从其官网下载。

2.2 关键文件获取与准备

根据我的经验,你需要准备以下文件(具体名称可能随版本更新而变化):

  • gcc-arm-none-eabi-10-2020-q4-major-win32.zip或类似版本的ARM GCC工具链。推荐使用较新的版本,如10.x,以获得更好的优化和支持。
  • AC79XX_SDK_Vx.x.x.zip:杰里AC79XX系列的SDK包。版本号(x.x.x)请选择与你芯片具体型号匹配的最新稳定版。
  • CodeBlocks-20.03mingw-setup.exe:CodeBlocks的安装程序,建议选择带MinGW的版本,虽然我们不用它的MinGW,但这个版本通常更完整。
  • JerryTech_Production_Tool_vx.x.x.exeJerryTech_Download_Tool_vx.x.x.exe:杰里的配置与烧录工具。

下载后,建议在非系统盘(如D盘)创建一个清晰的目录结构来存放它们,例如:

D:\Jerry_AC79XX_Dev\ ├── Tools\ │ ├── arm_gcc\ # 解压ARM GCC工具链到此 │ ├── CodeBlocks\ # 安装CodeBlocks到此目录 │ └── Jerry_Tools\ # 存放杰里配置和烧录工具 └── Projects\ # 未来存放你的工程文件 └── SDK\ # 解压杰里SDK到此

这样做的好处是路径简单、无空格和中文,能最大程度避免因路径问题导致的编译失败。

3. 基础软件安装与环境变量配置

有了工具,下一步就是正确地安装和配置,让系统认识它们。这一步的细节决定了后续编译的顺畅程度。

3.1 ARM GCC工具链的安装

ARM GCC工具链是“绿色版”的,不需要安装,只需要解压。将下载的gcc-arm-none-eabi-*.zip文件解压到你准备好的目录,例如D:\Jerry_AC79XX_Dev\Tools\arm_gcc\。解压后,其bin目录下应包含arm-none-eabi-gcc.exe等可执行文件。

接下来是关键的一步:将工具链的bin目录添加到系统的PATH环境变量中。这样,无论在命令行还是CodeBlocks中,系统都能直接找到这些命令。

  1. 在Windows搜索框输入“环境变量”,选择“编辑系统环境变量”。
  2. 点击“环境变量”按钮。
  3. 在“系统变量”区域,找到并选中Path变量,点击“编辑”。
  4. 点击“新建”,然后添加你的GCC工具链bin目录的完整路径,例如:D:\Jerry_AC79XX_Dev\Tools\arm_gcc\bin
  5. 点击“确定”保存所有更改。

验证安装:打开一个新的命令提示符(CMD)或PowerShell窗口,输入arm-none-eabi-gcc -v并回车。如果配置正确,你将看到一长串关于GCC版本信息的输出,而不是“不是内部或外部命令”的错误。这一步验证至关重要,务必确保通过。

3.2 CodeBlocks的安装与初步配置

运行CodeBlocks-20.03mingw-setup.exe。在安装过程中,当选择安装组件时,可以取消勾选“MinGW Compiler Suite”,因为我们不会使用它。在选择安装路径时,指向我们规划好的目录,例如D:\Jerry_AC79XX_Dev\Tools\CodeBlocks

安装完成后,首次启动CodeBlocks,可能会弹出编译器自动检测框,直接关闭即可。我们需要手动配置我们自己的编译器。

  1. 进入CodeBlocks,点击菜单栏的Settings->Compiler...
  2. 在弹出的“Compiler settings”对话框顶部,点击“Copy”按钮,基于默认配置创建一个新的编译器配置,命名为“ARM GCC for Jerry AC79XX”,然后点击“OK”。
  3. 在左侧选中你新创建的“ARM GCC for Jerry AC79XX”配置。
  4. 切换到“Toolchain executables”标签页。
  5. 在“Compiler's installation directory”一栏,点击“...”按钮,浏览并选择你的ARM GCC工具链的根目录,例如D:\Jerry_AC79XX_Dev\Tools\arm_gcc。CodeBlocks会自动填充下面的程序文件名(如arm-none-eabi-gcc.exe),通常不需要修改,但请检查确认。
  6. 点击“OK”保存。

至此,CodeBlocks已经知道该使用哪一套编译器了。但一个完整的项目构建,还涉及编译选项、链接脚本等,这些需要在具体的工程中配置。

4. 创建与配置第一个AC79XX工程

环境搭好了,我们来创建一个实实在在的工程,看看如何将SDK、编译器和IDE串联起来。我会以一个最简单的LED闪烁例程为例。

4.1 导入与理解SDK工程结构

杰里的SDK通常自带一些示例工程(Example)。我们不需要从零创建,最佳方式是先导入并成功编译一个官方例程。

  1. 解压AC79XX_SDK_Vx.x.x.zipD:\Jerry_AC79XX_Dev\SDK\
  2. 打开CodeBlocks,点击File->Open...
  3. 浏览到SDK目录下的示例工程文件夹。通常路径类似SDK\project\ac79xx\demo\board\ac79xx_demo\。在这个目录里,寻找一个名为ac79xx_demo.cbp的文件(.cbp是CodeBlocks工程文件)。选中并打开它。
  4. 打开后,在CodeBlocks左侧的“Management”面板的“Projects”标签页,你应该能看到整个工程的文件树。

花点时间浏览一下工程结构,这对后续开发非常重要:

  • app/:用户应用程序代码存放处。你的主函数main.c通常在这里。
  • cpu/:与CPU核心相关的底层代码,如启动文件(startup_ac79xx.s)、系统初始化等。
  • driver/:芯片外设驱动库,如gpio.c、uart.c等。
  • include/:所有头文件(.h)的聚集地,包含了各种API声明和寄存器定义。
  • system/:系统级服务,如时钟配置、中断管理、RTOS内核等。
  • output/:编译生成文件(如.elf, .bin, .hex)的输出目录。
  • build/:中间编译文件(.o, .d)的目录。

4.2 关键工程配置详解

打开工程后,右键点击工程名称(如“ac79xx_demo”),选择“Build options...”。这里是配置的核心。

  1. 编译器配置

    • 在左上角,确保“Selected compiler”是你之前创建的“ARM GCC for Jerry AC79XX”。
    • 切换到“Compiler settings”标签页下的“#defines”子页。这里定义了全局的宏。SDK工程通常已经定义好了芯片型号,例如AC79XX。不要随意修改,除非你明确知道自己在做什么。
  2. 搜索路径(Search directories)

    • Compiler标签页:这里添加编译器寻找头文件(.h)的路径。SDK工程通常已配置好相对路径(如../include)。你需要检查这些路径是否有效。更稳妥的做法是添加绝对路径,例如D:\Jerry_AC79XX_Dev\SDK\include。将SDK中所有包含头文件的目录都添加进来。
    • Linker标签页:这里添加链接器寻找库文件(.a)的路径。同样,检查并确保路径正确。
  3. 编译选项(Compiler flags)

    • 在“Compiler settings”的“Other options”子页,你会看到一系列-mcpu,-mthumb,-Os等参数。这些是给ARM GCC的指令。
      • -mcpu=cortex-m4:指定目标CPU为Cortex-M4(AC79XX常见内核)。
      • -mthumb:指示生成Thumb指令集的代码,体积更小。
      • -Os:优化等级,-Os表示优化尺寸。调试阶段可以改用-Og(优化调试体验)或-O0(不优化,便于单步调试)。
    • 一个常见坑点:如果编译报错找不到-specs=nano.specs-specs=nosys.specs,你可能需要手动指定这些specs文件的完整路径,或者确保你的GCC工具链版本包含它们。有时需要添加-nostartfiles--specs=rdimon.specs等参数,这取决于SDK的启动文件设计。具体需要参考SDK的文档或Makefile。
  4. 链接脚本(Linker script)

    • 切换到“Linker settings”标签页。
    • 在“Other linker options”中,你会看到-T参数,后面跟着一个.ld文件,例如-T..\cpu\ac79xx.ld。这个链接脚本文件定义了内存布局:Flash和SRAM的起始地址、大小,以及代码、数据、堆栈段的存放位置。绝对不要随意修改这个文件,除非你非常了解芯片的内存映射并需要进行定制化分配。

配置完成后,点击“OK”保存。然后尝试点击工具栏的黄色齿轮图标(Build)或按Ctrl+F9进行编译。

5. 编译、烧录与调试实战

如果前面的配置都正确,编译应该能成功。我们来看看成功后的输出以及如何将程序放到芯片上运行。

5.1 编译输出与文件解读

编译成功后,在CodeBlocks底部的“Build log”窗口会显示 “0 errors, 0 warnings”,并提示生成了一些文件。这些文件位于工程目录的output/文件夹下:

  • ac79xx_demo.elf:这是包含调试信息的可执行链接格式文件。它最大,包含了符号表、地址信息等,用于调试。
  • ac79xx_demo.bin:纯二进制镜像文件。只包含机器码和数据,体积最小,是烧录到芯片Flash中的主要文件。
  • ac79xx_demo.hex:Intel HEX格式文件。也是一种常见的烧录格式,包含地址信息。

对于烧录,我们通常使用.bin.hex文件。

5.2 使用烧录工具下载固件

  1. 将你的AC79XX开发板通过USB线连接到电脑。通常开发板上的USB口用于供电和通信。
  2. 打开杰里的烧录工具JerryTech_Download_Tool
  3. 工具通常会自动识别连接的芯片型号和串口号。如果没有,可能需要手动选择正确的COM口。
  4. 在工具界面中,添加需要烧录的固件文件。点击“添加”或“浏览”,找到你刚编译生成的ac79xx_demo.bin文件。
  5. 关键一步:设置烧录地址。这个地址必须与你的链接脚本(.ld文件)中定义的Flash起始地址一致。例如,如果链接脚本中Flash起始地址是0x00000000,那么烧录地址也应设为0x00000000。填错地址会导致程序无法启动。
  6. 确保开发板处于“下载模式”。对于AC79XX,这通常意味着:
    • 板子上可能有专门的“BOOT”按键,在按下载按钮前先按住“BOOT”键再上电或复位。
    • 或者,需要短接Flash的某些引脚(如BOOT_SEL)到地。
    • 具体操作请务必参考你的开发板手册!这是烧录失败最常见的原因。
  7. 点击“下载”或“Start”按钮。工具会提示连接成功并开始擦除、编程、校验。成功后会有提示。
  8. 将开发板退出下载模式(通常是断电再上电,或按复位键),程序就应该开始运行了。如果例程是控制LED闪烁,此时你应该能看到LED在闪烁。

5.3 配置调试环境(可选但重要)

对于复杂问题,单靠打印日志是不够的,需要在线调试。这需要硬件调试器(如J-Link、DAP-Link)和支持GDB的配置。

  1. 硬件连接:将调试器的SWD接口(SWDIO, SWCLK, GND,可能还有RESET)连接到开发板对应的调试引脚上,并通过USB连接调试器到电脑。
  2. 安装调试器驱动:确保电脑能识别你的调试器。
  3. 在CodeBlocks中配置调试器
    • 再次打开工程的“Build options”。
    • 切换到“Debugger”标签页。在“Debugger type”中选择“GDB/CDB debugger”。
    • 在“Executable path”中,指向你的GDB客户端,通常是arm-none-eabi-gdb.exe,位于你的GCC工具链的bin目录下。
    • 在“Debugger initialization commands”中,可能需要添加一些初始化脚本,例如连接目标板的命令。一个基础的初始化命令可能如下(以J-Link为例):
      target remote localhost:2331 monitor reset monitor halt load
    • 但这部分配置高度依赖于你的调试器和调试服务器(如J-Link GDB Server, OpenOCD)。更常见的做法是,先单独启动GDB服务器,然后在CodeBlocks的调试配置中仅设置远程调试。

由于嵌入式调试配置较为复杂,且依赖于具体硬件,初次搭建环境可以暂缓这一步,优先确保编译和烧录流程畅通。待基本开发熟悉后,再深入研究调试会更有方向。

6. 常见问题与排查技巧实录

搭建过程很少一帆风顺,下面是我遇到过的一些典型问题及解决方法,希望能帮你快速排雷。

6.1 编译阶段问题

问题1:编译报错fatal error: xxx.h: No such file or directory

  • 原因:编译器找不到头文件。
  • 排查
    1. 检查CodeBlocks工程配置中“Compiler”的搜索路径。确保包含了缺失头文件所在目录的绝对路径
    2. 检查SDK目录结构,确认该头文件确实存在。
    3. 在代码中,检查#include语句的路径是否正确。SDK内通常使用相对路径,如#include "app_config.h",这依赖于编译器搜索路径的设置。

问题2:链接阶段报错undefined reference to 'xxxx'

  • 原因:编译器找到了函数声明(在.h文件中),但链接时找不到函数实现(在.c文件或库中)。
  • 排查
    1. 检查对应的.c文件是否被添加到了工程中。在CodeBlocks的工程文件树里查看。
    2. 检查该函数所在的源文件是否被正确编译。有时文件虽在工程里,但可能没有被添加到正确的“Build Target”中。
    3. 如果函数在库(.a文件)中,检查“Linker settings”中是否添加了该库文件(-l参数)以及库文件搜索路径(-L参数)。

问题3:工具链版本不兼容导致的奇怪语法错误

  • 原因:SDK可能是用旧版本GCC编写的,使用了新版本GCC中更严格的语法检查或已废弃的特性。
  • 解决
    1. 尝试在“Compiler settings” -> “Other options”中,添加-std=gnu99-std=gnu11来指定C语言标准。
    2. 添加-fno-builtin来禁用一些内置函数冲突。
    3. 如果错误是关于inline函数的,可以尝试添加-std=gnu99并配合-fgnu89-inline
    4. 终极方案:寻找与SDK推荐版本匹配的GCC工具链。

6.2 烧录阶段问题

问题1:烧录工具无法连接芯片

  • 排查
    1. 驱动:检查USB转串口或调试器驱动是否安装正确(设备管理器中是否有感叹号)。
    2. 模式:确认开发板是否已正确进入下载模式(BOOT引脚电平、上电顺序)。这是最容易被忽略的一点。
    3. 硬件:检查USB线、连接线是否完好,接触是否良好。尝试更换一个USB端口。
    4. 工具配置:在烧录工具中,是否正确选择了芯片型号和串口号(或调试接口类型)?

问题2:烧录成功但程序不运行

  • 排查
    1. 烧录地址:核对烧录工具中设置的起始地址,是否与链接脚本(.ld文件)中的Flash起始地址完全一致。
    2. 启动模式:烧录完成后,是否将开发板从“下载模式”切换回了“正常运行模式”(通常是重新上电或复位)。
    3. 时钟配置:检查程序初始化代码中,系统时钟(如PLL)配置是否正确。一个错误的时钟配置会导致所有时序(包括简单的延时函数)全部错乱,程序看似“死机”。
    4. 最简单验证:编写一个最简单的程序,只操作一个GPIO口周期性翻转,不涉及复杂外设和时钟初始化,先验证最基础的“烧录-运行”流程是否通畅。

6.3 工程管理与迁移心得

  • 路径问题:CodeBlocks的.cbp工程文件内部使用的是相对路径。如果你移动了SDK或工程文件夹的位置,很可能导致编译失败。此时需要重新配置工程中的搜索路径。因此,前期规划好固定的工作目录非常重要。
  • “杰里过滤文件夹”:在SDK或编译过程中,可能会生成大量中间文件。有些文件夹(如build\output\下的.o.d文件)在清理或备份时是可以过滤掉的。你可以在版本控制工具(如Git)的.gitignore文件中,或文件同步工具的排除列表中,添加这些文件夹和文件类型(如*.o,*.d,*.bin,build/,output/),以保持代码仓库的整洁。
  • 备份配置:当你花费大量时间配置好一个可用的工程后,强烈建议将整个工程目录(尤其是.cbp文件)备份。或者,更专业的方式是,创建一个干净的、配置好的工程模板,以后的新项目都基于此模板创建,能节省大量重复配置时间。

环境搭建是嵌入式开发的第一步,也是磨刀不误砍柴工的关键一步。把基础打牢,后续的代码编写、驱动调试、功能移植才会事半功倍。当你第一次看到自己编译的程序在板子上如期运行时,那种成就感会告诉你,这些繁琐的配置都是值得的。如果在搭建过程中遇到上面没覆盖到的问题,最好的方法是仔细阅读SDK包自带的文档(如果有的话),或者去相关的开发者社区搜索具体的错误信息,通常都能找到解决方案。

← 返回列表