概述
该文档主要介绍了外设示例的概述,涵盖 环境需求 、配置选项、 编译和下载,测试验证 和 代码介绍 几个部分。
该文档提供了详细而全面的指南,从环境设置到代码实现的各个方面,帮助开发人员快速入门并测试外设示例。
环境需求
该示例支持以下开发套件:
Hardware Platforms |
Board Name |
---|---|
RTL87x2G HDK |
RTL87x2G EVB |
更多信息请参考 快速入门。
配置选项
用户可以参考各外设示例的 配置选项,以获取更详细的配置信息,包括实现功能,引脚定义等。
编译和下载
示例的工程路径如下:
Project file: samples\peripheral\xxx\xxx\proj\rtl87x2g\mdk
Project file: samples\peripheral\xxx\xxx\proj\rtl87x2g\gcc
请按照以下步骤操作构建并运行该示例:
打开工程文件。
按照 快速入门 中 编译 APP Image 给出的步骤构建目标文件。
编译成功后,在路径
mdk\bin
或gcc\bin
下会生成 app binapp_MP_xxx.bin
文件。按下 复位 按键,开始运行。
测试验证
用户可以参考各外设示例的 测试验证,以获取更详细的验证流程和结果。
代码介绍
在该章节中,介绍源码路径和初始化,包括外设初始化和功能实现的流程。
源码路径
该节介绍了工程路径和结构。工程文件和源码路径如下:
工程路径:
sdk\samples\peripheral\xxx\xxx\proj
源码路径:
sdk\samples\peripheral\xxx\xxx\src
工程中源文件和分组结构如下:
└── Project: xxx sample project name
└── secure_only_app
└── Device includes startup code
├── startup_rtl.c
└── system_rtl.c
├── CMSIS includes CMSIS header files
├── CMSE Library Non-secure callable lib
├── lib includes all binary symbol files that user application is built on
├── xxx.lib
└── rtl87x2g_io.lib
├── peripheral includes all peripheral drivers and module code used by the application
├── rtl_rcc.c
├── rtl_pinmux.c
└── rtl_xxx.c peripheral driver source files that may be required, such as rtl_gpio.c
└── APP includes the ble_peripheral user application implementation
├── main_ns.c
└── io_xxx.c sample application source files that may be required, such as io_gpio.c
初始化
当系统上电或复位时,会调用 main
来并执行以下初始化功能:
int main(void)
{
/* Enable Interrupt */
__enable_irq();
xxx_demo();
while (1);
}
xxx_demo()
函数作为入口函数,在不同的示例项目中有所不同。例如,在 ADC 示例中,入口函数是 adc_demo()
。
xxx_demo()
函数主要实现外设初始化和应用示例。
外设初始化主要涉及: board_xxx_init()
和 driver_xxx_init()
。 board_xxx_init()
负责 PAD 与 PINMUX 的配置, driver_xxx_init()
负责时钟配置,外设初始化参数配置,中断配置,启用外设等。
应用示例在各外设示例中进行详细说明。
void adc_demo(void)
{
...
/* Configure pad and pinmux firstly! */
board_adc_init();
/* Initialize adc peripheral */
driver_adc_init();
...
}
初始化流程
下面展示了外设初始化的通用流程。不同外设的初始化通常遵循这一通用流程,个别外设会略有差异的情况会在外设示例中进行说明。
外设初始化主要包括以下流程:
设置外设 PAD 和 PINMUX。
启用外设时钟。
设置外设初始化参数,并初始化外设。
在必要时,配置 NVIC 并启用外设中断。
启用外设。
初始化流程如下图所示,其中 “XXX” 是进行初始化的外设名称,例如 GPIO 、I2C 或 SPI。

外设初始化流程图
PAD 配置
PAD 既指芯片封装引出的引脚,也指用于控制引脚功能与特性的硬件电路,其主要功能包括:
设置软件模式或复用模式;
设置上拉、下拉或浮空状态,选择强或弱电阻;
唤醒功能。因为 PAD 电路位于 AON 区域,在低功耗模式下仍然保持供电,即可以保持正常工作,所以 PAD 通常用于低功耗模式下唤醒系统。
当选择软件模式时,PAD可以配置输出或输入,输出高电平或低电平。
可以通过调用 Pad_Config()
函数来配置软件模式或复用模式,电阻上拉或下拉或浮空,输出或输入,输出高或低。
Pad_Config(P0_5, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE, PAD_OUT_HIGH);
PAD 和 PINMUX 框图如下图所示:

PAD 和 PINMUX 框图
PINMUX 配置
PINMUX 是 pin multiplexing的缩写,即引脚复用。由于 SoC 的引脚数量有限,引脚复用允许 SoC 使用有限的引脚来实现多种外设功能。 通常每个引脚都可以复用成任意外设功能。
调用 Pad_Config()
函数来选择 PAD_PINMUX_MODE
, 调用 Pinmux_Config()
函数来选择外设功能,例如 DWGPIO
,该引脚才具备外设功能。
/* Configure P0_5 as GPIO function */
Pad_Config(P0_5, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE, PAD_OUT_HIGH);
Pinmux_Config(P0_5, DWGPIO);
备注
禁止将不同的 PAD 同时设置为相同的外设功能(DWGPIO 除外)。例如,同时将 P0_0 和 P0_1 设置为 UART0_TX 是不允许的。
时钟配置
在初始化外设之前,需要启用外设时钟。调用 RCC_PeriphClockCmd()
函数来启用外设时钟。
RCC_PeriphClockCmd(APBPeriph_GPIO, APBPeriph_GPIO_CLOCK, ENABLE);
外设初始化
在初始化外设时,定义初始化结构体,根据需要配置结构体的参数来实现所需功能,调用 XXX_Init
函数来初始化外设。
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_DIR_IN;
...
GPIO_Init(GPIO_PORT, &GPIO_InitStruct);
中断配置
调用 NVIC_Init()
函数以启用 IRQ 中断。
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = GPIO5_IRQ;
NVIC_InitStruct.NVIC_IRQChannelPriority = 5;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
备注
用户 IRQ 优先级应设置为 2 ~ 6(0 ~ 1 优先级用于实时性要求非常高的中断,此优先级受 OS 影响;7 优先级为系统 PendSV/SysTick)。
外设使能
调用 XXX_Cmd
函数,使能相应外设功能。
ADC_Cmd(ADC, ADC_ONE_SHOT_MODE, ENABLE);
去初始化
调用 XXX_DeInit
函数,将外设寄存器去初始化为默认值。
GPIOx_DeInit();