AC7911 从入门到精通:杰理双核 Wi-Fi+蓝牙 AIoT SoC 全解析
目录
- 芯片概述与市场定位
- [杰理 AC79 系列芯片谱系](#杰理 AC79 系列芯片谱系)
- [架构全景:双核 DSP、总线与内存](#架构全景:双核 DSP、总线与内存)
- [Wi-Fi 子系统详解](#Wi-Fi 子系统详解)
- 蓝牙子系统详解
- [ISP 图像信号处理器与视频能力](#ISP 图像信号处理器与视频能力)
- 音频子系统详解
- [显示接口与 UI 框架](#显示接口与 UI 框架)
- 外设接口全览
- 电源管理与低功耗模式
- 开发环境搭建完整流程
- [SDK 工程结构详解](#SDK 工程结构详解)
- 编译与烧录实战
- [Hello World:第一个应用程序](#Hello World:第一个应用程序)
- [Wi-Fi 应用开发实战](#Wi-Fi 应用开发实战)
- 蓝牙应用开发实战
- [摄像头 + 视频流应用开发](#摄像头 + 视频流应用开发)
- 音频播放与录制开发
- [实用项目:WiFi 可视门铃](#实用项目:WiFi 可视门铃)
- 实用项目:智能音箱故事机
- [实用项目:WiFi IPC 网络摄像机](#实用项目:WiFi IPC 网络摄像机)
- [AC7911 vs AC792N 对比与升级路径](#AC7911 vs AC792N 对比与升级路径)
- 常见问题与排障指南
- 进阶学习路线
- 参考资料
关键词:AC7911、杰理、JL、Wi-Fi 4、蓝牙 5.0、AIoT、可视门铃、WiFi 摄像头、智能音箱、Code::Blocks
1. 芯片概述与市场定位
1.1 什么是 AC7911?
AC7911 (全称 AC7911B/AC7911BA,属于 AC791N 系列)是珠海杰理科技(Jieli Technology) 推出的 高集成度、低成本 Wi-Fi 4 + 双模蓝牙 AIoT 多媒体 SoC 。它内部集成了双核 320MHz 浮点 DSP 、Wi-Fi 802.11b/g/n、蓝牙 5.0 双模(BR/EDR + BLE)、ISP 图像处理器、音频 Codec(DAC+ADC+MIC 放大器)以及丰富的数字外设,专为音视频无线一体化的物联网终端产品而设计。
一句话总结:AC7911 = 双核 320MHz DSP + Wi-Fi + 蓝牙 + 摄像头 ISP + 音频 Codec + 显示接口,一颗芯片搞定音视频无线连接的全部需求。
1.2 为什么 AC7911 在 IoT 市场如此受欢迎?
| 传统方案 | AC7911 一体化方案 |
|---|---|
| MCU + 外挂 Wi-Fi 模组 + 外挂蓝牙模组 + 外挂音频 Codec + 外挂摄像头 ISP | 1 颗 AC7911 解决所有问题 |
| 5~7 颗芯片 | 1 颗芯片 |
| BOM 成本高、PCB 面积大、功耗高 | BOM 成本极低、PCB 极小、功耗显著降低 |
| 多个厂商协调、协议栈适配复杂 | 杰理统一 SDK、单一开发环境 |
1.3 市场定位
| 维度 | 说明 |
|---|---|
| 目标应用 | 可视门铃/门锁、WiFi 摄像头、智能音箱、故事机、点读笔、扫码枪、宠物喂食器、婴儿监护器 |
| 核心卖点 | 双核 320MHz DSP、WiFi+蓝牙双模、720P 摄像头 ISP、音频全链路、超低 BOM 成本 |
| 出货规模 | 杰理是全球最大的蓝牙音频 SoC 出货商之一,AC791 系列延续了其成本控制和集成度的优势 |
| 封装 | QFN48 (6mm×6mm),极小体积 |
| 工作温度 | -40°C ~ +85°C,满足工业和户外应用 |
1.4 关键规格速览
| 参数 | 规格 |
|---|---|
| CPU | 32-bit 双核浮点 DSP @ 最高 320MHz |
| Cache | 32KB I-Cache + 24KB D-Cache |
| 片上 SRAM | 578KB |
| 外部存储 | SPI Flash 8MB / PSRAM 2MB(部分封装) |
| Wi-Fi | 802.11 b/g/n, 20/40MHz, AP/STA/Monitor, 最高 +17dBm |
| 蓝牙 | V5.0 BR/EDR/BLE, 最高 +15dBm, -93dBm RX |
| ISP 摄像头 | DVP/BT656, 720p@30fps JPEG 编码 |
| 音频 Codec | 1ch 16-bit DAC (15mW@32Ω), 4ch 16-bit ADC, 4ch MIC 放大器 |
| 显示接口 | SPI/EMI/PAP/RGB888/666, 最高 480×272@15fps |
| GPIO | 28 个,可映射、可唤醒 |
| 外设 | 3×UART, 3×SPI, 1×I²C, 2×SD Host, USB OTG, 10ch 10-bit ADC |
| 硬件加速 | FFT/IFFT、AES128/256、SHA128/256、CRC16、真随机数 |
| 供电 | 核心 1.2V / IO 3.3V / RF 1.4V & 3.3V(内置 PMU) |
| 封装 | QFN48 (6mm × 6mm) |
2. 杰理 AC79 系列芯片谱系
2.1 AC791N (梧桐二代) 家族
杰理将 AC79 系列内部代号为"梧桐"(Wutong),AC791N 为第二代产品:
| 型号 | 封装 | 关键差异 |
|---|---|---|
| AC7911B | QFN48 (6×6mm) | 基础型号,2 路 MIC,最常用 |
| AC7915B | QFN48 | 仅支持单路 8-bit DVP 摄像头 |
| AC7916A | QFN48 | 4 通道 DAC(可配 2L+2R 或 L+R) |
| AC7913A0/A6 | QFN48 | 管脚与 AC7911B 兼容,可直接互换 |
2.2 与 AC792N (梧桐三代) 的关系
| 维度 | AC791N (梧桐二代) | AC792N (梧桐三代) |
|---|---|---|
| CPU 主频 | 320MHz | 360MHz |
| 外部 SDRAM 上限 | 8MB | 16MB |
| AI 加速 | 基础矩阵/向量加速 | 轻量 NPU(人脸/物体检测) |
| 图形 | 无 GPU | 2.5D GPU + 2D DMA |
| 显示 | SPI / RGB 小屏 | MIPI DSI + RGB 大屏 |
| 蓝牙 | BLE 5.0 | BLE 5.4 (AoA/AoD, LE Audio) |
| 摄像头 | 单摄 (部分双摄) | 双摄 + 增强 ISP |
| 参考价格 | ¥5~12 | ¥8~18 |
简单选型原则 :不需要大屏、不需要双摄、不需要本地 AI 人脸检测 → AC7911 完全足够,性价比最高。
3. 架构全景:双核 DSP、总线与内存
3.1 系统架构框图
AC7911B 系统架构
┌─────────────────────────────────────────────────────────┐
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 双核 RISC DSP @ 320MHz │ │
│ │ • 硬件 FPU (单精度浮点) │ │
│ │ • 128 级向量中断, 4 级优先级 │ │
│ │ • MMU 内存管理单元 │ │
│ │ • 32KB I-Cache + 24KB D-Cache │ │
│ └─────────────────┬────────────────────────────┘ │
│ │ │
│ ┌──────────┼──────────┐ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌─────────┐ ┌──────────┐ │
│ │578KB SRAM│ │8MB Flash│ │2MB PSRAM │ │
│ │(片上) │ │(SPI) │ │(SPI) │ │
│ └──────────┘ └─────────┘ └──────────┘ │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ Wi-Fi 4 + 蓝牙 5.0 双模 │ │
│ │ • 802.11b/g/n, PTA 共存 │ │
│ │ • BR + EDR + BLE 5.0 │ │
│ │ • +17dBm WiFi TX / +15dBm BT TX │ │
│ └──────────────────────────────────────────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ ISP 图像 │ │ 音频系统 │ │ 硬件加速引擎 │ │
│ │720p@30fps│ │ DAC+ADC │ │FFT/AES/SHA/CRC/TRNG│ │
│ │DVP+BT656 │ │ 4ch MIC │ │ │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 外设矩阵 │ │
│ │ • 28 GPIO • 3×UART • 3×SPI • 1×I2C │ │
│ │ • 2×SD Host • USB OTG • 10-bit ADC (10ch) │ │
│ │ • MCPWM • QDEC • IR • WDT • RTC │ │
│ │ • 显示: SPI/EMI/PAP/RGB888/666 推屏 │ │
│ └──────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 嵌入式 PMU (电源管理) │ │
│ │ LDO/DC-DC 模式, 多级低功耗睡眠 │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
3.2 双核 DSP 架构
AC7911 的"双核"并非 ARM Cortex 那样的对称多处理(SMP),而是双核 DSP + 硬件调度器的异构架构:
- 核 0 (主核):运行应用逻辑、协议栈、OS (FreeRTOS)
- 核 1 (辅核/加速核):处理计算密集型任务(音频编解码、图像处理、FFT、加密)
两个核通过共享 SRAM 和硬件邮箱/信号量进行通信。杰理 SDK 对双核调度做了很好的封装,大部分开发只需关注单核应用逻辑即可。
3.3 存储器布局
| 存储器 | 容量 | 接口 | 用途 |
|---|---|---|---|
| 片内 SRAM | 578 KB | 内部总线 | 代码 + 数据(够大多数应用) |
| SPI Flash | 8 MB (典型) | SPI (Fast Read) | 固件存储、资源文件 (UI 图片/音频) |
| SPI PSRAM | 2 MB (可选) | SPI | 扩展 RAM,处理大图像/缓冲 |
4. Wi-Fi 子系统详解
4.1 Wi-Fi 规格
| 参数 | 规格 |
|---|---|
| 标准 | IEEE 802.11 b/g/n |
| 带宽 | 20 MHz / 40 MHz |
| MCS 速率 | MCS0 ~ MCS7, MCS32 |
| 保护间隔 | 800ns / 400ns (Short GI) |
| 天线 | 1×1 SISO,支持 PCB 天线或 IPEX |
| 模式 | STA (连接路由器) / AP (热点) / Monitor (配网嗅探) |
| TX 功率 | +17 dBm (DSSS 1Mbps) / +16 dBm (MCS0) / +13 dBm (MCS7) |
| RX 灵敏度 | -95 dBm (DSSS 1M) / -92 dBm (MCS0) / -74 dBm (MCS7) |
| 加密 | WEP / WPA-PSK(TKIP) / WPA2-PSK(CCMP) |
| 高级特性 | 帧聚合 (A-MSDU/A-MPDU)、RIFS、STBC、Greenfield、PTA 共存 |
4.2 Wi-Fi 工作模式
┌──────────────┐ ┌──────────────┐
│ STA 模式 │ │ AP 模式 │
│ (客户端) │ │ (热点模式) │
│ │ │ │
│ AC7911 ────→ 路由器 │ 手机 ────→ AC7911 │
│ │ │ │
│ 用途: │ │ 用途: │
│ 连网通信 │ │ 本地配网 │
│ 云端上传 │ │ 直连控制 │
└──────────────┘ └──────────────┘
┌──────────────┐
│ Monitor 模式 │
│ (混杂监听) │
│ │
│ 用途: │
│ SmartConfig │
│ AirKiss 配网│
└──────────────┘
4.3 配网方式
AC7911 SDK 支持多种主流配网方式:
| 配网方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| AirKiss | 微信/App 通过 UDP 广播 SSID+密码 | 用户熟悉 | 兼容性依赖路由器 |
| SmartConfig | TI 私有协议,UDP 组播 | 速度快 | 需特定 APP |
| AP 配网 | AC7911 开热点,手机连入配置 | 兼容性最好 | 用户操作略多 |
| 声波配网 | 手机发出编码声波 | 有趣 | 距离受限 |
4.4 网络协议栈支持
SDK 基于 lwIP 提供完整的 TCP/IP 协议栈:
| 协议层 | 支持 |
|---|---|
| 传输层 | TCP, UDP |
| 应用层 | HTTP/HTTPS, WebSocket, MQTT, CoAP, RTSP/RTP, cURL |
| 安全 | mbedTLS (TLS/DTLS) |
| DNS | DNS 客户端, mDNS |
| 其他 | DHCP, NTP, SNTP, Ping |
5. 蓝牙子系统详解
5.1 蓝牙规格
| 参数 | 规格 |
|---|---|
| 版本 | Bluetooth 5.0 + BR + EDR + BLE |
| TX 功率 | 最高 +15 dBm(远超多数竞品的 0~+4 dBm) |
| RX 灵敏度 | -93 dBm |
| 调制 | GFSK, π/4 DQPSK, 8DPSK |
| 组网 | Piconet (微微网) + Scatternet (散射网) |
| BLE 特性 | 广播/扫描/连接、GATT 客户端+服务器 |
5.2 经典蓝牙 Profile 支持
AC7911 的经典蓝牙(BR/EDR)协议栈非常完整:
| Profile | 全称 | 角色 | 典型应用 |
|---|---|---|---|
| A2DP | Advanced Audio Distribution | Sink / Source | 蓝牙音箱、蓝牙耳机 |
| AVRCP | Audio/Video Remote Control | Target / Controller | 播放控制(上下曲/暂停) |
| HFP | Hands-Free Profile | AG / HF | 免提通话、语音助手 |
| SPP | Serial Port Profile | Server / Client | 串口透传、数据交换 |
| AVCTP / AVDTP | 音频控制/分发 | --- | A2DP/AVRCP 的底层协议 |
| GATT | Generic Attribute Profile | Server / Client | BLE 数据交互 |
5.3 蓝牙开发模式
AC7911 蓝牙角色典范:
┌────────────┐ ┌────────────┐
│ 手机 │── A2DP ────→│ AC7911 │ ← 蓝牙音箱模式
│ (Source) │ │ (Sink) │
└────────────┘ └────────────┘
┌────────────┐ ┌────────────┐
│ AC7911 │── SPP ─────→│ MCU/外设 │ ← 无线串口透传
│ (Master) │ │ (Slave) │
└────────────┘ └────────────┘
6. ISP 图像信号处理器与视频能力
6.1 ISP 规格
| 参数 | 规格 |
|---|---|
| 接口 | DVP (1/2/4/8-bit 并行) + BT656 |
| 输入格式 | YUV422 |
| 最大分辨率 | 720p @ 30fps |
| 输出格式 | YUV422 / YUV420 |
| JPEG 编码 | 最大 720p @ 30fps,支持 AVI 封装 |
| JPEG 解码 | 任意尺寸 |
| 特殊功能 | 图像拼接 (176×128@60fps)、YUV 帧缩放、裁剪 |
| 双摄支持 | 一路 DVP + 一路 SPI 摄像头可同时工作 |
6.2 摄像头选型建议
| 分辨率 | 接口 | 推荐型号 | 帧率 | 适用场景 |
|---|---|---|---|---|
| 720p | DVP 8-bit | GC2053 / OV9732 | 30fps | 可视门铃、IPC |
| VGA (640×480) | DVP 8-bit | GC032A / BF3905 | 30fps | 低成本监控 |
| QVGA (320×240) | DVP 8-bit | GC0308 | 30fps | 摄像头玩具 |
| 任意 | SPI | GC032A SPI 接口 | 15fps | 辅助摄像头 |
7. 音频子系统详解
7.1 音频硬件
| 模块 | 参数 | 说明 |
|---|---|---|
| DAC | 1ch, 16-bit | 内置耳机功放,15mW @ 32Ω |
| ADC | 4ch, 16-bit | 每通道可独立配置为 MIC 或 LINE-IN |
| MIC 放大器 | 4ch | 可编程增益,差分/单端 |
| 模拟 MUX | 4ch | 输入源选择 |
| I²S | 最高 8ch, 16/24-bit | 支持主/从模式,输入+输出 |
| PDM | 4ch, 16-bit | 数字 MEMS 麦克风接口 |
| SPDIF | 1ch 接收 | 数字音频输入 |
7.2 音频编解码能力
| 编码格式 | 编码 | 解码 | 典型码率 |
|---|---|---|---|
| SBC | ✅ | ✅ | 蓝牙 A2DP 标准 |
| AAC | ✅ | ✅ | 高质量蓝牙音频 |
| MP3 | ✅ | ✅ | 通用音乐格式 |
| OPUS | ✅ | ✅ | 现代低延迟语音/音乐 |
| ADPCM | ✅ | ✅ | 低码率语音 |
| AMR | ✅ | ✅ | 通话编码 |
| PCM / WAV | ✅ | ✅ | 无损原始音频 |
| APE / FLAC | ❌ | ✅ | 无损音乐解码 |
| M4A / WMA | ❌ | ✅ | 通用音乐格式 |
| DTS | ❌ | ✅ | 多声道解码 |
7.3 音效处理能力
AC7911 的 DSP 为音频提供了强大的处理能力:
- AEC (回声消除) --- 支持单/双麦方案,全双工语音通话
- 降噪 --- 传统降噪 + 神经网络降噪 (AI Denoise)
- EQ 均衡器 --- 多段参数 EQ
- DRC (动态范围压缩)
- 变声/变调 --- 玩具/娱乐类产品常用
- 啸叫抑制 --- 麦克风-扬声器之间的反馈抑制
- VAD (语音活动检测)
- 语音唤醒 (ASR) --- 支持单/双麦打断唤醒("小杰小杰"等)
7.4 音频通路
音频输入源 (可选):
├── 板载 MIC (模拟/数字 PDM)
├── LINE-IN (外部音源)
├── 蓝牙 A2DP (手机推流)
├── 网络流 (HTTP/RTSP URL)
├── SD 卡 / SPI Flash 文件
└── USB 音频
音频输出目标 (可选):
├── 板载 Speaker (DAC + 功放)
├── 蓝牙 A2DP (发送到耳机)
├── 网络流 (对讲/直播)
├── 录音到 SD 卡
└── I²S 外接 Codec
8. 显示接口与 UI 框架
8.1 显示接口
| 接口 | 分辨率 | 色深 | 说明 |
|---|---|---|---|
| SPI | ≤ 320×240 | RGB565 | 最常用的小屏方案 |
| RGB888 | ≤ 480×272 | 24-bit | 并口 RGB 屏,15fps |
| RGB666 | ≤ 480×272 | 18-bit | 并口 RGB 屏 |
| EMI | 可变 | --- | 杰理私有接口 |
| PAP | 可变 | --- | 杰理私有接口 |
注意 :AC7911 没有 MIPI DSI 接口。如果需要驱动高清大屏(720p+),需要升级到 AC792N 系列。
8.2 杰理 UI 工具链
杰理提供了一套轻量级的 UI 开发框架:
- UI 编辑器:PC 端 WYSIWYG 拖拽式界面设计
- 触摸驱动:I²C 触摸面板驱动
- 图层管理:支持多层叠加、透明度混合
- 资源加载:支持从 SD 卡动态加载图片资源
- 动效:基础动画支持 (JPG/AVI/GIF 播放)
9. 外设接口全览
| 外设 | 数量 | 关键特性 |
|---|---|---|
| GPIO | 28 个 | 独立上拉/下拉配置,施密特触发输入,支持外部唤醒和中断 |
| UART | 3 个 | 全双工,支持 DMA,硬件流控 |
| SPI | 3 个 | 主/从模式,支持 Fast Read Quad IO |
| I²C | 1 个 | 主/从模式,100k/400k |
| SD 卡 | 2 路 | SD 2.0 主机控制器,支持 TF 卡 |
| USB | 1 路 | USB 1.1 FS OTG / USB 2.0 HS OTG |
| ADC | 10 通道 | 10-bit SAR ADC |
| MCPWM | --- | 16 位 PWM,用于电机驱动 |
| QDEC | 1 个 | 正交解码器(旋转编码器) |
| 定时器 | 多功能 32-bit | 捕获 + PWM 模式 |
| 看门狗 | 独立 WDT | |
| RTC | 独立实时时钟 | |
| 电容触摸 | 多通道 | |
| IR 红外 | 接收 |
10. 电源管理与低功耗模式
10.1 供电架构
AC7911 内置 PMU(电源管理单元),支持多电压域独立控制:
| 电压域 | 电压 | 供电对象 |
|---|---|---|
| VDD_CORE | 1.2V | CPU 核心 + 片内 SRAM |
| VDD_IO | 3.3V | GPIO + 数字外设 |
| VDD_RF | 1.4V / 3.3V | Wi-Fi + 蓝牙射频 |
| VDD_ANA | 3.3V | 音频 Codec + ADC/DAC |
10.2 低功耗模式
| 模式 | CPU | Wi-Fi | 蓝牙 | 唤醒源 | 典型电流 |
|---|---|---|---|---|---|
| Active | 运行 | 可选 | 可选 | --- | 80~150mA (WiFi+Cam) |
| Idle | 暂停 | 可选 | 保持 | 中断 | 15~30mA |
| Sleep | 关 | 关 | 关 | GPIO/RTC | < 100µA |
| Deep Sleep | 关 | 关 | 关 | 有限 GPIO | < 10µA |
| Off | 关 | 关 | 关 | PWRKEY | < 1µA |
10.3 低功耗设计建议
c
// 在不需要网络时关闭 Wi-Fi
wifi_power_off();
// 进入深睡眠,等待 GPIO 按键唤醒
pm_deep_sleep(WAKEUP_GPIO, gpio_mask);
11. 开发环境搭建完整流程
11.1 开发环境概览
AC7911 的开发环境与常见的 ARM MCU 开发有所不同------它使用杰理自研的 Clang 工具链 ,并且需要 License 授权:
┌────────────────────────────────────────────┐
│ Windows PC │
│ │
│ Code::Blocks IDE │
│ (或 VS Code + Makefile) │
│ │ │
│ ▼ │
│ 杰理 Clang 工具链 (需要 License) │
│ │ │
│ ▼ │
│ Makefile 构建系统 │
│ │ │
│ ▼ │
│ 固件 .bin / .ubi / .fw │
│ │
│ ── USB/J-Link ──→ AC7911 开发板 │
└────────────────────────────────────────────┘
11.2 安装步骤
步骤 1:安装 Code::Blocks IDE
bash
# 下载地址(杰理定制版)
# http://pkgman.jieliapp.com/s/codeblocks
# 选择 20.03 版本,按提示安装
# 安装完成后先关闭 Code::Blocks
步骤 2:安装杰理工具链
bash
# 下载地址
# http://pkgman.jieliapp.com/s/win-toolchain
# 安装完成后需要生成 Key 码
# Key 码绑定当前电脑 → 发给代理商获取 License 文件
# 导入 License 完成激活
⚠️ 重要:License 绑定电脑硬件,换电脑需要重新申请。开发前务必确保 License 已激活。
步骤 3:安装软件包管理器
bash
# 下载地址
# http://pkgman.jieliapp.com/s/pkgmanoffline
# 用于下载和管理 SDK 版本
步骤 4:获取 SDK
bash
# 官方 Gitee 仓库
git clone https://gitee.com/Jieli-Tech/fw-AC79_AIoT_SDK.git
# 或 GitHub 镜像
git clone https://github.com/0x0fe/7911b.git
# SDK 文档地址
# https://doc.zh-jieli.com/AC79/zh-cn/master/
步骤 5:配置 VS Code(可选,更推荐)
对于习惯 VS Code 的开发者,可以安装以下插件:
- C/C++ (Microsoft)
- Cortex-Debug
- ARM Assembly
然后在 .vscode/settings.json 中配置工具链路径:
json
{
"ac791.toolchainPath": "D:/jieli-toolchain/bin",
"ac791.sdkPath": "D:/AC791_SDK",
"ac791.buildType": "debug",
"ac791.optimizationLevel": "O2"
}
12. SDK 工程结构详解
12.1 顶层目录结构
fw-AC79_AIoT_SDK/
├── apps/ # ★ 应用层代码(主要工作目录)
│ ├── demo/ # 入门示例工程
│ │ ├── demo_hello/ # Hello World
│ │ ├── demo_audio/ # 音频播放/录制
│ │ ├── demo_video/ # 视频采集/JPG编码
│ │ ├── demo_edr/ # 经典蓝牙
│ │ └── demo_ble/ # BLE
│ ├── wifi_camera/ # WiFi 摄像头工程
│ ├── wifi_ipc/ # WiFi IPC 工程
│ ├── wifi_story_machine/ # WiFi 故事机工程
│ ├── scan_box/ # 扫码盒工程
│ ├── module_example/ # ★ 模块化例程(外设/网络/音频等)
│ └── common/ # 公共代码
├── cpu/ # CPU 相关(启动代码、烧录工具)
├── include_lib/ # 库头文件
├── lib/ # 静态库(不开放源码)
├── sdk_tools/ # SDK 工具
├── tools/ # 开发工具 (make_prompt.bat 等)
├── ui_project/ # UI 工程文件
├── doc/ # 芯片数据手册 & 原理图
└── Makefile # 顶层 Makefile
12.2 应用工程内部结构
apps/my_app/
├── app_main.c # 主入口文件
├── app_main.h
├── app_config.h # 应用配置(功能开关/宏定义)
├── user_cfg.c # 用户配置 (WiFi SSID/密码等)
├── Makefile # 工程 Makefile
├── board.c # 板级初始化 (GPIO 功能选择)
└── resource/ # 资源文件 (图片/音频/字库)
12.3 核心 API 层次
应用层 (apps/)
│
▼
中间件层 (lib/)
├── 网络: lwip, mbedtls, http, mqtt, websocket
├── 音频: mp3, aac, opus, sbc, aec, eq
├── 视频: jpeg, isp
├── 文件系统: fatfs
├── USB: CDC, UVC, UAC
└── UI: gui, touch
│
▼
驱动层 (SDK 内部)
├── gpio, uart, spi, i2c, sd, i2s, pwm
└── wifi_drv, bt_drv, dac_drv, adc_drv
│
▼
OS 层
├── FreeRTOS / Pthread API
└── 内存管理 / 消息队列 / 信号量
13. 编译与烧录实战
13.1 Windows 编译
batch
:: 方式一:在 SDK 根目录双击运行
tools\make_prompt.bat
:: 在打开的命令行窗口中编译
make -j %NUMBER_OF_PROCESSORS%
:: 或指定工程编译
make ac791n_demo_demo_hello -j32
13.2 Linux 编译
bash
# 前提:工具链已解压到 /opt/jieli/
# 提高文件句柄上限(防止链接阶段失败)
ulimit -n 8096
# 多核编译
make -j $(nproc)
# 指定工程
make ac791n_demo_demo_hello -j32
⚠️ Linux 环境仅支持编译,不支持烧录下载。烧录必须在 Windows 下进行。
13.3 烧录流程
方法一:Code::Blocks 一键烧录
1. 在 Code::Blocks 中打开工程
2. 编译通过 (Build)
3. 将 AC7911 开发板进入烧写模式:
a. 按住 UPDATE (或 BOOT) 按键不放
b. 按一下 RESET 键
c. 先松开 RESET,再松开 UPDATE
d. 电脑弹出 "U盘" 盘符 = 成功进入烧写模式
4. 点击 Code::Blocks 的 "构建并运行" 按钮
5. 等待烧写完成
方法二:批处理烧录
batch
:: 进入烧录工具目录
cd cpu\wl82\tools\
:: 双击运行
download.bat
13.4 串口调试
| 引脚 | 功能 |
|---|---|
| PB3 | 串口 TX (默认) |
| GND | 串口 GND |
串口参数:921600 bps, 8N1(杰理默认高速波特率)
典型启动日志:
[00:00:00.100]ML82(AC791N) CHIP_ID: 0x6f00
[00:00:00.100]sys_clk = 320000000, sdram_clk = 192000000...
[00:00:00.100]CODE+CONST_SIZE = 1026368
14. Hello World:第一个应用程序
14.1 创建工程
bash
# 复制 demo_hello 作为起点
cp -r apps/demo/demo_hello apps/my_first_app
# 修改 apps/my_first_app/app_main.c
14.2 Hello World 代码
c
// apps/my_first_app/app_main.c
#include "app_main.h"
#include "system/includes.h"
#include "devices/gpio.h"
// 应用初始化
static void app_init(void) {
printf("========================================\n");
printf(" Hello from AC7911!\n");
printf(" CPU: Dual-core DSP @ 320MHz\n");
printf(" Chip ID: 0x%04x\n", get_chip_id());
printf("========================================\n");
// 初始化板级 GPIO (LED/按钮等)
board_init();
}
// 应用主循环 (FreeRTOS 任务)
static void app_task(void *arg) {
while (1) {
printf("Tick...\n");
vTaskDelay(1000); // FreeRTOS 延时 1 秒
}
}
// 主入口
void app_main(void) {
app_init();
// 创建主任务
xTaskCreate(app_task, "app_task", 2048, NULL, 5, NULL);
}
14.3 编译与运行
bash
make ac791n_my_first_app -j32
# 烧录到开发板 → 观察串口输出
15. Wi-Fi 应用开发实战
15.1 Wi-Fi STA 模式连接路由器
c
#include "wifi/wifi_api.h"
void wifi_connect_demo(void) {
// 1. 初始化 Wi-Fi
wifi_init();
// 2. 设置 STA 模式
wifi_set_mode(WIFI_MODE_STA);
// 3. 连接路由器
wifi_connect("MyRouter_SSID", "MyRouter_Password");
// 4. 等待连接完成(阻塞或回调方式)
while (wifi_get_state() != WIFI_STATE_CONNECTED) {
vTaskDelay(100);
}
printf("WiFi Connected! IP: %s\n", wifi_get_ip());
}
15.2 HTTP GET 请求
c
#include "net/http_client.h"
void http_get_demo(void) {
http_client_t client;
char recv_buf[1024];
http_client_init(&client);
http_client_set_url(&client, "http://httpbin.org/get");
http_client_set_method(&client, HTTP_METHOD_GET);
http_client_set_recv_buf(&client, recv_buf, sizeof(recv_buf));
int ret = http_client_request(&client);
if (ret == 0) {
printf("HTTP Response: %s\n", recv_buf);
} else {
printf("HTTP Error: %d\n", ret);
}
http_client_deinit(&client);
}
15.3 MQTT 连接云平台
c
#include "net/mqtt_client.h"
static void mqtt_on_message(const char *topic, const char *payload) {
printf("MQTT Recv [%s]: %s\n", topic, payload);
}
void mqtt_demo(void) {
mqtt_client_t mqtt;
mqtt_client_init(&mqtt);
mqtt_client_set_broker(&mqtt, "mqtt.example.com", 1883);
mqtt_client_set_credential(&mqtt, "device001", "username", "password");
mqtt_client_set_callback(&mqtt, mqtt_on_message);
mqtt_client_connect(&mqtt);
mqtt_client_subscribe(&mqtt, "device/cmd");
mqtt_client_publish(&mqtt, "device/status", "online");
}
15.4 WebSocket 实时通信
c
#include "net/websocket_client.h"
// 连接 WebSocket 服务器
ws_client_connect("ws://server.example.com:8080/ws");
// 发送文本帧
ws_client_send_text("Hello Server!");
// 接收回调
void on_ws_message(const char *data, int len) {
printf("WS Recv: %.*s\n", len, data);
}
16. 蓝牙应用开发实战
16.1 蓝牙音箱(A2DP Sink)
AC7911 作为蓝牙音箱接收手机推送的音乐:
c
#include "bt/bt_api.h"
#include "bt/a2dp_api.h"
void bt_speaker_init(void) {
// 1. 初始化蓝牙协议栈
bt_init();
// 2. 注册 A2DP Sink
a2dp_sink_init();
// 3. 设置设备名(手机搜索时看到的名称)
bt_set_local_name("AC7911-Speaker");
// 4. 设置为可发现、可连接
bt_set_discoverable(true);
bt_set_connectable(true);
printf("Bluetooth Speaker Ready! Waiting for connection...\n");
}
// A2DP 音频数据回调 → 输出到 DAC
void a2dp_audio_data_callback(uint8_t *data, uint32_t len) {
// 将 SBC/AAC 解码后的 PCM 送到 DAC 播放
dac_write(data, len);
}
16.2 BLE 自定义 GATT 服务
c
#include "bt/ble_api.h"
// 定义 BLE 服务和特征值
#define SERVICE_UUID 0x1234
#define CHAR_TEMP_UUID 0x2A6E // 标准温度特征值
static uint16_t temperature = 2300; // 23.00°C
void ble_sensor_init(void) {
ble_init();
ble_set_device_name("AC7911-Sensor");
ble_add_service(SERVICE_UUID);
ble_add_characteristic(SERVICE_UUID, CHAR_TEMP_UUID,
BLE_PROP_READ | BLE_PROP_NOTIFY,
&temperature, sizeof(temperature));
ble_start_advertising();
}
// 发送通知
void ble_notify_temperature(void) {
temperature = read_sensor_temp(); // 读取实际温度
ble_notify(SERVICE_UUID, CHAR_TEMP_UUID,
&temperature, sizeof(temperature));
}
16.3 蓝牙 SPP 串口透传
c
#include "bt/spp_api.h"
void bt_spp_init(void) {
spp_init();
spp_register_recv_callback(spp_data_recv);
bt_set_discoverable(true);
}
// SPP 数据接收回调
void spp_data_recv(uint8_t *data, uint16_t len) {
printf("SPP Recv: ");
for (int i = 0; i < len; i++) printf("%02x ", data[i]);
printf("\n");
// 透传回复
spp_send(data, len);
}
17. 摄像头 + 视频流应用开发
17.1 摄像头初始化与采集
c
#include "devices/camera.h"
static void camera_init(void) {
camera_config_t cfg = {
.interface = CAMERA_IF_DVP_8BIT,
.sensor = CAMERA_SENSOR_GC2053,
.width = 1280,
.height = 720,
.fps = 30,
.format = CAMERA_FMT_YUV422,
};
camera_open(&cfg);
}
// 获取一帧图像
static uint8_t *camera_get_frame(void) {
return camera_capture_frame();
}
17.2 JPEG 编码
c
#include "media/jpeg_encoder.h"
static int encode_jpeg(uint8_t *yuv_data, uint8_t *jpeg_buf,
int buf_size, int width, int height) {
jpeg_encode_param_t param = {
.width = width,
.height = height,
.quality = 80, // 1~100,越高画质越好
.format = JPEG_FMT_YUV422,
};
return jpeg_encode(yuv_data, jpeg_buf, buf_size, ¶m);
}
17.3 RTSP 视频推流
c
#include "net/rtsp_server.h"
void start_rtsp_stream(void) {
rtsp_server_t server;
rtsp_server_init(&server, 554); // RTSP 默认端口
rtsp_server_set_video_callback(&server, get_next_jpeg_frame);
printf("RTSP Server started: rtsp://<IP>:554/stream\n");
}
18. 音频播放与录制开发
18.1 MP3 播放(从 SD 卡)
c
#include "media/mp3_decoder.h"
#include "fs/fatfs.h"
void play_mp3_from_sd(const char *filename) {
FIL file;
mp3_decoder_t decoder;
uint8_t pcm_buf[4096];
uint8_t mp3_buf[2048];
UINT bytes_read;
// 打开 MP3 文件
f_open(&file, filename, FA_READ);
mp3_decoder_init(&decoder, 44100, 2); // 44.1kHz 立体声
while (1) {
f_read(&file, mp3_buf, sizeof(mp3_buf), &bytes_read);
if (bytes_read == 0) break;
int pcm_len = mp3_decoder_decode(&decoder, mp3_buf,
bytes_read, pcm_buf);
dac_write(pcm_buf, pcm_len); // 输出到扬声器
}
mp3_decoder_deinit(&decoder);
f_close(&file);
}
18.2 MIC 录音到 SD 卡
c
#include "devices/adc.h"
#include "media/wav_encoder.h"
void record_mic_to_sd(const char *filename, int duration_sec) {
FIL file;
wav_header_t wav_hdr;
int16_t pcm_buf[512];
int total_samples = duration_sec * 16000;
// 创建 WAV 文件
f_open(&file, filename, FA_CREATE_ALWAYS | FA_WRITE);
wav_header_init(&wav_hdr, 16000, 16, 1); // 16kHz 16bit 单声道
f_write(&file, &wav_hdr, sizeof(wav_hdr), NULL);
// 初始化 ADC (MIC 输入)
adc_init(ADC_CH_MIC, 16000);
for (int i = 0; i < total_samples; i += 512) {
adc_read(pcm_buf, 512 * sizeof(int16_t));
f_write(&file, pcm_buf, sizeof(pcm_buf), NULL);
}
f_close(&file);
}
19. 实用项目:WiFi 可视门铃
19.1 系统架构
门口机 (AC7911) 室内/手机
┌────────────────────┐ ┌──────────┐
│ 摄像头 (GC2053) │ │ 手机 APP │
│ │ │ WiFi │ │
│ ▼ │ ◄──────► │ 可视对讲 │
│ AC7911 ──┤Speaker│ │ 远程开门 │
│ (QFN48) │ MIC │ └──────────┘
│ │ │
│ 按钮/触摸 │ ┌──────────┐
│ 门锁继电器 │ │ 室内分机 │
│ IR LED (夜视) │ │ (可选) │
└────────────────────┘ └──────────┘
19.2 核心功能模块
c
// 1. 按下门铃按钮 → 推送到手机 APP (MQTT/WebSocket)
void doorbell_button_pressed(void) {
// 拍照一张
jpeg_encode(camera_get_frame(), snapshot_buf, ...);
// 通过 MQTT 推送到云端/手机
mqtt_publish("doorbell/event", "{\"ring\":1}");
mqtt_publish_binary("doorbell/snapshot", snapshot_buf, snap_len);
// 本地播放叮咚提示音
audio_play_prompt("/res/dingdong.mp3");
}
// 2. 手机 APP → 发起实时视频通话 (WebRTC/RTSP)
void start_video_call(void) {
rtsp_server_start();
aec_enable(true); // 开启回声消除
adc_start(); // 开始收音
dac_start(); // 开始播音(接收手机端语音)
}
// 3. 手机 APP → 远程开锁
void remote_unlock(void) {
gpio_set(LOCK_RELAY_PIN, 1); // 继电器吸合
vTaskDelay(3000); // 保持 3 秒
gpio_set(LOCK_RELAY_PIN, 0); // 释放
}
20. 实用项目:智能音箱故事机
20.1 系统架构
云端内容平台
│
WiFi (HTTPS)
│
┌────────────▼────────────┐
│ AC7911 │
│ │
│ WiFi ──→ 下载故事/儿歌 │
│ Bluetooth ←── 手机推流 │
│ SD 卡 ──→ 本地播放 │
│ DAC ──→ Speaker (3W) │
│ ADC ←── MIC (语音控制) │
│ SPI LCD (状态显示) │
│ GPIO ←── 实体按键 │
└─────────────────────────┘
20.2 关键代码片段
c
// 语音唤醒 (VAD)
void voice_wakeup_init(void) {
vad_init();
vad_register_wakeup_word("小杰小杰");
vad_set_callback(on_wakeup_detected);
}
void on_wakeup_detected(void) {
// 播放提示音
audio_play_prompt("/res/ding.wav");
// 录音 → 云端 ASR → 云端 NLP → 云端 TTS → 本地播放
record_and_send_to_cloud();
}
// 多种音频源切换
void play_audio( audio_source_t src, const char *uri) {
switch (src) {
case AUDIO_SRC_SD:
mp3_player_play(uri);
break;
case AUDIO_SRC_BT:
a2dp_sink_start();
break;
case AUDIO_SRC_NETWORK:
http_audio_stream_play(uri);
break;
}
}
21. 实用项目:WiFi IPC 网络摄像机
21.1 核心功能
┌──────────┐ WiFi ┌──────────┐
│ AC7911 │◄──────────►│ 云端/NVR │
│ │ │ │
│ 720p CAM │── H.264/JPEG ──→ RTSP/RTMP 推流
│ MIC │── 音频采集 ──→ 对讲
│ Speaker │←── 音频播放 ── 远程喊话
│ SD 卡 │── 本地录像 ──→ 循环覆盖
│ IR LED │── 夜视自动切换
│ PIR │── 人体感应触发报警
└──────────┘
21.2 录像到 SD 卡
c
void record_video_to_sd(void) {
FIL avi_file;
avi_header_t avi_hdr;
uint32_t frame_count = 0;
f_open(&avi_file, "0:/record.avi", FA_CREATE_ALWAYS | FA_WRITE);
avi_header_init(&avi_hdr, 1280, 720, 30);
while (recording) {
uint8_t *jpeg_frame = camera_get_jpeg();
int jpeg_size = camera_get_jpeg_size();
// 写入 AVI 帧
avi_write_frame(&avi_file, &avi_hdr, jpeg_frame,
jpeg_size, frame_count++);
// 30fps → 每帧 33ms
vTaskDelay(33);
}
avi_header_finalize(&avi_file, &avi_hdr);
f_close(&avi_file);
}
22. AC7911 vs AC792N 对比与升级路径
22.1 核心差异总结
| 维度 | AC7911/791N | AC792N |
|---|---|---|
| CPU | 双核 320MHz DSP | 双核 360MHz DSP |
| 片上 SRAM | 578KB | 578KB |
| 外部 SDRAM | 2~8MB | 8~16MB |
| AI 推理 | 基础矩阵加速 | 轻量 NPU |
| 图形 | 无 GPU | 2.5D GPU + 2D DMA |
| 显示 | SPI/RGB ≤480×272 | MIPI DSI + RGB 高清大屏 |
| 摄像头 | 单摄 720p | 双摄 + 增强 ISP |
| 蓝牙 | BLE 5.0 | BLE 5.4 (LE Audio, AoA/AoD) |
22.2 选型决策
你的产品需要什么?
├── "不需要大屏 (<2.4寸),不需要双摄,不需要本地 AI 识别"
│ └── → AC7911 ✅ (成本最优)
│
├── "需要高清大屏 (≥3.5寸 MIPI/RGB),流畅 UI 动画"
│ └── → AC792N ✅ (2.5D GPU)
│
├── "需要双摄像头 (例如门锁:人脸+猫眼)"
│ └── → AC792N ✅
│
├── "需要本地人脸识别/物体检测 (不上云)"
│ └── → AC792N ✅ (内置 NPU)
│
└── "需要 LE Audio / AoA 室内定位"
└── → AC792N ✅ (BLE 5.4)
23. 常见问题与排障指南
23.1 开发环境问题
| 问题 | 原因 | 解决方法 |
|---|---|---|
make 找不到命令 |
未运行 make_prompt.bat |
先双击运行 tools/make_prompt.bat |
编译报 undefined reference |
库文件链接顺序错误 | 调整 --start-group 到 --end-group 之间的库顺序 |
编译报 section overflow |
代码/数据超出 SRAM 范围 | 检查 linker script,优化代码大小 |
| 路径含有中文/空格 | 工具链不支持 | 将 SDK 移到不含中文和空格的路径 |
| License 无效 | 电脑硬件变更 | 重新生成 Key 码,联系代理商 |
Linux 下编译报 Too many open files |
文件句柄数不够 | ulimit -n 8096 |
23.2 烧录问题
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 无法进入烧写模式 | 按键时序不对 | "按住 UPDATE → 按一下 RESET → 松开 RESET → 松开 UPDATE" |
| 烧录时 "Device Offline" | 芯片未进入烧写模式 / USB 连接问题 | 检查 USB 线,重新按流程进入烧写模式 |
| 烧录后不运行 | 固件不匹配 | 检查 board.c 中外设配置是否与硬件一致 |
| Linux 无法烧录 | Linux 不支持烧录 | 切到 Windows 完成烧录 |
23.3 运行时问题
| 问题 | 原因 | 解决方法 |
|---|---|---|
| HardFault | 栈溢出 | 增大任务的 Stack_Size |
| Wi-Fi 连接失败 | SSID/密码错误或信号弱 | 检查 SSID/密码,确认路由器 2.4G 频段已开启 |
| Wi-Fi 连接慢 | 电源纹波干扰 | 检查 3.3V 供电纹波 |
| Wi-Fi 距离近 | 天线不匹配 | 检查 PCB 天线设计/匹配网络 |
| 蓝牙搜不到 | 未设置为可发现 | bt_set_discoverable(true) |
| 摄像头花屏 | DVP 线序不对 / MCLK 频率不匹配 | 检查摄像头线序,确认 sensor 时钟配置 |
| 音频噪声 | MIC/SPK 地线回路 | 优化 Layout 地线,检查电源退耦 |
| 功耗偏高 | 未进入低功耗模式 / GPIO 悬空 | 未用 GPIO 配置为上拉或输出低电平 |
23.4 调试技巧速查
bash
# 查看芯片 ID
printf("CHIP_ID: 0x%04x\n", get_chip_id());
# 查看剩余内存
printf("Free Heap: %d bytes\n", xPortGetFreeHeapSize());
# 查看任务状态
vTaskList(buf); # FreeRTOS 任务列表
# 查看 Wi-Fi 状态
wifi_dump_status();
# 查看蓝牙连接状态
bt_dump_connections();
# 串口打印重定向到特定 UART
uart_set_debug_channel(UART1);
24. 进阶学习路线
阶段 1:入门 (1 周)
├── 搭建开发环境 (Code::Blocks + 工具链 + License)
├── 获取并编译 SDK 中的 demo_hello
├── 烧录到开发板,观察串口输出
├── 修改代码,控制 GPIO 输出 (LED 闪烁)
└── 学习 GPIO 输入 (按键检测)
阶段 2:基础外设驱动 (2 周)
├── UART 收发 (与 PC 通信)
├── I²C 传感器驱动 (温湿度/加速度)
├── SPI Flash 读写
├── ADC 采样 (电池电压监测)
├── PWM 输出 (背光调节/电机控制)
└── SD 卡文件系统 (FATFS)
阶段 3:无线连接 (3 周)
├── Wi-Fi STA 连接路由器 + HTTP 请求
├── Wi-Fi AP 模式 + Web 配网
├── MQTT 连接阿里云/腾讯云 IoT 平台
├── WebSocket 双向通信
├── 经典蓝牙 A2DP Sink (蓝牙音箱)
├── 经典蓝牙 SPP 透传
└── BLE 自定义 GATT 服务
阶段 4:音视频开发 (4 周)
├── 摄像头初始化 + JPEG 编码
├── RTSP/RTMP 视频推流
├── MP3/AAC 音频播放 (SD 卡 + 网络流)
├── MIC 录音 + WAV 存储
├── 回声消除 (AEC) 对讲
├── 语音唤醒 (VAD + ASR)
└── LCD 显示 + UI 框架
阶段 5:产品化 (4~6 周)
├── 低功耗优化 (Sleep/Deep Sleep)
├── OTA 固件远程升级
├── 安全启动 (Secure Boot)
├── 产测流程设计 (校准/检验)
├── 硬件 PCB 设计 (天线匹配 + EMC)
└── 批量生产与认证 (FCC/CE/SRRC)
25. 参考资料
官方资源
- AC791 官方文档 --- doc.zh-jieli.com/AC79/zh-cn/master/
- 工具链说明 --- doc.zh-jieli.com/Tools/zh-cn/dev_tools/toolchains/
- 编译与下载 --- doc.zh-jieli.com/AC79/zh-cn/master/getting_started/project_download/
- AC7911B 数据手册 --- zh-jieli.com
- 杰理 AC791N/AC792N 培训资料 --- yunthinker.com
SDK 与开源
- SDK Gitee 仓库 --- gitee.com/Jieli-Tech/fw-AC79_AIoT_SDK
- GitHub 开源代码 --- github.com/0x0fe/7911b
- 杰理 AC791 方案 (网易云信) --- doc.yunxin.163.com
社区与技术支持
- 杰理技术社区 --- doc.zh-jieli.com/AC79/zh-cn/release_v1.2.0/other/community/
- 华秋商城 AC7911 采购 --- hqchip.com
- 立创商城 AC7911 采购 --- szlcsc.com
- 钉钉技术支持群 --- SDK 内 README 文件中的群号
版权声明 :本文由作者原创撰写,仅供学习和交流使用。文中技术参数来源于杰理科技官方数据手册及 SDK 公开文档,如有疏漏欢迎在评论区指正。
转载声明 :如需转载,请联系作者获得授权,并注明出处。
免责声明:本文所述代码示例和电路方案仅供学习参考,实际产品设计请以杰理科技官方最新数据手册和 SDK 文档为准。