系统概述¶
Apus 是一款面向蓝牙 BLE 音频和 IoT 市场的高性能、低功耗芯片。内置了一个 32bit RISC-V CPU 核、一个 BLE 5.2 RF & Baseband 以及众多外设模块。
功能特性¶
处理器
|
时钟
|
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/DCache、L2-I/DCache。L1-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 |
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