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
请按照以下步骤操作构建并运行该示例:
打开工程文件。
按照 快速入门 中 编译 APP Image 给出的步骤构建目标文件。
编译成功后,在路径
mdk\bin
或gcc\bin
下会生成 app binapp_MP_xxx.bin
文件。按下 reset 按键,开始运行。
测试验证
当检测 GPIO 输入高电平时,在 Debug Analyzer 工具内连续打印如下信息。
gpio_input_data = 1 gpio_input_data = 1 gpio_input_data = 1 ...
当检测 GPIO 输入低电平时,在 Debug Analyzer 工具内连续打印如下信息。
gpio_input_data = 0 gpio_input_data = 0 gpio_input_data = 0 ...
代码介绍
该章节分为以下几个部分:
源码路径
工程路径:
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 设置,包含如下流程:
配置 PAD:设置引脚、PINMUX 模式、PowerOn、内部上拉、输出失能。
配置 PINMUX:分配引脚为 GPIO 功能。
driver_gpio_init
为 GPIO 外设的初始化,包含如下流程:
使能 RCC 时钟。
配置 GPIO 模式为输入模式。
失能 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++); } }