系统概述

Apus 是一款面向蓝牙 BLE 音频和 IoT 市场的高性能、低功耗芯片。内置了一个 32bit RISC-V CPU 核、一个 BLE 5.2 RF & Baseband 以及众多外设模块。

功能特性

处理器
  • RISC-V 最高支持96Mhz
  • 集成 DSP 指令和单精度浮点
  • I-Cache 大小 4KB、D-Cache 大小 4KB
存储系统
  • ROM 64KB
  • 内置 SRAM 160KB
  • 支持 SPI Nor Flash,四线模式,最高频率 96MHz
  • 支持 SIP Flash 方案, 256KB/512KB/1MB
蓝牙系统
  • 支持 BLE 5.2 LE单模
  • 支持 1Mbps、2Mbps、Long Range 125kbps、500kbps
  • Support full-function BLE AoA and AoD location features
  • 支持 LE Audio,广播、多通道通同步传输
  • 支持 2.4G 私有标准
  • 支持定位
  • 支持 HCI 标准接口
  • RX 灵敏度: -95dBm@1Mbps BLE,-93dBm@2Mbps BLE
  • TX 输出功率:最大 8dBm
音频系统
  • 集成音频加速单元
  • 音频 ADC 性能
    • Sigma-Delta ADC,输出 16bit/24bit 可选
    • ⽀持 PGA:范围:0~32dB,每个 Step 2D
    • SNR: > 92 dB @PGA 0dB,> 70dB @PGA 32dB
    • THD+N < -75dB, Dynamic Range > 90d
    • ⽀持 48k/32k/16k 采样率输出
  • 音频输入通道(Audio In)
    • ⽀持 PDM ⻨克⻛ 2 通道,⽀持 16k/32k/48k 采样率,⽀持 16bit/24bit 输出。
    • ⽀持 2+1 (2输⼊+1回声) 通道写⼊ SRA
    • ⽀持双向 I2S 输⼊和输出,I2S 数据直接进内存不需要重采样。
  • 音频 DAC
    • ⽀持单通道⾳频 DAC 输出,⽀持单端和差分连接。
    • 集成 Class-D PA
    • DAC SNR > 95dB,THD+N < -75dB
    • ⽀持喇叭负载 32ohm, 16ohm,⽀持 Line out 给⼿机
  • 音频输出
    • 单通道输出,不需要采样率转换,不需要混⾳,不需要回踩通路。
    • 集成单通道 7 级 EQ & DRC ⽀持
    • ⽀持 I2S 输出⽴体声⾳频
安全系统
  • 集成 OTP Memory (MPW 没有)
  • 集成随机数发生器
  • AES 128/192/256 加解密加速引擎
时钟
  • 支持外置 32MHz 晶振输入
  • 支持外置 32.768K 晶振输入
  • 内置高精度 32KHz OSC, 校准后精度误差小于 0.5%
  • 集成 PLL, 最高输出 128MHz
通用接口
  • 支持 USB 1.1 Slave
  • I2C Master x3, 最高频率大于 2MHz
  • UART x2
    • 支持流控
    • 波特率最高可至 3Mbps
  • QSPI x3
    • QSPI0 内部 4 线 SPI Flash 控制器, 支持 XIP, 96MHz
    • QSPI1 外部通用 QSPI 控制器,支持 LCD、PSRAM、Flash 等,支持 4 倍速
    • QSPI2 外部通用 QSPI 控制器,支持 LCD、PSRAM、Flash 等,支持 4 倍速,支持 Slave 模式
  • SDIO x1, 支持 SD、eMMC 卡
  • 集成一个 Quadrature Decoder
  • 集成一个红外发射、接收模块
    • 支持红外学习功能
    • 集成红外放大、整形、模拟转数字模块
  • 集成一个按键扫描模块
通用功能
  • GPIO
    • 最多支持 32 个 GPIO
  • 定时器
    • 8 路 32-bit 定时器
    • 可复用为 PWM 功能
  • DMA
    • 8 个 DMA 通道
  • RTC
  • 看门狗
  • SAR ADC
  • 正交解调
  • L2-Icache cache Flash XIP 大小 8KB
  • L2-Dcache cache PSRAM 大小 32KB/64KB 可配
  • 外置 MMU 单元,做地址映射
低功耗
  • 集成一个 PMU 电源管理模块,最低功耗可低至 0.5uA
工作温度
  • -40℃ ~ 85℃

RISC-V 核

