平台概述

在本章中,我们将整体介绍 RTL8752H 平台,内容包括 硬件架构软件系统 设计,以及如何使用 SDK 进行 应用程序开发。此外,本章还涵盖了 Boot 流程中断管理蓝牙应用 的基本工作原理等重要主题,以帮助开发者全面掌握平台资源,实现高效开发。

开发人员如果想快速上手 RTL8752H 开发板并运行第一个应用程序,可以访问 快速入门

硬件架构

RTL8752H 的 CPU 为 Cortex-M0+(基于 ARMv6-M 架构),其最高主频可达 40MHz。

RTL8752H 硬件架构 主要由以下硬件单元组成:

  • 丰富的外设

  • 电源管理单元

  • 时钟管理单元

  • RF 模块

../../../_images/RTL8752H_Hardware_Block.png

RTL8752H 硬件架构

软件系统

软件架构

RTL8752H 软件架构 如下,主要有以下层级组成:

  • Platform Features: 包括 Flash Driver,Clock Manager,Power Manager,OTA 等。

  • Peripheral Driver: 提供应用层访问 RTL8752H 外设的接口。

  • Bluetooth LE Stack: Realtek 实现的 BT Controller 和 BT Host 层。

  • GAP: 应用程序和 BLE 协议栈交互的抽象层。

  • OSIF: Realtek 提供的实时操作系统的抽象层。

../../../_images/RTL8752H_Software_Architecture.png

RTL8752H 软件架构

操作系统

RTL8752H 支持多种 RTOS,默认使用的是 FreeRTOS V10.4.4。

备注

RTL8752H 的 FreeRTOS 运行在 ROM 上。

OSIF

OS Interface (OSIF) 是由 Realtek 抽象出来的通用 OS 接口层。OSIF 通过封装特定的 RTOS 接口来提供统一的接口。

使用 OSIF 的最大优势在于:开发者如果想要让上层应用运行在不同的 RTOS 上,可以将 OSIF 对接到相应 RTOS 上,而不需要对上层软件做任何修改。因此,我们也十分建议开发者在开发应用时使用 OSIF 接口,而不是直接访问特定 RTOS 的接口。

../../../_images/OSIF_Overview.png

OSIF 架构

备注

OSIF 模块头文件请参考 inc/os/os_*.h

任务

RTL8752H 的任务 是基于 FreeRTOS 设计的,默认支持抢占式线程。其任务优先级可以设置为 0~6,数字越大表示优先级越高。

系统默认创建的任务有:

  • FreeRTOS 默认创建:Timer Task、Idle Task

  • 蓝牙协议栈默认创建:Bluetooth Controller Task、Bluetooth Host Task

应用程序可以根据实际的需求创建 Task,优先级建议设定在 1~4。

RTL8752H 的任务

任务

说明

优先级

Timer

FreeRTOS 用于实现软件定时器的任务

6

Bluetooth Controller

蓝牙 HCI 层以下的协议栈实现

6

Bluetooth Host

蓝牙 HCI 层以上的协议栈实现

5

APP

应用层功能的实现

建议优先级为 1~4

Idle

后台空闲任务,包括低功耗的处理

0

启动流程

RTL8752H 系统在上电或者重启时,都会执行启动流程,说明如下:

../../../_images/Boot_Flow.png

启动流程图

启动流程说明

步骤

说明

eFuse 校验

对 eFuse 中的值进行校验,如果校验失败,则直接判定为 Boot 失败

安全控制

根据 eFuse 设定进行对应的安全控制,例如 SWD 是否打开、更新 Boot Config 设定等

Image 校验

  • 根据 efuse 中是否开启 Secure Boot 功能,对 Image 进行相应的校验,请参考 校验方式

  • 根据 Flash Layout 是单 Bank 还是双 Bank 方案,采取不同的 Image 校验流程,请参考 OTA 策略

Image 执行

Image 校验均通过后,按照设计的流程依次执行指定 Image

Image 校验

RTL8752H 启动流程中的 Image 校验流程如下:

../../../_images/Image_Check_Flow.png

Image 校验流程

备注

OEM Data 又称作 Config File,其中包含了 RTL8752H 设定的重要参数,如 Image 的排布信息。

OTA 策略

