系统概述¶
Apus 系列芯片是一款面向蓝牙 BLE 音频和 IoT 市场的高性能、低功耗芯片。内置了一个 32bit RISC-V CPU 核、一个 BLE 5.3 RF & Baseband 以及众多外设模块。
RISC-V 核¶
Apus 系列芯片处理器是一个 RISC-V 核。主要特性如下:
32 位 RISC-V 指令架构
支持 RISC-V 32/16 位混编指令集
32 个 32 位通用寄存器
整形 5 级/浮点 7 级,弹发射,顺序执行流水线
支持 RISC-V 机器模式和用户模式
双周期硬件乘法器,基 4 硬件除法器
16KB 指令 cache(I-CACHE)、4KB 数据 cache(D-CACHE);Cache Line 大小 32B
兼容 RISC-V CLIC 中断标准,支持中断嵌套
兼容 RISC-V PMU 内存保护标准
支持 AHB-Lite 总线协议,支持三条总线:指令总线、数据总线和系统总线
工作频率最高可达 120MHz
中断¶
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 |
Flash Cache |
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 |
PLL |
|
49 |
SAR ADC |
|
50 |
BT |
|
51 |
AUDIO_E |
|
52 |
Sample |
|
53 |
RTC |
|
54 |
LPC |
|
55 |
Wakeup Event |
|
56 |
保留 |
|
57 |
cpu_dvfs_int |
|
58 |
ISMBB |
|
59 |
保留 |
|
60 |
GA_LITE |
|
61 |
PMU |
DCDC BUCK OK |
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
、Flash Cache
(L2-ICache)。L1-I/DCache
是 RISC-V 内部 Cache;Flash Cache
是 Flash XIP 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 |
其中 gx_cache.h
封装好了一套带 gx_
前缀的接口,更方便使用。以下是统计 cache 命中结果的示例:
#include <common.h>
#include <gx_cache.h>
#include <gx_clock.h>
extern void benchmark_coremark_main(void);
int coremark_test(void)
{
uint32_t icache_access, icache_miss;
uint32_t dcache_access, dcache_miss;
// 使能 cache 命中统计功能
gx_icache_enable_profile();
gx_dcache_enable_profile();
// 复位命中计数
gx_icache_reset_profile();
gx_icache_reset_profile();
// 执行需要统计的代码
benchmark_coremark_main();
// 获取统计结果
icache_access = gx_icache_get_access_time();
icache_miss = gx_icache_get_miss_time();
dcache_access = gx_dcache_get_access_time();
dcache_miss = gx_dcache_get_miss_time();
printf("CPU FREQ :%d\n", gx_clk_mod_get_freq(GX_CLK_MOD_CPU));
printf("icache access :%d\n", icache_access);
printf("icache miss :%d\n", icache_miss);
printf("dcache access :%d\n", dcache_access);
printf("dcache miss :%d\n", dcache_miss);
return 0;
}
存储系统¶
Apus 系列芯片存储器分为两类:片上存储器
、片外存储器
。详细信息如下:
片上存储器
16KB ROM
16KB SRAM0
16KB SRAM1
16KB SRAM2
16KB SRAM3
16KB SRAM4
16KB SRAM5
16KB SRAM6
16KB SRAM7
片外存储器
1MB/2MB/4MB/8MB/16MB SPI FLASH XIP
1MB/2MB/4MB/8MB/16MB SPI PSRAM
存储系统物理地址¶
存储器物理地址见下表
存储器 |
物理地址 |
空间大小 |
备注 |
---|---|---|---|
SRAM 0 - SRAM7 |
0x0000_0000 - 0x0001_FFFF |
128KB |
实际内存大小和芯片型号相关 |
SRAM_SHARE_L2ICACH |
0x0002_0000 - 0x0002_3FFF |
16KB |
L2ICache 不开时可复用为普通 SRAM |
SRAM_SHARE_MMC |
0x0002_4000 - 0x0002_43FF |
1KB |
MMC 不用时可复用为普通 SRAM |
SRAM_SHARE_USB |
0x0002_4400 - 0x0002_4FFF |
3KB |
USB 不用时可复用为普通 SRAM |
PSRAM |
0x0100_0000 - 0x01FF_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 - SRAM7 |
0x1000_0000 - 0x1001_FFFF |
128KB |
I-CACHE |
指令总线 |
SRAM_SHARE_L2ICACH |
0x1002_0000 - 0x1002_3FFF |
16KB |
I-CACH |
指令总线 |
SRAM_SHARE_MMC |
0x1002_4000 - 0x1002_43FF |
1KB |
I-CACHE |
指令总线 |
SRAM_SHARE_USB |
0x1002_4400 - 0x1002_4FFF |
3KB |
I-CACHE |
指令总线 |
PSRAM |
0x1100_0000 - 0x11FF_FFFF |
16MB |
I-CACHE |
指令总线 |
FLASH XIP |
0x1300_0000 - 0x13FF_FFFF |
16MB |
I-CACHE |
数据总线 |
SRAM0 - SRAM7 |
0x2000_0000 - 0x2001_FFFF |
128KB |
D-CACHE |
数据总线 |
SRAM_SHARE_L2ICACH |
0x2002_0000 - 0x2002_3FFF |
16KB |
D-CACHE |
数据总线 |
SRAM_SHARE_MMC |
0x2002_4000 - 0x2002_43FF |
1KB |
D-CACHE |
数据总线 |
SRAM_SHARE_USB |
0x2002_4400 - 0x2002_4FFF |
3KB |
D-CACHE |
数据总线 |
PSRAM |
0x2100_0000 - 0x21FF_FFFF |
16MB |
D-CACHE |
数据总线 |
SRAM0 - SRAM7 |
0x3000_0000 - 0x3001_FFFF |
128KB |
不可 CACHE |
数据总线 |
PSRAM |
0x3200_0000 - 0x32FF_FFFF |
16MB |
不可 CACHE |
数据总线 |
SRAM_SHARE_L2ICACH |
0x3002_0000 - 0x3002_3FFF |
16KB |
不可 CACHE |
数据总线 |
SRAM_SHARE_MMC |
0x2002_4000 - 0x3002_43FF |
1KB |
不可 CACHE |
数据总线 |
SRAM_SHARE_USB |
0x3002_4400 - 0x3002_4FFF |
3KB |
不可 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 |
|
SARADC_CTRL |
0xB030_0000 - 0xB030_01FF |
|
SARADC_ANA |
0xB030_0200 - 0xB030_02FF |
|
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 |
随机数 |
eFuse |
0xB0C0_0000 - 0xB0CF_FFFF |
电源管理单元,低功耗断电 |
PMU-CORE |
0xB0D0_0000 - 0xB0DF_FFFF |
|
SYS_I2C |
0xB0E0_0000 - 0xB0EF_FFFF |
|
GA_LITE |
0xB0F0_0000 - 0xB0FF_FFFF |
|
SDIO |
0xB100_0000 - 0xB1FF_FFFF |
|
USB |
0xB200_0000 - 0xB2FF_FFFF |
|
DMA |
0xB300_0000 - 0xB3FF_FFFF |
|
BT |
0xB400_0000 - 0xB4FF_FFFF |
蓝牙 |
SYS-CONFIG |
0xB500_0000 - 0xB5FF_FFFF |
系统配置 |
AUDIO_IN |
0xB600_0000 - 0xB60F_FFFF |
|
I2S |
0xB610_0000 - 0xB61F_FFFF |
|
AUDIO_OUT |
0xB620_0000 - 0xB62F_FFFF |
|
AUDIO_E |
0xB640_0000 - 0xB64F_FFFF |
|
LODAC |
0xB650_0000 - 0xB65F_FFFF |
|
AUDIO_CODEC |
0xB660_0000 - 0xB65F_FFFF |
|
SARADC_DMA |
0xB800_0000 - 0xB8FF_FFFF |
|
L1-Icache |
0xF010_0000 - 0xF01F_FFFF |
|
MMU |
0xF020_0000 - 0xF02F_FFFF |
IO PAD¶
IO PAD 类型¶
Apus 系列芯片中所有 IO PAD 大概可分为以下几类:电源 IO
、数字 IO
、模拟 IO
。其中电源 IO
是独占 IO,软件不需要关心,数字 IO
和模拟 IO
可以在同一个 IO 上。数字/模拟 IO 如下表所示:
GPIO 号 |
PAD 名称 |
特殊功能 |
可否唤醒 |
默认功能 |
默认输入/输出/高阻 |
上下拉 |
---|---|---|---|---|---|---|
0 |
P0_0 |
否 |
IDLE |
高阻 |
无 |
|
1 |
P0_1 |
可 |
IDLE |
高阻 |
无 |
|
2 |
P0_2 |
可 |
IDLE |
高阻 |
无 |
|
3 |
P0_3 |
可 |
IDLE |
高阻 |
无 |
|
4 |
P0_4 |
可 |
IDLE |
高阻 |
无 |
|
5 |
P0_5 |
可 |
UART0_RX |
输入 |
上拉 |
|
6 |
P0_6 |
可 |
UART0_TX |
输出 |
无 |
|
7 |
P0_7 |
可 |
BOOT PIN |
输入 |
上拉 |
|
8 |
P1_0 |
AIN0 |
可 |
IDLE |
高阻 |
无 |
9 |
P1_1 |
AIN1 |
可 |
IDLE |
高阻 |
无 |
10 |
P1_2 |
AIN2 |
可 |
JTAG_TMS |
随机 |
无 |
11 |
P1_3 |
AIN3 |
可 |
JTAG_TCK |
输入 |
上拉 |
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 |
可 |
SYSI2C_SDA |
输入 |
上拉 |
|
18 |
P2_2 |
可 |
IDLE |
高阻 |
无 |
|
19 |
P2_3 |
可 |
IDLE |
高阻 |
无 |
|
20 |
P2_4 |
可 |
IDLE |
高阻 |
无 |
|
21 |
P2_5 |
可 |
IDLE |
高阻 |
无 |
|
22 |
P2_6 |
USB_DM |
可 |
IDLE |
输入 |
无 |
23 |
P2_7 |
USB_DP |
可 |
IDLE |
输入 |
无 |
24 |
P3_0 |
可 |
IDLE |
输入 |
上拉 |
|
25 |
P3_1 |
可 |
SYSI2C_SCL |
输入 |
上拉 |
|
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 |
否 |
IDLE |
高阻 |
无 |
|
31 |
P3_7 |
否 |
IDLE |
高阻 |
无 |
|
32 |
P4_0 |
否 |
仅可作为 GPIO32 使用 |
高阻 |
无 |
|
33 |
P4_1 |
否 |
仅可作为 GPIO33 使用 |
高阻 |
无 |
|
34 |
P4_2 |
否 |
仅可作为 GPIO34 使用 |
输入 |
无 |
|
35 |
P4_3 |
IR |
否 |
仅可作为 IR、GPIO35 使用 |
高阻 |
无 |
36 |
P4_4 |
ON-OFF 按键唤醒 |
可 |
仅可作为 ON-OFF、GPIO36 使用 |
输入 |
上拉 |
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 内部上拉
模块硬件参数¶
UART¶
FIFO 深度(Byte) |
DLF(小数分频)宽度(bit) |
推荐的高速波特率及对应的 uart 时钟配置 |
---|---|---|
UART0:32 UART1:32 |
6 |
1M(16MHZ)、1.5M(24MHZ)、2M(32MHZ)、3M(48MHZ) |
DMA¶
握手信号¶
握手号 |
对应外设 |
---|---|
0 |
I2C0, RX 还是 TX 由用户寄存器配置(0x1080) |
1 |
I2C1, RX 还是 TX 由用户寄存器配置(0x1080) |
2 |
I2C2, RX 还是 TX 由用户寄存器配置(0x1080) |
3 |
SARADC RX |
4 |
ISMBB RX |
5 |
ISMBB TX |
6 |
UART0_RX |
7 |
UART0_TX |
8 |
UART1_RX |
9 |
UART1_TX |
10 |
SPI0(Flash SPI) RX |
11 |
SPI0(Flash SPI) TX |
12 |
SPI1(PSRAM SPI) RX |
13 |
SPI1(PSRAM SPI) TX |
14 |
SPI2(通用 SPI) RX |
15 |
SPI2(通用 SPI) TX |
DMA Master 接口使用¶
DMA0 接入 Flash SPI XIP 入口, 用于 Flash 读访问,不过 Flash CACHE。
DMA1 接入 System Bus, 用于支持 DMA 外设的访问。
DMA2 和 DMA3 接入内存系统的 Bus Matrix, 都用于内存访问,提高 memory to memory 的性能。
FLASH CACHE¶
配置为 2 路组相关
Cache 缓存大小支持 0KB/16KB 可配
支持映射的 Flash 空间为 16MB
USB¶
上行端点 4 个
下行端点 4 个
SPI¶
TX FIFO 深度 |
RX FIFO 深度 |
XIP TX FIFO 深度 |
XIP RX FIFO 深度 |
最高输出频率 |
CS片选数量 |
|
---|---|---|---|---|---|---|
通用 SPI |
16x32bit |
8x32bit |
0bit |
0bit |
50MHz |
3 |
Flash SPI |
8x32bit |
8x32bit |
0bit |
16x32bit |
100MHz |
1 |
Psram SPI |
8x32bit |
8x32bit |
8x32bit |
8x32bit |
80MHz |
1 |
FLASH SPI、PSRAM SPI 在事业部硬件平台板子上不同频率下的 sample delay 范围值:¶
事业部硬件板子,芯片型号:8301A,flash 型号:内置 P25Q40L,测试 flash spi 读取数据采样 sample delay 范围值:¶
core电压 |
实测VDD09电压(V) |
时钟源pll |
cpu分频系数 |
cpu频率 |
xip时钟源分频系数 |
xip内部分频 |
xip工作频率 |
sample delay范围值 |
sample delay建议值 |
---|---|---|---|---|---|---|---|---|---|
0.9 |
0.91 |
32 |
1 |
32 |
1 |
2 |
16 |
0, 1, 2 |
1 |
0.9 |
0.91 |
48 |
1 |
48 |
1 |
2 |
24 |
0, 1, 2, 3 |
1 |
1.0 |
1.0 |
64 |
1 |
64 |
1 |
2 |
32 |
0, 1, 2, 3 |
1 |
1.0 |
1.0 |
96 |
1 |
96 |
1 |
2 |
48 |
1, 2, 3, 4 |
2 |
1.0 |
1.0 |
128 |
1 |
128 |
1 |
2 |
64 |
2, 3, 4 |
3 |
1.0 |
1.0 |
320 |
3 |
106.6 |
2 |
2 |
80 |
3, 4, 5 |
4 |
1.1 |
1.09 |
140 |
1 |
140 |
1 |
2 |
70 |
2, 3, 4 |
3 |
事业部硬件板子,芯片型号:8302A,flash 型号:内置 P25Q80L,测试 flash spi 读取数据采样 sample delay 范围值:¶
core电压 |
实测VDD09电压(V) |
时钟源pll |
cpu分频系数 |
cpu频率 |
xip时钟源分频系数 |
xip内部分频 |
xip工作频率 |
sample delay范围值 |
sample delay建议值 |
---|---|---|---|---|---|---|---|---|---|
0.9 |
0.88 |
32 |
1 |
32 |
1 |
2 |
16 |
0, 1, 2 |
1 |
0.9 |
0.88 |
48 |
1 |
48 |
1 |
2 |
24 |
0, 1, 2, 3 |
1 |
1.0 |
0.96 |
64 |
1 |
64 |
1 |
2 |
32 |
0, 1, 2, 3 |
1 |
1.0 |
0.96 |
96 |
1 |
96 |
1 |
2 |
48 |
1, 2, 3, 4 |
2 |
1.0 |
0.96 |
128 |
1 |
128 |
1 |
2 |
64 |
2, 3, 4 |
3 |
1.0 |
0.96 |
320 |
3 |
106.6 |
2 |
2 |
80 |
3, 4, 5 |
4 |
1.1 |
1.05 |
140 |
1 |
140 |
1 |
2 |
70 |
2, 3, 4 |
3 |
事业部硬件板子,芯片型号:8302B,flash 型号:外置 P25Q80L,psram 型号:内置 aps1604M-SQR, 测试 flash spi、psram spi 读取数据采样 sample delay 范围值:¶
core电压 |
实测VDD09电压(V) |
时钟源pll |
cpu分频系数 |
cpu频率 |
xip时钟源分频系数 |
xip内部分频 |
xip工作频率 |
sample delay范围值 |
sample delay建议值 |
备注 |
psram时钟源分频 |
psram内部分频 |
psram工作频率 |
psram sample delay范围值 |
psram sample delay建议值 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0.9 |
0.88 |
32 |
1 |
32 |
1 |
2 |
16 |
0, 1, 2, 3 |
1 |
1 |
2 |
16 |
0, 1, 2, 3 |
1 |
|
0.9 |
0.88 |
48 |
1 |
48 |
1 |
2 |
24 |
1, 2, 3 |
2 |
1 |
2 |
24 |
1, 2, 3 |
2 |
|
1.0 |
0.97 |
64 |
1 |
64 |
1 |
2 |
32 |
1, 2, 3, 4 |
2 |
1 |
2 |
32 |
1, 2, 3, 4 |
2 |
|
1.0 |
0.97 |
96 |
1 |
96 |
1 |
2 |
48 |
2, 3, 4, 5 |
3 |
1 |
2 |
48 |
2, 3, 4, 5 |
3 |
|
1.0 |
0.97 |
128 |
1 |
128 |
1 |
2 |
64 |
3, 4, 5, 6 |
4 |
1 |
2 |
64 |
3, 4, 5, 6 |
4 |
|
1.0 |
0.97 |
320 |
3 |
106.6 |
2 |
2 |
80 |
5, 6, 7 |
6 |
2 |
2 |
80 |
4, 5, 6, 7 |
5 |
|
1.0 |
0.97 |
320 |
3 |
106.6 |
1 |
4 |
80 |
9, 10, 11, 12, 13, 14 |
11 |
1 |
4 |
80 |
8, 9, 10, 11, 12, 13, 14 |
11 |
|
1.1 |
1.05 |
140 |
1 |
140 |
1 |
2 |
70 |
4, 5, 6 |
5 |
1 |
2 |
70 |
3, 4, 5, 6 |
4 |
事业部硬件板子,芯片型号:8302B,flash 型号:外置 GD25LQ32E,psram 型号:内置 aps1604M-SQR, 测试 flash spi、psram spi 读取数据采样 sample delay 范围值:¶
core电压 |
实测VDD09电压(V) |
时钟源pll |
cpu分频系数 |
cpu频率 |
xip时钟源分频系数 |
xip内部分频 |
xip工作频率 |
xip sample delay范围值 |
xip sample delay建议值 |
备注 |
psram时钟源分频 |
psram内部分频 |
psram工作频率 |
psram sample delay范围值 |
psram sample delay建议值 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0.9 |
0.87 |
32 |
1 |
32 |
1 |
2 |
16 |
0, 1, 2 |
1 |
1 |
2 |
16 |
0, 1, 2, 3 |
1 |
|
0.9 |
0.87 |
48 |
1 |
48 |
1 |
2 |
24 |
0, 1, 2, 3 |
1 |
1 |
2 |
24 |
1, 2, 3 |
2 |
|
1.0 |
0.95 |
64 |
1 |
64 |
1 |
2 |
32 |
0, 1, 2, 3 |
1 |
1 |
2 |
32 |
1, 2, 3, 4 |
2 |
|
1.0 |
0.95 |
96 |
1 |
96 |
1 |
2 |
48 |
1, 2, 3, 4 |
2 |
1 |
2 |
48 |
2, 3, 4, 5 |
3 |
|
1.0 |
0.95 |
128 |
1 |
128 |
1 |
2 |
64 |
2, 3, 4, 5 |
3 |
1 |
2 |
64 |
3, 4, 5, 6 |
4 |
|
1.0 |
0.95 |
320 |
3 |
106.6 |
2 |
2 |
80 |
3, 4, 5 |
4 |
2 |
2 |
80 |
4, 5, 6, 7 |
5 |
|
1.0 |
0.95 |
320 |
3 |
106.6 |
1 |
4 |
80 |
6, 7, 8, 9, 10, 11 |
8 |
2 |
2 |
80 |
4, 5, 6, 7 |
5 |
|
1.0 |
0.95 |
170 |
2 |
85 |
1 |
2 |
85 |
3, 4, 5, 6 |
4 |
1 |
2 |
85 |
5, 6, 7 |
6 |
|
1.0 |
0.95 |
360 |
3 |
120 |
2 |
2 |
90 |
3, 4, 5, 6 |
5 |
3 |
2 |
60 |
3, 4, 5, 6 |
4 |
|
1.0 |
0.95 |
400 |
4 |
100 |
2 |
2 |
100 |
4, 5, 6 |
5 |
3 |
2 |
66.6 |
4, 5, 6 |
5 |
|
1.0 |
0.95 |
440 |
4 |
110 |
2 |
2 |
110 |
4, 5, 6, 7 |
5 |
3 |
2 |
73.3 |
4, 5, 6, 7 |
5 |
|
1.1 |
1.04 |
140 |
1 |
140 |
1 |
2 |
70 |
2, 3, 4, 5 |
3 |
1 |
2 |
70 |
3, 4, 5, 6 |
4 |
MMU¶
通道数 8
LoDAC¶
单声道输出
Audio Out¶
不支持转采样、EQ 和 DRC 功能
开机电压配置¶
锂电池供电¶
典型无线 Mic 封装,VBAT5 接锂电池/Charger, IO 电压 3V,使用 DCDC(BUCK)
配置 5VLDO 到 3V
开启 DCDC(BUCK)
降低 BypassLDO 到 1.0V
VBUS 供电¶
典型 Dongle 封装,VBAT5 接 USB VBUS,IO 电压 3V,不使用 DCDC(BUCK)
配置 5VLDO 到 3V
关闭 DCDC(BUCK)
BypassLDO 配置到 VDD09+0.2V,不能低于 1.1V
休眠电压配置¶
配置 BypassLDO 到 1.1V
重要
Bypass LDO 配置原则:
不用 BUCK 的场景: (1) bypass LDO:配置成 VDD09+0.2V,最低不能低于 1.1V
使用 BUCK 的场景: (1) VBUCK 配置成 VDD09+0.2V,最低不能低于 1.1V (2) bypass LDO 配置成 1.0V(上电后,休眠前只需要配一次即可) (3) 进入休眠前,bypass LDO 配置成 1.1V
动态调频调压¶
Apus 芯片支持动态调频调压,频率较低时可以用较低电压以降低工作功耗,频率较高时必须用较高电压配置,否则无法达成。应用建议配置如下:
HCLK/CPU CLK |
VDD09 配置 |
SRAM 电压配置 |
PLL CLK |
XIP CLK |
BUCK 配置(如果使能 BUCK) |
Bypass LDO(不开 BUCK) |
---|---|---|---|---|---|---|
f <= 32M |
0.91V 档(Trim 后) |
0.9V 档 |
不开 PLL |
不高于 32M |
1.1V |
1.1V |
32M < f <= 64M |
0.94V 档(Trim 后) |
1.0V 档 |
不高于 260M |
不高于 130M |
1.1V |
1.1V |
64M < f <= 112M |
1.03V 档(Trim 后) |
1.1V 档 |
不高于 400M |
不高于 200M |
1.2V |
1.2V |
112M < f <= 160M |
1.12V 档(Trim 后) |
1.1V 档 |
不高于 400M |
不高于 220M |
1.3V |
1.3V |
按照上述的表格建议,以调频为驱动,当目标频率离开当前区间,则启动调整操作,操作涉及如下三个处理:
VDD09 电压调整
各个频率点的频率调节
SRAM 的档位配置
频率从低到高跨区域,需要按照顺序进行如下操作:
提高电压
提高 SRAM 的档位配置
升频
当前频率为 96M,CPU 升频到 160M,参考代码:
#include <gx_clock.h>
#include <base_addr.h>
#include <soc.h>
#include <gx_hal_pmu_apus.h>
// 1. 提升电压到 1.12V
static GX_HAL_PMU pmu_dev = {
.regs = (void *)GX_REG_BASE_ULP,
};
GX_HAL_PMU_LDO_CFG ldo_cfg;
gx_hal_pmu_get(&pmu_dev, GX_HAL_PMU_CMD_LDO, &ldo_cfg);
ldo_cfg.dig_ldo_cfg.vsel = GX_HAL_PMU_DIG_LDO_VOLTAGE_1_12V; // 先提升电压到 1.12V
gx_hal_pmu_set(&pmu_dev, GX_HAL_PMU_CMD_LDO, &ldo_cfg);
// 2. SRAM 档位调节
static GX_HAL_PMU pmu_dev = {
.regs = (void *)GX_REG_BASE_ULP,
};
gx_hal_pmu_set_sram_voltage(&pmu_dev, GX_HAL_PMU_SRAM_VOLTAGE_1_1V);
// 3. 提升频率
typedef struct {
uint8_t enable;
uint8_t clkr;
uint8_t clkod;
uint16_t clkf;
uint16_t bwadj;
} GX_CLK_PLL;
static int _pll_out_select(GX_CLK_PLL *pll, int pll_out)
{
if (!pll)
return -1;
switch(pll_out) {
case 48000000:
pll->clkr = 1;
pll->clkf = 12;
pll->clkod = 8;
pll->bwadj = 2;
break;
case 96000000:
pll->clkr = 1;
pll->clkf = 12;
pll->clkod = 4;
pll->bwadj = 2;
break;
case 160000000:
pll->clkr = 1;
pll->clkf = 10;
pll->clkod = 2;
pll->bwadj = 1;
default:
return -1;
}
return 0;
}
GX_CLK_PLL pll;
pll.enable = 1; // PLL 使能配置
if (_pll_out_select(&pll, 160000000) < 0) // PLL 输出频率 160M
pll.enable = 0;
gx_clk_src_set_pll(&pll); // 设置时钟源为 PLL
gx_clk_mod_set_div(GX_CLK_MOD_CPU, 1); // CPU 分频系数设置为 1, CPU 频率为 160M
频率从高到低跨区域,需要按顺序进行如下操作:
降频
降低 SRAM 的档位配置
降低电压
当前频率为 160M,CPU 降频到 96M,参考代码:
#include <gx_clock.h>
#include <base_addr.h>
#include <soc.h>
#include <gx_hal_pmu_apus.h>
// 1. 降低频率
typedef struct {
uint8_t enable;
uint8_t clkr;
uint8_t clkod;
uint16_t clkf;
uint16_t bwadj;
} GX_CLK_PLL;
static int _pll_out_select(GX_CLK_PLL *pll, int pll_out)
{
if (!pll)
return -1;
switch(pll_out) {
case 48000000:
pll->clkr = 1;
pll->clkf = 12;
pll->clkod = 8;
pll->bwadj = 2;
break;
case 96000000:
pll->clkr = 1;
pll->clkf = 12;
pll->clkod = 4;
pll->bwadj = 2;
break;
case 160000000:
pll->clkr = 1;
pll->clkf = 10;
pll->clkod = 2;
pll->bwadj = 1;
default:
return -1;
}
return 0;
}
GX_CLK_PLL pll;
pll.enable = 1; // PLL 使能配置
if (_pll_out_select(&pll, 96000000) < 0) // PLL 输出频率 96M
pll.enable = 0;
gx_clk_src_set_pll(&pll); // 设置时钟源为 PLL
gx_clk_mod_set_div(GX_CLK_MOD_CPU, 1); // CPU 分频系数设置为 1,CPU 频率为 96M
// 2. SRAM 档位调节
static GX_HAL_PMU pmu_dev = {
.regs = (void *)GX_REG_BASE_ULP,
};
gx_hal_pmu_set_sram_voltage(&pmu_dev, GX_HAL_PMU_SRAM_VOLTAGE_1_1V);
// 3. 降低电压到 1.03V
static GX_HAL_PMU pmu_dev = {
.regs = (void *)GX_REG_BASE_ULP,
};
GX_HAL_PMU_LDO_CFG ldo_cfg;
gx_hal_pmu_get(&pmu_dev, GX_HAL_PMU_CMD_LDO, &ldo_cfg);
ldo_cfg.dig_ldo_cfg.vsel = GX_HAL_PMU_DIG_LDO_VOLTAGE_1_03V; // 降低电压到 1.03V
gx_hal_pmu_set(&pmu_dev, GX_HAL_PMU_CMD_LDO, &ldo_cfg);
重要
如果使能了 BUCK, 需要确保 BUCK 电压和 VDD09 匹配。
PLL/CPU 频率调节接口¶
CPU 输入频率来源有两个:
PLL 分频
32M 晶振
当 CPU 频率源由 PLL 分频而来时,如果需要修改 CPU 频率首先要修改 PLL 输出频率,修改方法如下:
#include <gx_clock.h>
#include <base_addr.h>
#include <soc.h>
#include <gx_hal_pmu_apus.h>
typedef struct {
uint8_t enable;
uint8_t clkr;
uint8_t clkod;
uint16_t clkf;
uint16_t bwadj;
} GX_CLK_PLL;
static int _pll_out_select(GX_CLK_PLL *pll, int pll_out)
{
if (!pll)
return -1;
switch(pll_out) {
case 48000000:
pll->clkr = 1;
pll->clkf = 12;
pll->clkod = 8;
pll->bwadj = 2;
break;
case 96000000:
pll->clkr = 1;
pll->clkf = 12;
pll->clkod = 4;
pll->bwadj = 2;
break;
case 160000000:
pll->clkr = 1;
pll->clkf = 10;
pll->clkod = 2;
pll->bwadj = 1;
default:
return -1;
}
return 0;
}
GX_CLK_PLL pll;
pll.enable = 1; // PLL 使能配置
if (_pll_out_select(&pll, 96000000) < 0) // PLL 输出频率 96M
pll.enable = 0;
gx_clk_src_set_pll(&pll); // 设置时钟源为 PLL
gx_clk_mod_set_div(GX_CLK_MOD_CPU, 1); // CPU 分频系数设置为 1, CPU 频率为 96M
其中 pll->clkr
、pll->clkf
等是 PLL 频率配置参数。不同频率对于的配置参数如下表:
频率 |
clkr |
clkf |
clkod |
bwadj |
---|---|---|---|---|
32M |
1 |
2 |
2 |
1 |
48M |
1 |
12 |
8 |
2 |
64M |
1 |
12 |
6 |
2 |
96M |
1 |
12 |
4 |
2 |
128M |
1 |
8 |
2 |
1 |
140M |
4 |
35 |
2 |
4 |
148M |
4 |
37 |
2 |
5 |
160M |
1 |
10 |
2 |
1 |
168M |
2 |
21 |
2 |
3 |
170M |
8 |
85 |
2 |
11 |
220M |
4 |
55 |
2 |
7 |
320M |
1 |
10 |
1 |
1 |
360M |
4 |
45 |
1 |
6 |
400M |
2 |
25 |
1 |
3 |
440M |
4 |
55 |
1 |
7 |
当 CPU 频率源是 32M 晶振时,CPU 不能分频,只能跑 32M。下面给出关闭 PLL,CPU 切换到 32M 晶振的方法:
#include <gx_clock.h>
#include <base_addr.h>
#include <soc.h>
// 所有时钟源都切换到 32M
for (int i = 0; i < GX_CLK_MOD_MAX; i++) {
gx_hal_clk_mod_set_src(i, GX_CLK_MOD_SRC_32M);
}
// 关闭 PLL
GX_CLK_PLL pll;
pll.enable = 0;
gx_clk_src_set_pll(&pll)
VDD09 调节¶
可通过 pmu 接口调节 VDD09 电压,电压值参考结构体 GX_HAL_PMU_DIG_LDO_VOLTAGE。
#include <gx_clock.h>
#include <base_addr.h>
#include <soc.h>
#include <gx_hal_pmu_apus.h>
static GX_HAL_PMU pmu_dev = {
.regs = (void *)GX_REG_BASE_ULP,
};
GX_HAL_PMU_LDO_CFG ldo_cfg;
gx_hal_pmu_get(&pmu_dev, GX_HAL_PMU_CMD_LDO, &ldo_cfg);
ldo_cfg.dig_ldo_cfg.vsel = GX_HAL_PMU_DIG_LDO_VOLTAGE_0_91V;
gx_hal_pmu_set(&pmu_dev, GX_HAL_PMU_CMD_LDO, &ldo_cfg);
SRAM 电压档位调节¶
可通 pmu 接口调节 SRAM 电压档位,电压档位可参考结构体 GX_HAL_PMU_SRAM_VOLTAGE。
#include <base_addr.h>
#include <soc.h>
#include <gx_hal_pmu_apus.h>
static GX_HAL_PMU pmu_dev = {
.regs = (void *)GX_REG_BASE_ULP,
};
gx_hal_pmu_set_sram_voltage(&pmu_dev, GX_HAL_PMU_SRAM_VOLTAGE_1_0V);
注意事项¶
SARADC 及相关 IO 的使用限制¶
当使用 SARADC 时,P1_0 - P1_7 组 IO,不可以有来自外部的高于 VBAT3 的电压来源。在与外部供电环境交互的是有尤其需要注意。可以规避的做法包括:
硬件设计时:统一供电来源,外部 IO 与 APUS IO 的供电都统一为 VBAT3。
硬件设计时:不能让外部比 VBAT3 更高的电压从 P1 组灌进来。
XIP Flash 与 PSRAM 内存访问¶
当程序在 Flash 上 XIP 时,禁止使用 IBUS 对 PSRAM 进行数据读写,即不要使用 0x1000_0000 - 0x1FFF_FFFF 的地址空间进行数据访问。可以规避的做法是:
SRAM/PSRAM 进行数据读写访问的时候,使用 DBUS 而不要用 IBUS。
PLL¶
PLL 的配置位,ENSAT 寄存器默认为 1,应该在 PLL 使用前尽早配置成 0,该位会使得 PLL 锁定变慢。
测试报告以及性能数据¶
测试报告和性能数据网盘地址 企业空间/芯片项目/Apus/芯片测试报告/NRE/SPD负责部分
。