Apus 处理器是一个 RISC-V 核。主要特性如下:

  • 32 位 RISC-V 指令架构

  • 支持 RISC-V 32/16 位混编指令集

  • 32 个 32 位通用寄存器

  • 整形 5 级/浮点 7 级,弹发射,顺序执行流水线

  • 支持 RISC-V 机器模式和用户模式

  • 双周期硬件乘法器,基 4 硬件除法器

  • 4KB 指令 cache(I-CACHE)、4KB 数据 cache(D-CACHE);Cache Line 大小 32B

  • 兼容 RISC-V CLIC 中断标准,支持中断嵌套

  • 兼容 RISC-V PMU 内存保护标准

  • 支持 AHB-Lite 总线协议,支持三条总线:指令总线、数据总线和系统总线

RISC-V 提供了紧耦合模块操作接口,参考头文件 core_rv32.h、csi_core.h 和 csi_rv32_gcc.h。

中断

Apus 使用 RISC-V 紧耦合中断控制器 CLIC,中断源见下表:

中断号

中断来源

备注

0 - 2

未实现/保留

3

机器模式软件中断

4 - 6

未实现/保留

7

机器模式计时中断

8 - 10

未实现/保留

11

机器模式外部中断

Apus 没使用

12 - 15

未实现/保留

16

SDIO

17

SPI1 (PSRAM SPI)

18

L2-Icache

19

GPIO

20

保留

21

保留

22

保留

23

DMA

24

SPI0 (FLASH SPI)

25

UART0

26

UART1

27

I2C0

28

I2C1

29

I2C2

30

TIMER0

31

TIMER1

32

TIMER2

33

TIMER3

34

TIMER4

35

TIMER5

36

TIMER6

37

TIMER7

38

WATCHDOG

39

USB

40

SPI2 (General SPI)

41

QUAD-DECDOR

42

IR

43

KEYSCAN

44

I2S

45

AUDIO_OUT

46

AUDIO_IN

47

RNG

48

AES

49

SAR ADC

50

BT

51

AUDIO_E

52

Sample

53

RTC

54

LPC

55

Wakeup Event

56

L2-Dcache

Systick

RISC-V 内置了一个系统定时器,该定时器一般用作系统调度用。使用方法如下:

int ticks = 10000; // 10000 个 tick 后产生中断

__attribute__ ((interrupt ("machine"))) void CORET_IRQHandler(void)  // 中断入口
{

    csi_coret_config(ticks, CORET_IRQn);  // 启动下一次 systick 中断

    systick_handler();  // systick 中断处理函数
}

    csi_coret_config(ticks, 7);  // 配置中断时间
    csi_vic_enable_irq(7);       // 开启 systick 中断

Cache

Apus 芯片有两级 Cache:L1-I/DCacheL2-I/DCacheL1-I/DCache是 RISC-V 内部 Cache;L2-I/DCache分别为 Flash XIP Cache 和 PSRAM Cache。

L1-I/Dcache

L1-I/Dcache 操作接口见下表

Cache 类型

操作名称

接口

ICache

ICache 开启

csi_icache_enable

ICache

ICache 关闭

csi_icache_disable

ICache

ICache 无效

csi_icache_invalid

DCache

DCache 开启

csi_dcache_enable

DCache

DCache 关闭

csi_dcache_disable

DCache

DCache 全部 clean

csi_dcache_clean

DCache

DCache 按地址 clean

csi_dcache_clean_range

DCache

DCache 全部 invalid

csi_dcache_invalid

DCache

DCache 按地址 invalid

csi_dcache_invalid_range

DCache

DCache 全部 clean_invalid

csi_dcache_clean_invalid

DCache

DCache 按地址 clean_invalid

csi_dcache_clean_invalid_range

L2-I/Dcache

使用方法见 L2-I/Dcache

存储系统

Apus 存储器分为两类:片上存储器片外存储器。详细信息如下:

  • 片上存储器

    • 16KB ROM

    • 32KB SRAM0

    • 32KB SRAM1

    • 32KB SRAM2

    • 32KB SRAM3

    • 32KB SRAM4

  • 片外存储器

    • 1MB/2MB/4MB/8MB/16MB SPI FLASH XIP

    • 1MB/2MB/4MB/8MB/16MB SPI PSRAM

存储系统物理地址

存储器物理地址见下表

存储器

物理地址

空间大小

SRAM 0

0x0000_0000 - 0x0000_7FFF

32KB

SRAM 1

0x0000_8000 - 0x0000_FFFF

32KB

SRAM 2

0x0001_0000 - 0x0001_7FFF

32KB

