STM32之GPIO输入

本文介绍如何使用STM32标准外设库读取GPIO输入信号,GPIO为通用输入输出端口,输入功能即读取STM32的一个或多个引脚输入的是高电平还是低电平,从而实现检测接入该引脚的电路情况之目的,最简单直观的应用为检测按键的按下和弹起,本例程读取GPIOA的Pin0。

本文适合对单片机及C语言有一定基础的开发人员阅读,MCU使用STM32F103VE系列。

 

GPIO输入分为两部分,初始化和控制。

1.   初始化项目

初始化分为三步,包括时钟启用、结构体初始化和初始化库函数调用。

1.1. 开启指定GPIO时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

1.2. 结构体

typedef struct {

  uint16_t GPIO_Pin;

  GPIOSpeed_TypeDef GPIO_Speed;

  GPIOMode_TypeDef GPIO_Mode;

}GPIO_InitTypeDef;
  • 引脚:配置需要输出的引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;   
  • 输入输出模式:共8种

  其中输入四种:模拟、浮空、上拉、下拉

  对于按键输入来说,一般使用浮空输入模式

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   

 1.3. 库函数

  设置完结构体之后调用库函数,初始化GPIOA

GPIO_Init(GPIOA, &GPIO_InitStructure);

2.    控制:读取电平

  输入信号分为两种:输入高电平和输入低电平,通过调用控制库函数实现。

  • 判断输入高电平
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1
  • 判断输入低电平
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0
  • 读取电平
uint8_t inputDataBit;

inputDataBit = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);

 

完整代码(仅自己编写的部分)

 1 void GPIO_Input_Config(void)
 2 {        
 3     /*定义一个GPIO_InitTypeDef类型的结构体*/
 4     GPIO_InitTypeDef GPIO_InitStructure;
 5 
 6     /*开启指定端口的GPIO外设时钟*/
 7     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 8     
 9     /*选择要控制的GPIO引脚*/
10     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;    
11 
12     /*设置引脚模式为浮空输入*/
13     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
14 
15     /*调用库函数,初始化GPIO*/
16     GPIO_Init(GPIOA, &GPIO_InitStructure);    
17 }
18 
19 void delay_ms(__IO uint32_t ms)
20 {
21     uint32_t i;    
22     SysTick_Config(SystemCoreClock / 1000);
23     
24     for(i = 0; i < ms; i++)
25     {
26         // 当计数器的值减小到0的时候,CTRL寄存器COUNTFLAG会置1,置1后,该位清零
27         while( !((SysTick->CTRL) & SysTick_CTRL_COUNTFLAG_Msk) );
28     }
29     // CTRL寄存器ENABLE寄存器置零,关闭SysTick定时器
30     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
31 }
32 
33 int main(void)
34 {    
35     uint8_t inputDataBit;
36     
37     /* 端口初始化 */
38     GPIO_Input_Config();     
39 
40     while(1)
41     {
42         inputDataBit = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
43         
44         if(inputDataBit == 1){                //高电平
45             delay_ms(100);
46         }else if(inputDataBit == 0){        //低电平
47             delay_ms(200);
48         }
49     }
50 }

 

仿真结果

程序编译成功后,点击开始仿真,打开菜单栏Peripherals→General Purpose I/O→GPIOA,默认Pin0为低电平,程序单步运行时会跳转至低电平部分,鼠标点击Pins最后一位,显示√表示引脚Pin0为高电平,程序继续运行时会跳转到高电平部分。

 

 

源码下载:(不包括工程文件和库文件)

https://files.cnblogs.com/files/greatpumpkin/GPIO_input.zip

posted @ 2020-07-01 17:11  心灵航帆  阅读(3547)  评论(0编辑  收藏  举报