【stm32 库函数开发】03 GPIO功能

发布时间:2026/10/23 2:19:08
【stm32 库函数开发】03 GPIO功能 提示stm32 基于库函数开发GPIO 相关。文章目录1. GPIO 简介1.1 基本结构1.2 模式1.3 寄存器1.3.1 端口功能配置寄存器1.3.2 数据输入寄存器1.3.3 数据输出寄存器1.3.4 位设置/位清除寄存器1.3.5 位清除寄存器1.4 库函数2. GPIO 输出及应用2.1 led 灯2.1.1 基础2.1.2 硬件电路2.1.3 软件实现2.2 蜂鸣器2.2.1 基础2.2.2 硬件电路2.2.3 软件实现3. GPIO 输入及应用3.1 按键3.1.1 基础3.1.2 硬件电路3.1.3 软件实现3.2 传感器3.2.1 基础3.2.2 硬件电路3.2.3 软件实现4. 总结1. GPIO 简介✔️ 输出用于驱动 LED蜂鸣器模拟通信协议数据✔️ 输入用于读取按键输入传感器输入采集ADC电压采集模拟通信协议数据1.1 基本结构① 整体结构内核对寄存器置位实现读写包含输入和输出寄存器② GPIO位结构输出时还可通过位寻址对寄存器和 RAM 进行位设置。总结输出模式如下表所示模式数据寄存器P-MOSN-MOS输出电平说明推挽1✔️❌1具有驱动能力推挽0❌✔️0具有驱动能力开漏1不可用❌R∞高阻态开漏0不可用✔️0低电平驱动关闭不可用不可用不可用❌输入模式开漏应用① 作为通信协议的驱动方式例如 I2C可避免多机通信的相互干扰② io 口接 5V 的上拉时如果为 R∞则可输出 5V 的电平1.2 模式通过 GPIO 端口配置寄存器可以影响寄存器和驱动器实现以下一些模式。1️⃣ 浮空/上拉/下拉输入2️⃣ 模拟输入 GPIO 无效引脚直接接入内部 ADC3️⃣ 推挽输出4️⃣ 开漏输出5️⃣ 复用功能 复用功能输出来源于片上外设可以查看stm32的参考手册8.1.11节有片上外设的GPIO推荐配置1.3 寄存器1.3.1 端口功能配置寄存器端口配置低寄存器定义如下所示每个端口由 4 位进行控制。1.3.2 数据输入寄存器高位保留低 16 位可直接读出。1.3.3 数据输出寄存器高位保留低 16 位可读可写。1.3.4 位设置/位清除寄存器高 16 位用于清除低 16 位用于设置使用时写1即可。1.3.5 位清除寄存器高位保留使用时写1即可。1.4 库函数在 stm32f10x_gpio.c 和 stm32f10x_rcc.c 中有以下函数/* 时钟相关 */voidRCC_AHBPeriphClockCmd(uint32_tRCC_AHBPeriph,FunctionalState NewState);voidRCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,FunctionalState NewState);voidRCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph,FunctionalState NewState);/* GPIO相关函数 */voidGPIO_DeInit(GPIO_TypeDef*GPIOx);/* 复位GPIO */voidGPIO_AFIODeInit(void);/* 复位AFIO */voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);/* 用GPIO_InitStruct初始化GPIOx */voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct);/* 结构体变量赋默认值 */uint8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);/* 读函数 */uint16_tGPIO_ReadInputData(GPIO_TypeDef*GPIOx);/* 读函数 */uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);/* 读函数 */uint16_tGPIO_ReadOutputData(GPIO_TypeDef*GPIOx);/* 读函数 */voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);/* 写函数设置高电平 */voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);/* 写函数设置低电平 */voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitAction BitVal);/* 写函数设置高低电平 */voidGPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal);/* 写函数设置端口 */voidGPIO_PinLockConfig(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);/* 未使用 */voidGPIO_EventOutputConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);/* 未使用 */voidGPIO_EventOutputCmd(FunctionalState NewState);/* 未使用 */voidGPIO_PinRemapConfig(uint32_tGPIO_Remap,FunctionalState NewState);/* 未使用 */voidGPIO_EXTILineConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);/* 未使用 */voidGPIO_ETH_MediaInterfaceConfig(uint32_tGPIO_ETH_MediaInterface);/* 未使用 */2. GPIO 输出及应用具体函数使用方法可参考 固件库使用手册2.1 led 灯2.1.1 基础单向导通长脚短脚-小脚大脚-。2.1.2 硬件电路一般低电平强驱动高电平弱驱动因此选择此种接法。2.1.3 软件实现使用正点原子精英板LED0 接在 PB5LED1 接在 PE5低电平点亮。LED 流水灯#includestm32f10x.h// Device header#includedelay.h/* 定义 LED 端口数组 */uint16_tled_ports[]{GPIO_Pin_0,GPIO_Pin_1,GPIO_Pin_5,GPIO_Pin_4};intmain(void){/* 1. 在rcc.h中定义了总线配置外设时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/* 2. 配置IO口模式 */GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_PinGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);uint8_ti0;/* 用于循环 */uint8_tsizesizeof(led_ports)/sizeof(led_ports[0]);while(1){/* 3. 库函数置位,gpio.h */for(uint8_tj0;jsize;j){GPIO_WriteBit(GPIOA,led_ports[j],Bit_SET);/* 关闭所有 LED */}GPIO_WriteBit(GPIOA,led_ports[i],Bit_RESET);/* 循环点灯 */Delay_ms(500);i;if(isize){i0;}}}GPIO使用的一般步骤设置时钟 → 设置mode → 点灯2.2 蜂鸣器2.2.1 基础▪️ 有源自带振荡源频率固定▪️ 无源需提供振荡脉冲根据脉冲频率发出不同声音2.2.2 硬件电路PNP 型基极低电平触发NPN 型基极高电平触发。基极和发射极之间需要一定电压因此负载接在另一侧。2.2.3 软件实现使用正点原子精英板beep 接在 PB8高电平触发。#includestm32f10x.h#includedelay.hintmain(void){/* 1. 在rcc.h中定义了总线配置外设时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);/* 2. 配置IO口模式 */GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_PinGPIO_Pin_8;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStruct);while(1){/* 3. 库函数置位,gpio.h */GPIO_ResetBits(GPIOB,GPIO_Pin_8);Delay_ms(100);GPIO_SetBits(GPIOB,GPIO_Pin_8);Delay_ms(100);GPIO_ResetBits(GPIOB,GPIO_Pin_8);Delay_ms(100);GPIO_SetBits(GPIOB,GPIO_Pin_8);Delay_ms(700);}}3. GPIO 输入及应用3.1 按键3.1.1 基础按下导通松手断开同时由于是机械触点有按键抖动需要消抖。3.1.2 硬件电路一般采用上面两种方式key 下接的方式按下为低电平io口设置IPU方式3.1.3 软件实现使用正点原子精英板KEY0 接在 PE4KEY1 接在 PE3按下为低电平LED0 接在 PB5LED1 接在 PE5低电平点亮。使得 KEY0 控制 LED0 KEY1 控制 LED1main.c#includestm32f10x.h#includedelay.h#includeled.h#includekey.h/* 变量定义 */uint8_tkeyNum0;intmain(void){/* 1. led and key init */ledInit();keyInit();while(1){keyNumgetKeyNum();/* 接线时注意短的接mcu */switch(keyNum){case3:led1_Turn();break;case4:led0_Turn();break;default:break;}}}led.c#includestm32f10x.h/* 灯选择参数 */#defineLED00#defineLED11/* 开关状态参数 */#defineLED_ON0#defineLED_OFF1voidledInit(void){/* 1. 在rcc.h中定义了总线配置外设时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);/* 2. 配置IO口模式 */GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_InitStruct.GPIO_PinGPIO_Pin_5;GPIO_Init(GPIOB,GPIO_InitStruct);GPIO_InitStruct.GPIO_PinGPIO_Pin_5;GPIO_Init(GPIOE,GPIO_InitStruct);/* 3. 先关闭 */GPIO_SetBits(GPIOB,GPIO_Pin_5);GPIO_SetBits(GPIOE,GPIO_Pin_5);}/** * brief LED控制函数 * param led : 灯选择 (LED0 / LED1) * param state : 开关状态 (LED_ON / LED_OFF) * note 低电平点亮 */voidled_set(uint8_tled,uint8_tstate){/* 根据灯选择确定端口和引脚 */GPIO_TypeDef*port;uint16_tpin;switch(led){caseLED0:portGPIOB;pinGPIO_Pin_5;break;caseLED1:portGPIOE;pinGPIO_Pin_5;break;default:return;/* 非法参数直接返回 */}/* 根据状态设置电平低电平点亮高电平熄灭 */if(stateLED_ON){GPIO_ResetBits(port,pin);/* 输出低电平点亮 */}else{GPIO_SetBits(port,pin);/* 输出高电平熄灭 */}}/* led turn on or off */voidled0_Turn(void){if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)0){led_set(LED0,LED_OFF);}else{led_set(LED0,LED_ON);}}/* 状态翻转 */voidled1_Turn(void){if(GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_5)0){led_set(LED1,LED_OFF);}else{led_set(LED1,LED_ON);}}key.c#includestm32f10x.h#includedelay.h/* key init */voidkeyInit(void){/* 1. 在rcc.h中定义了总线配置外设时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);/* 2. 配置IO口模式 */GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IPU;GPIO_InitStruct.GPIO_PinGPIO_Pin_3|GPIO_Pin_4;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOE,GPIO_InitStruct);}/* 哪个按键按下 */uint8_tgetKeyNum(void){uint8_tkeyNum0;if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)0)/* 按键按下 */{Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)0);Delay_ms(20);keyNum3;}if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)0)/* 按键按下 */{Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)0);Delay_ms(20);keyNum4;}returnkeyNum;}3.2 传感器3.2.1 基础传感器元件光敏电阻/热敏电阻/红外接收管等的电阻会随外界模拟量的变化而变化通过与定值电阻分压即可得到模拟电压输出再通过电压比较器进行二值化即可得到数字电压输出。3.2.2 硬件电路传感器电路如下所示3.2.3 软件实现使用正点原子精英板beep 接在 PB8高电平触发PA4 引脚外接光传感器。光敏传感器控制蜂鸣器#includestm32f10x.h#includedelay.h/* bee init */voidbeeInit(void){/* 1. 在rcc.h中定义了总线配置外设时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);/* 2. 配置IO口模式 */GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_PinGPIO_Pin_8;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStruct);/* 3. 先关闭 */GPIO_ResetBits(GPIOB,GPIO_Pin_8);}/* sensor init */voidsensorInit(void){/* 1. 在rcc.h中定义了总线配置外设时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/* 1. 配置IO口模式 */GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IPU;GPIO_InitStruct.GPIO_PinGPIO_Pin_4;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);}uint8_tlightSensorGet(void){returnGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4);/* 读取光敏的数据输出 */}intmain(void){/* 1. led and key init */beeInit();sensorInit();while(1){if(lightSensorGet()1)/* 光线暗电阻大分压多输出为1 */{GPIO_SetBits(GPIOB,GPIO_Pin_8);}else{GPIO_ResetBits(GPIOB,GPIO_Pin_8);}}}/* 逆时针电阻变小顺时针变大 */现象遮光时输出高电平蜂鸣器响do 指示灯熄灭4. 总结GPIO 使用方法可参考。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询