SRAM 3

0x0001_8000 - 0x0001_FFFF

32KB

SRAM 4

0x0002_0000 - 0x0002_7FFF

32KB

PSRAM

0x0200_0000 - 0x02FF_FFFF

16MB

FLASH XIP

0x0300_0000 - 0x03FF_FFFF

16MB

重要

存储器物理地址只能被 DMA 以及其他硬件模块访问,CPU 访问存储器需要通过总线地址。

地址空间

Apus 可寻址空间为 4GB。可通过指令总线(I-BUS)数据总线(D-BUS)系统总线(S-BUS)访问。

总线接口

地址范围

功能

指令总线

0x0000_0000 - 0x1FFF_FFFF

CPU 取指地址,映射到的存储设备有 ROM、SRAM、Flash XIP、PSRAM

数据总线

0x2000_0000 - 0x3FFF_FFFF

CPU 取数据地址,映射到的存储设备有 SRAM、Flash XIP、PSRAM

系统总线

0x4000_0000 - 0xCFFF_FFFF

CPU 访问寄存器地址,映射到寄存器总线

系统总线

0xD000_0000 - 0xFFFF_FFFF

CPU 自带紧耦合 IP 地址空间

存储系统地址映射

存储系统在总线上的详细映射地址如下

总线接口

存储介质

地址范围

空间大小

是否 CACHE

指令总线

ROM

0x0000_0000 - 0x0000_0FFF

16KB

不可 CACHE

指令总线

SRAM0

0x1000_0000 - 0x1000_7FFF

32KB

I-CACHE

指令总线

SRAM1

0x1000_8000 - 0x1000_FFFF

32KB

I-CACHE

指令总线

SRAM2

0x1001_0000 - 0x1001_7FFF

32KB

I-CACHE

指令总线

SRAM3

0x1001_8000 - 0x1001_FFFF

32KB

I-CACHE

指令总线

SRAM4

0x1002_0000 - 0x1002_7FFF

32KB

I-CACHE

指令总线

PSRAM

0x1200_0000 - 0x12FF_FFFF

16MB

I-CACHE

指令总线

FLASH XIP

0x1300_0000 - 0x13FF_FFFF

16MB

I-CACHE

数据总线

SRAM0

0x2000_0000 - 0x2000_7FFF

32KB

D-CACHE

数据总线

SRAM1

0x2000_8000 - 0x2000_FFFF

32KB

D-CACHE

数据总线

SRAM2

0x2001_0000 - 0x2001_7FFF

32KB

D-CACHE

数据总线

SRAM3

0x2001_8000 - 0x2001_FFFF

32KB

D-CACHE

数据总线

SRAM4

0x2002_0000 - 0x2002_7FFF

32KB

D-CACHE

数据总线

PSRAM

0x2200_0000 - 0x22FF_FFFF

16MB

D-CACHE

数据总线

FLASH XIP

0x2300_0000 - 0x23FF_FFFF

16MB

D-CACHE

数据总线

SRAM0

0x3000_0000 - 0x3000_7FFF

32KB

不可 CACHE

数据总线

SRAM1

0x3000_8000 - 0x3000_FFFF

32KB

不可 CACHE

数据总线

SRAM2

0x3001_0000 - 0x3001_7FFF

32KB

不可 CACHE

数据总线

SRAM3

0x3001_8000 - 0x3001_FFFF

32KB

不可 CACHE

数据总线

SRAM4

0x3002_0000 - 0x3002_7FFF

32KB

不可 CACHE

数据总线

PSRAM

0x3200_0000 - 0x32FF_FFFF

16MB

不可 CACHE

数据总线

FLASH XIP

0x3300_0000 - 0x33FF_FFFF

16MB

不可 CACHE

重要

CPU 访问存储介质如果超过以上地址范围,会直接报异常。

外设寄存器地址映射

外设寄存器在总线上的详细映射地址如下

模块

寄存器地址

备注

I2C0

0xA000_0000 - 0xA000_FFFF

I2C1

0xA001_0000 - 0xA001_FFFF

I2C2

0xA002_0000 - 0xA002_FFFF

UART0

0xA010_0000 - 0xA010_FFFF

UART1

0xA011_0000 - 0xA011_FFFF

SAR ADC

0xA020_0000 - 0xA020_00FF

SAR DMA

0xA020_0100 - 0xA020_017F

SPI0 (FLASH SPI)

0xA100_0000 - 0xA1FF_FFFF

SPI1 (PSRAM SPI)

0xA200_0000 - 0xA2FF_FFFF