RTL8752H 的 OTA 升级方案支持单 Bank 和双 Bank 两种方案。启动代码将根据 OEM Data 中的 Image 排布信息,判断出 OTA 升级的方案:

  1. 检查 Temp 区是否存在有效的待升级文件。如果有,则对其进行校验。若校验通过,则将其搬运到 Bank 中对应的位置。

  2. 校验 OTA Bank Header。

  3. 按顺序校验 OTA Bank 中的 Image。

  4. 执行指定的 Image。

  1. 校验两个 OTA Bank Header。根据校验结果,可分为以下三种情况:

    • 情况一:两个 OTA Bank Header 校验都通过,则后续流程优先使用版本更新的 OTA Bank,另一个 OTA Bank 作为备份。

    • 情况二:只有一个 OTA Bank Header 校验通过,则后续流程使用该 OTA Bank。

    • 情况三:两个 OTA Bank Header 校验均未通过,则直接判定启动失败。

  2. 按顺序校验指定 OTA Bank 中的 Image。如果是情况一并且出现某个 Image 校验失败,系统会切到备份的 OTA Bank,并在该备份 Bank 中进行 Image 校验。

  3. 执行指定的 Image。

备注

  • OTA 相关说明请查阅 OTA

  • Image 排布相关说明请查阅 Image Layout

校验方式

根据是否开启 Secure Boot 功能(eFuse 决定),Image 的校验方式可分为:

  • 支持使用 SHA256 和 CRC16 完整性校验。

  • 校验过程中,如果出现某个 Image 校验失败,系统仍会走后续的 Image Execution 流程,但会报出相关的 Error Log 以提示开发者。

  • 支持使用 RSA 和 CMAC 签名验证。

  • 校验过程中,如果出现某个 Image 校验失败,系统会中止执行后续的流程,进行 Error 处理。

Image 解密

Image 在校验成功后,会额外检查 Image 是否加密。如果 Image 加过密,则会将 Image 的加密区域和密钥等信息注册到 Flash On-The-Fly 引擎中。详情请查阅:安全机制

存储

RTL8752H 的存储介质包括 ROM,RAM,Flash 和 eFuse,详情请查阅 Memory

Flash Driver 和 FTL 相关的内容,请查阅 Flash

中断管理

RTL8752H 的中断管理基于 Cortex-M 的 NVIC (Nested Vectored Interrupt Controller) 系统,中断参数如下:

  • 16 个 Cortex-M0+ 系统异常

  • 32 个可屏蔽的中断通道(其中有两个中断有二级子中断)

  • 4 个可编程的中断优先级

NVIC 和处理器内核接口紧密耦合,使得低延迟中断处理和高效处理晚抵达中断都成为可能。

中断向量表

中断向量表用于管理和处理不同类型的中断。它是存储在内存中的一个数据结构,包含了中断处理程序的入口地址。通过在中断向量表中存储中断处理程序的入口地址,系统可以快速定位并调用与中断类型相关的处理程序,从而提高系统的响应速度和效率。

RTL8752H 的中断向量表默认放置于 RAM 中划分的一块区域上。开发者可通过 API RamVectorTableUpdate() 来更新中断向量表中指定的 ISR。

RTL8752H 中断向量表

Exception Number

CMSIS-CORE enumeration value

Exception Type

Description

1

Reset

Reset

2

[-14]

NMI

Non-Maskable Interrupt

The Watchdog is linked to the NMI vector

3

[-13]

HardFault

Fault handling exception

4 ~ 10

Reserved

11

[-5]

SVCall

Supervisor call via SVC instruction

12~13

Reserved

14

[-2]

PendSV

Pendable request for system service

15

[-1]

SysTick

System Tick Timer

16

[0]

System Interrupt

Interrupt the CPU when the system is awakened by a GPIO event

17

[1]

Internal use

Internal use

18

[2]

BT MAC

BT MAC Interrupt

19

[3]

Timer3

Timer3 Global Interrupt

20

[4]

Timer2

Timer2 Global Interrupt

21

[5]

Internal use

Internal use

22

[6]

I2S0_TX

I2S0 TX Interrupt

23

[7]

I2S0_RX

I2S0 RX Interrupt

24

[8]

Timer4_5

Timer4~5 interrupt has secondary interrupts.

Refer to Timer4~5 Interrupt.

25

[9]

ZIGBEE

ZIGBEE Interrupt

26

[10]

PF_RTC

Platform RTC Interrupt

27

[11]

RTK_UART0

RTK UART0 Interrupt

28

[12]

RTK_UART1

RTK UART1 Interrupt

29

[13]

I8080

I8080 Interrupt

30

[14]

SPI0

SPI 0 Interrupt

31

[15]

SPI1

SPI 1 Interrupt

32

[16]

I2C0

I2C 0 Interrupt

33

[17]

I2C1

I2C 1 Interrupt

34

[18]

ADC

ADC Global Interrupt

35

[19]

Peripheral

Peripheral interrupt has secondary interrupts.

Refer to Peripheral Interrupt.

36

[20]

DMA_Channel0

RTK-DMA channel0 Global Interrupt

37

[21]

DMA_Channel1

RTK-DMA channel1 Global Interrupt

38

[22]

DMA_Channel2

RTK-DMA channel2 Global Interrupt

39

[23]

DMA_Channel3

