概述

该文档主要介绍了外设示例的概述,涵盖 环境需求配置选项编译和下载测试验证代码介绍 几个部分。

该文档提供了详细而全面的指南,从环境设置到代码实现的各个方面,帮助开发人员快速入门并测试外设示例。

环境需求

该示例支持以下开发套件:

开发套件

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

请按照以下步骤操作构建并运行该示例:

  1. 打开工程文件。

  2. 按照 快速入门编译 APP Image 给出的步骤构建目标文件。

  3. 编译成功后,在路径 mdk\bingcc\bin 下会生成 app bin app_MP_xxx.bin 文件。

  4. 按照 快速入门MP Tool 给出的步骤将app bin烧录至EVB内。

  5. 按下 复位 按键,开始运行。

测试验证

用户可以参考各外设示例的 测试验证,以获取更详细的验证流程和结果。

代码介绍

在该章节中,介绍源码路径和初始化,包括外设初始化和功能实现的流程。

源码路径

该节介绍了工程路径和结构。工程文件和源码路径如下:

  • 工程路径: 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() 负责 PADPINMUX 的配置, 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” 是进行初始化的外设名称,例如 GPIOI2CSPI

../../../../../_images/peripheral_init_flow.png

外设初始化流程图

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 框图如下图所示:

../../../../../_images/block_diagram_of_the_pad_and_pinmux.png

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();