SPI2 (General SPI)

0xA300_0000 - 0xA3FF_FFFF

WATCHDOG

0xB000_0000 - 0xB00F_FFFF

看门狗

TIMER

0xB010_0000 - 0xB01F_FFFF

定时器

GPIO

0xB020_0000 - 0xB02F_FFFF

IR

0xB040_0000 - 0xB04F_FFFF

红外

QUAD-DECDOR

0xB050_0000 - 0xB05F_FFFF

正交解码器

RCM

0xB060_0000 - 0xB06F_FFFF

时钟和复位

PMU-AO

0xB070_0000 - 0xB070_FFFF

电源管理单元,低功耗不断电

RTC

0xB071_0000 - 0xB071_FFFF

KEYSCAN

0xB080_0000 - 0xB08F_FFFF

按键扫描

IO-Matrix

0xB090_0000 - 0xB090_FFFF

IO 管脚复用

IO-TEST

0xB091_0000 - 0xB091_FFFF

IO 特殊功能配置

RNG

0xB0A0_0000 - 0xB0AF_FFFF

随机数

AES

0xB0B0_0000 - 0xB0BF_FFFF

eFuse

0xB0C0_0000 - 0xB0CF_FFFF

电源管理单元,低功耗断电

PMU-CORE

0xB0D0_0000 - 0xB0DF_FFFF

SDIO

0xB100_0000 - 0xB1FF_FFFF

USB

0xB200_0000 - 0xB2FF_FFFF

DMA

0xB300_0000 - 0xB3FF_FFFF

BT

0xB400_0000 - 0xB4FF_FFFF

蓝牙

MCU-CONFIG

0xB500_0000 - 0xB5FF_FFFF

系统配置

AUDIO_IN

0xB600_0000 - 0xB60F_FFFF

I2S

0xB610_0000 - 0xB61F_FFFF

AUDIO_OUT

0xB620_0000 - 0xB62F_FFFF

SDM

0xB630_0000 - 0xB63F_FFFF

DAC

AUDIO_E

0xB640_0000 - 0xB64F_FFFF

LODAC

0xB650_0000 - 0xB65F_FFFF

AUDIO_CODEC

0xB660_0000 - 0xB65F_FFFF

L2-Dcache

0xB700_0000 - 0xB7FF_FFFF

外置 MMU

Apus MMU 模块单纯的是一个地址转换模块,详细使用方法参考 MMU 章节

IO PAD

本节介绍 IO PAD 相关的内容,包括 IO 类型IO 控制IO 复用关系等。

IO PAD 类型

Apus 中所有 IO PAD 大概可分为以下几类:电源 IO数字 IO模拟 IO。其中电源 IO是独占 IO,软件不需要关心,数字 IO模拟 IO可以在同一个 IO 上。数字/模拟 IO 如下表所示:

GPIO 号

PAD 名称

特殊功能

可否唤醒

默认功能

0

P0_0

BOOT PIN

IDLE

1

P0_1

IDLE

2

P0_2

IDLE

3

P0_3

IDLE

4

P0_4

IDLE

5

P0_5

IDLE

6

P0_6

UART0_RX

7

P0_7

UART0_TX

8

P1_0

AIN0

JTAG_TMS

9

P1_1

AIN1

JTAG_TCK

10

P1_2

AIN2

IDLE

11

P1_3

AIN3

IDLE

12

P1_4

AIN4

IDLE

13

P1_5

AIN5

IDLE

14

P1_6

AIN6

IDLE

15

P1_7

AIN7

IDLE

16

P2_0

IDLE

17

P2_1

IDLE

18

P2_2

IDLE

19

P2_3

IDLE

20

P2_4

IDLE

21

P2_5

IDLE

22

P2_6

IDLE

23

P2_7

IDLE

24

P3_0

IDLE

25

P3_1

IDLE

26

P3_2

PWM_P

27

P3_3

PWM_N

28

P3_4

XO 32K

IDLE

29

P3_5

XO 32K

IDLE

30

P3_6

USB_DM

IDLE

31

P3_7

USB_DP

IDLE

IR

IR

ON-OFF

ON-OFF 按键唤醒

其中 IR、ON-OFF 可以复用为 GPIO 功能。

IO 控制

上下拉

