Input Polling

该示例使用 GPIO 输入功能,轮询检测 GPIO 的输入信号。

首先将 GPIO 配置为输入来检测信号变化。然后进入 while 循环,实时打印输入电平信息。

环境需求

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

开发套件

Hardware Platforms

Board Name

RTL8752H HDK

RTL8752H EVB

更多信息请参考 快速入门

硬件连线

连接 P2_3 和外部输入信号。

编译和下载

该示例的工程路径如下:

Project file: board\evb\io_sample\GPIO\Input_polling\mdk

Project file: board\evb\io_sample\GPIO\Input_polling\gcc

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

  1. 打开工程文件。

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

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

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

  5. 按下 reset 按键,开始运行。

测试验证

  1. 当检测 GPIO 输入高电平时,在 Debug Analyzer 工具内连续打印如下信息。

    gpio_input_data = 1
    gpio_input_data = 1
    gpio_input_data = 1
    ...
    
  2. 当检测 GPIO 输入低电平时,在 Debug Analyzer 工具内连续打印如下信息。

    gpio_input_data = 0
    gpio_input_data = 0
    gpio_input_data = 0
    ...
    

代码介绍

该章节分为以下几个部分:

  1. 源码路径

  2. 初始化函数将在 初始化 章节介绍。

  3. 初始化后的功能实现将在 功能实现 章节介绍。

源码路径

  • 工程路径: sdk\board\evb\io_sample\GPIO\Input_polling

  • 源码路径: sdk\src\sample\io_sample\GPIO\Input_polling

该工程的工程文件代码结构如下:

└── Project: input_polling
    └── secure_only_app
        └── include
            ├── app_define.h
            └── rom_uuid.h
        ├── cmsis                    includes CMSIS header files and startup files
            ├── overlay_mgr.c
            ├── system_rtl876x.c
            └── startup_rtl876x.s
        ├── lib                      includes all binary symbol files that user application is built on
            ├── rtl8752h_sdk.lib
            ├── gap_utils.lib
            └── ROM.lib
        ├── peripheral               includes all peripheral drivers and module code used by the application
            ├── rtl876x_rcc.c
            ├── rtl876x_pinmux.c
            ├── rtl876x_nvic.c
            └── rtl876x_gpio.c
        ├── profile
        └── app                      includes the ble_peripheral user application implementation
            └── main.c

初始化

当 EVB 复位启动时,执行 main 函数,执行以下流程:

int main(void)
{
    extern uint32_t random_seed_value;
    srand(random_seed_value);
    gpio_demo();

    ...
}

gpio_demo 中,包含了 PAD/PINMUX 设置,GPIO 外设的初始化等流程。

void gpio_demo(void)
{
    /* Configure pad and pinmux firstly! */
    board_gpio_init();

    /* Initialize gpio peripheral */
    driver_gpio_init();

}

board_gpio_init 为 PAD/PINMUX 设置,包含如下流程:

  1. 配置 PAD:设置引脚、PINMUX 模式、PowerOn、内部上拉、输出失能。

  2. 配置 PINMUX:分配引脚为 GPIO 功能。

driver_gpio_init 为 GPIO 外设的初始化,包含如下流程:

  1. 使能 RCC 时钟。

  2. 配置 GPIO 模式为输入模式。

  3. 失能 GPIO 中断。

void driver_gpio_init(void)
{
    /* Initialize GPIO peripheral */
    RCC_PeriphClockCmd(APBPeriph_GPIO, APBPeriph_GPIO_CLOCK, ENABLE);

    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Pin    = GPIO_PIN_INPUT;
    GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_IN;
    GPIO_InitStruct.GPIO_ITCmd  = DISABLE;
    GPIO_Init(&GPIO_InitStruct);
}

功能实现

在主函数内,初始化后执行 while 循环,循环体内执行 GPIO_ReadInputDataBit() 函数,并打印读取到的输入电平信息。

int main(void)
{
    extern uint32_t random_seed_value;
    srand(random_seed_value);
    gpio_demo();

    while (1)
    {
        /* Read GPIO input value: gpio_input_data */
        uint8_t gpio_input_data = GPIO_ReadInputDataBit(GPIO_PIN_INPUT);

        DBG_DIRECT("gpio_input_data = %d", gpio_input_data);
        for (uint32_t i = 0 ; i < 10000; i++);
    }
}