RTK-DMA channel3 Global Interrupt

40

[24]

Enhanced_Timer0

Enhanced Timer 0 Interrupt

41

[25]

Enhanced_Timer1

Enhanced Timer 1 Interrupt

42

[26]

GPIO_Group3

GPIO Group3 Interrupt

43

[27]

GPIO_Group2

GPIO Group2 Interrupt

44

[28]

IR

IR module global Interrupt

45

[29]

GPIO_Group1

GPIO Group1 Interrupt

46

[30]

GPIO_Group0

GPIO Group0 Interrupt

47

[31]

RTK_UART2

RTK UART 2 Interrupt

Timer4~5 Interrupt

Exception Number

Exception Type

Description

48

Timer4

Timer4 Interrupt

49

Timer5

Timer5 Interrupt

Peripheral Interrupt

Exception Number

Exception Type

Description

50

SPIC0

SPIC0 Flash Interrupt

51

Qdecode

Qdecode Global Interrupt

52

Keyscan

Keyscan Global Interrupt

53

SPI2W

2-wire/3-wire SPI Interrupt

54

LPCOMP

Analog Comparator Interrupt

55

PTA_Mailbox

MailBox Interrupt

56

SPIC1

SPIC1 Flash Interrupt

57

SHA256

SHA256 Interrupt

58

Platform

Platform Interrupt

59

TRNG

TRNG Interrupt

61

FLASH_SEC

Flash On-The-Fly Interrupt

62

RTC

Real Time Counter Interrupt

63

WDT

Watchdog Global Interrupt

GPIO Groups Interrput

GPIO Group 3 Interrput

GPIO Group 2 Interrput

GPIO Group 1 Interrput

GPIO Group 0 Interrput

GPIO3

GPIO2

GPIO1

GPIO0

GPIO7

GPIO6

GPIO5

GPIO4

GPIO11

GPIO10

GPIO9

GPIO8

GPIO15

GPIO14

GPIO13

GPIO12

GPIO19

GPIO18

GPIO17

GPIO16

GPIO23

GPIO22

GPIO21

GPIO20

GPIO27

GPIO26

GPIO25

GPIO24

GPIO31

GPIO30

GPIO29

GPIO28

中断优先级

RTL8752H 使用的 ARMv6-M 架构可支持的中断优先级是 4 个。但为了与 Realtek Bee 系列的其他 SoC 保持兼容(大多数支持 8 个优先级),RTL8752H 的 Irq-Priority-Bits-Number 被设定为 3, 因此中断优先级有如下关系: (0 = 1) > (2 = 3) > (4 = 5) > (6 = 7)

优先级的设定推荐遵循以下规则:

RTL8752H 中断优先级

优先级

规则

0/1

用于实时性要求非常高的中断,BT MAC Interrupt 默认使用该优先级

2/3

4/5

一般用于普通的外设中断

6/7

SysTick 和 PendSV

备注

RTL8752H 使用的 ARMv6-M 架构不支持动态调整中断的优先级。如果中断优先级要调整,需要先关闭中断,修改中断优先级,再重新使能中断。

功耗模式

RTL8752H 支持以下四种功耗模式:

RTL8752H 功耗模式

功耗模式

说明

CPU Active

系统处于完全的供电和活跃状态

CPU Sleep

系统进入 wfi 状态,此模式下 CPU clock 会自动降速

DLPS

系统进入较低的功耗模式,系统进入休眠模式,以及较快的进出时间,同时 RAM 内容保持

Power Down

系统进入极致的低功耗模式,此模式下 RAM 内容不保持,从Power Down 模式退出会执行重启流程,较 DLPS 模式的退出耗时更长

RTL8752H 会在满足特定的条件时进入特定的功耗模式,并在符合特定条件下唤醒系统。详情请查阅 低功耗模式

应用程序开发

SDK 目录

在应用程序开发之前,请先熟悉 RTL8752H 的 SDK,目录结构如下:

└── SDK
    ├── bin                   存放编译生成的可执行文件或二进制文件
    ├── board                 包含一些示例项目,开发者可以通过这些项目了解如何在该评估板上开发应用程序
        ├── evb
            └── samples
    ├── doc                   保存 SDK 相关的文档资料
    ├── inc                   包含各种头文件,分为以下子目录
        ├── app               应用程序相关的头文件,定义了应用程序层次的接口
        ├── bluetooth         与蓝牙功能相关的头文件,包括蓝牙协议栈、配置等
        ├── os                操作系统相关的头文件,包含 OSIF 和 FreeRTOS 的接口定义
        ├── peripheral        外设相关的头文件,如 GPIO、UART、SPI、I2C 等
        └── platform          平台相关的头文件,定义了平台级别的接口和配置
    ├── src                   包含实现具体功能的源文件(.c, .s等)
    └── tools                 包含用于编译、烧录、调试的工具和脚本

