系统概述

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/DCacheFlash 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 功能

开机电压配置

干电池 3V 供电 Case1

典型遥控封装,IO 电压 3V,使用 DCDC(BUCK)

  1. 关闭 5VLDO

  2. 开启 DCDC(BUCK)

  3. 降低 BypassLDO 到 1.0V

干电池 3V 供电 Case2

IO 电压 3V,不使用 DCDC(BUCK)

  1. 关闭 5VLDO

  2. BypassLDO 配置到 VDD09+0.2V,不能低于 1.1V

  3. 关闭 DCDC(BUCK)

锂电池供电

典型无线 Mic 封装,VBAT5 接锂电池/Charger, IO 电压 3V,使用 DCDC(BUCK)

  1. 配置 5VLDO 到 3V

  2. 开启 DCDC(BUCK)

  3. 降低 BypassLDO 到 1.0V

VBUS 供电

典型 Dongle 封装,VBAT5 接 USB VBUS,IO 电压 3V,不使用 DCDC(BUCK)

  1. 配置 5VLDO 到 3V

  2. 关闭 DCDC(BUCK)

  3. BypassLDO 配置到 VDD09+0.2V,不能低于 1.1V

休眠电压配置

  1. 配置 BypassLDO 到 1.1V

重要

Bypass LDO 配置原则:

  1. 不用 BUCK 的场景: (1) bypass LDO:配置成 VDD09+0.2V,最低不能低于 1.1V

  2. 使用 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 输入频率来源有两个:

  1. PLL 分频

  2. 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->clkrpll->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 的电压来源。在与外部供电环境交互的是有尤其需要注意。可以规避的做法包括:

  1. 硬件设计时:统一供电来源,外部 IO 与 APUS IO 的供电都统一为 VBAT3。

  2. 硬件设计时:不能让外部比 VBAT3 更高的电压从 P1 组灌进来。

XIP Flash 与 PSRAM 内存访问

当程序在 Flash 上 XIP 时,禁止使用 IBUS 对 PSRAM 进行数据读写,即不要使用 0x1000_0000 - 0x1FFF_FFFF 的地址空间进行数据访问。可以规避的做法是:

  1. SRAM/PSRAM 进行数据读写访问的时候,使用 DBUS 而不要用 IBUS。

PLL

PLL 的配置位,ENSAT 寄存器默认为 1,应该在 PLL 使用前尽早配置成 0,该位会使得 PLL 锁定变慢。

测试报告以及性能数据

测试报告和性能数据网盘地址 企业空间/芯片项目/Apus/芯片测试报告/NRE/SPD负责部分