可以通过 gx_hal_padmux_set_io_pull 接口控制 P0_0 - P3_7 IO 内部上下拉状态,内部上下拉的状态有:上拉下拉上下拉无效。参考代码:

    static GX_HAL_PADMUX _padmux = {
        .regs = (void *)0xB0900000,
        .default_config = NULL,
        .padmux_max = 32,
    };

    gx_hal_padmux_set_io_pull(&_padmux, 7, GX_HAL_PADMUX_IO_PULL_UP); // 设置 P0_7 内部上拉

IO 复用(IO Matrix)

IO Matrix 模块是数字管脚复用模块,采用全功能用用的矩阵机制设计,即每一个具有通用复用功能的 IO(P0_0 - P3_7) 都可以复用成某个外设模块的功能。可以通过 gx_hal_padmux_set 设置 IO 复用功能,通过 gx_hal_padmux_get 获取 IO 复用功能。可复用的功能有:

NUM

FUNC

NUM

FUNC

NUM

FUNC

NUM

FUNC

0

IDLE

1

GPIOn

2

UART0_TX

3

UART0_RX

4

UART0_CTS

5

UART0_RTS

6

UART1_TX

7

UART1_RX

8

UART1_CTS

9

UART1_RTS

10

I2C0_SCL

11

I2C0_SDA

12

I2C1_SCL

13

I2C1_SDA

14

I2C2_SCL

15

I2C2_SDA

16

PWM0

17

PWM1

18

PWM2

19

PWM3

20

PWM4

21

PWM5

22

PWM6

23

PWM7

24

QUAD_X_A

25

QUAD_X_B

26

QUAD_Y_A

27

QUAD_Y_B

28

QUAD_Z_A

29

QUAD_Z_B

30

KEY_COL_0

31

KEY_COL_1

32

KEY_COL_2

33

KEY_COL_3

34

KEY_COL_4

35

KEY_COL_5

36

KEY_COL_6

37

KEY_COL_7

38

KEY_COL_8

39

KEY_COL_9

40

KEY_COL_10

41

KEY_COL_11

42

KEY_COL_12

43

KEY_COL_13

44

KEY_COL_14

45

KEY_COL_15

46

KEY_COL_16

47

KEY_COL_17

48

KEY_COL_18

49

KEY_COL_19

50

KEY_ROW_0

51

KEY_ROW_1

52

KEY_ROW_2

53

KEY_ROW_3

54

KEY_ROW_4

55

KEY_ROW_5

56

KEY_ROW_6

57

KEY_ROW_7

58

KEY_ROW_8

59

KEY_ROW_9

60

KEY_ROW_10

61

KEY_ROW_11

62

SPI2_CS0(Master)

63

SPI2_CS1(Master)

64

SPI2_CS2(Master)

65

SPI1_CLK(Master)

66

SPI1_D0(Master)

67

SPI1_D1(Master)

68

SPI1_D2(Master)

69

SPI1_D3(Master)

70

SPI1_CS(Master)

71

SPI2_CLK(Master)

72

SPI2_D0(Master)

73

SPI2_D1(Master)

74

SPI2_D2(Master)

75

SPI2_D3(Master)

76

SPI2_CS(Slave)

77

SPI2_CLK(Slave)

78

SPI2_D0(Slave)

79

SPI2_D1(Slave)

80

SPI2_D2(Slave)

81

SPI2_D3(Slave)

82

I2S_BCLK(Master)

83

I2S_LRCLK(Master)

84

I2S_DIN

85

I2S_DOUT

86

I2S_BCLK(Slave)

87

I2S_LRCLK(Slave)

88

SD_CLK

89

SD_CMD

90

SD_D0

91

SD_D1

92

SD_D2

93

SD_D3

94

95

MCLK

96

JTAG_RST

97

JTAG_TMS

98

JTAG_TCK

99

JTAG_TDI

100

JTAG_TDO

101

PDM_CLK

102

PDM0_DATA

103

PDM1_DATA

104

ANT0

105

ANT1

106

ANT2

107

ANT3

108

109

110

111

PWM_P

112

PMW_N

113

SD_CARD_DETECT

114

IRC_RX_TEST1(I)

115

IRC_TX_TEST1(I)

116

IRC_RX_TEST2(O)

117

118

119

120

121

122

123

124

125

126

IRC_TX_TEST2(O)

127

Reg Control

参考代码:

    static GX_HAL_PADMUX _padmux = {
        .regs = (void *)0xB0900000,
        .default_config = NULL,
        .padmux_max = 32,
    };

    gx_hal_padmux_set(&_padmux, 7, 2); // 设置 P0_7 复用功能为 UART0_TX
    gx_hal_padmux_set(&_padmux, 8, 3); // 设置 P1_0 复用功能为 UART0_RX