示例工程

为了帮助开发者快速上手开发应用程序,RTL8752H SDK中 已经创建好了许多示例工程。详情请参考 示例工程

备注

由于示例工程可能会随着 SDK 一起更新。为了更好地使用最新的示例代码,建议把新增的代码以模块化的形式组织。

组织结构

ble_peripheral 的 Keil 工程为例,分为以下几个模块来组织源文件:

ble_peripheral 工程组织结构

工程目录

说明

Include

存放 ROM UUID 文件

CMSIS

存放启动代码

Lib

应用程序使用的所有二进制文件

Peripheral

应用程序使用的所有外设驱动和模块代码

Profile

应用程序使用的 BLE Profiles 或者服务

APP

BLE Peripheral 应用的实现

通用文件

RTL8752H SDK 的示例工程中均包含以下通用文件:

RTL8752H 通用文件

文件

说明

rom_uuid.h

UUID 头文件是 Application 用来识别 ROM 的,无需更改

ROM_NS.lib

ROM 符号库,应用程序链接 ROM 中的符号

lowerstack.lib

lowerstack 链接 ROM 中的符号

rtl8752h_sdk.lib

Realtek 拓展功能的库

gap_utils.lib

实现 BLE 功能的 GAP 库

startup_rtl876x.s

RTL8752H 应用程序启动的汇编文件

system_rtl876x.c

RTL8752H 应用程序启动的 C 文件

board.h

配置引脚和低功耗模式的头文件

flash_map.h

Flash 布局文件,此文件由 Flashmap Generate Tool 工具生成

mem_config.h

Memory 配置相关的文件

APP 工作原理

RTL8752H SDK 内提供的 BLE 示例应用程序的执行流程如下:

../../../_images/APP_Flow.png

BLE APP 执行流程

初始化

BLE 应用是在 main() 函数中开始进行初始化的,各初始化步骤的含义如下:

BLE 应用初始化

步骤

说明

Board Init

PINMUX 和 PAD 初始化设置

Gap Init

GAP 相关参数的初始化

Profile Init

BLE Profiles 的初始化

Power Manager Init

电源管理相关的初始化

SW Timer Init

软件定时器的初始化

APP Queue Init

APP Queue 的初始化,包括 IO MSG Queue 和 Event Queue

Driver Init

外设的初始化

消息和事件处理机制

BLE 应用中,蓝牙协议栈和外设都是通过 消息和事件处理机制 与 APP 层进行交互的。

消息和事件处理机制的本质是消息(IO MSG)会被封装成事件(Event),这些 Event 则会在 APP 层的消息处理器中被分发处理,具体说明如下:

../../../_images/IO_Message_Handling_Flowchart.png

消息和事件处理机制

如上图所示,原始消息被封装成 Event 后,会发送至对应的 queue 中。APP 层的消息分发器在收到 Event 后,基于 Event 类别调用对应的MSG Handler 处理:

  • 如果 Event 类型是 IO MSG : 被消息分发器转发给特定 IO MSG Handler 处理。

  • 如果 Event 类型是 来自蓝牙协议栈的MSG : 先被消息分发器转发给 BT 状态机,BT 状态机处理完 MSG 后,再封装成 BT IO MSG 发送至 queue 中。

开发者在开发应用程序时,需要负责以下事项:

  • 实现外设的 ISR,在 ISR 中完成初步处理,如果需要进一步处理则封装 Event 发给 APP。

  • 根据需求扩展消息分发器,以便接收和处理用户定义的 MSG。

  • 实现应用层相关的 MSG Handler。

  • 根据需求扩充自定义 Message Type 和 Subtype。

备注

  • 此部分的具体实现请参考示例工程里的 app_task.capp_flag.h

  • GAP 层通知 APP 层是通过消息和事件处理机制,而 APP 层可以直接调用 GAP 层的 APIs 来通知 GAP 层。

Pin 设定

引脚的设定在 board.h 中定义。

#define KEY_0   P4_0
#define BEEP    P4_1
#define LED_0   P2_1
#define LED_1   P2_4

功耗模式设定

在示例工程中,开发者可以透过 Realtek 预设的宏定义来控制是否打开低功耗模式:

  • 绝大部分工程:board.h 中的宏 DLPS_EN 用于控制是否进入低功耗模式。

  • BLE 相关工程:app_flags.h 中的宏 F_BT_DLPS_EN 用于控制是否进入低功耗模式。

详情请查阅 低功耗模式

调试

调试应用程序有以下两种方式:

  • 使用 Log 机制跟踪代码的执行和数据。

  • 使用 Keil MDK 或 J-Link Commander 和 SWD 进行调试,增加/删除断点以及访问/追踪 memory 等。

详情请查阅 调试指南