STM32外设之GPIO

GPIO(General-purpose input/output)是通用输入输出接口,用于控制设备的输入和输出。配置步骤包括使能时钟、设定模式和操作寄存器。通过库函数或直接寄存器操作,可以实现GPIO的输入输出功能,如开漏、推挽等模式。本文通过实例展示了GPIO的初始化和使用,总结了操作GPIO的简单流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、GPIO是什么?

全称:General-purpose input/output(通用型输入输出)

操作要点:

1. 使能 GPIO 端口时钟。

2. 初始化 GPIO 目标引脚为推挽输出模式。

3. 编写简单测试程序,控制 GPIO 引脚输出高、低电平。

二、使用步骤

1.GPIO功能与模式

1.输入浮空 :输入模式施密特触发器打开及GPIO端口内部上下拉开关打开, 并且状态不确定。

2.输入上拉:输入模式施密特触发器打开及GPIO端口内部上拉开关关闭,默认为高电平。

3.输入下拉 :输入模式施密特触发器打开及GPIO端口内部下拉开关关闭,默认为低电平。

4.模拟输入 : 模拟输入施密特触发器关闭─,输入数据寄存器禁止,实现模拟信号采集。

5.开漏输出 : 开漏输出即在输出数据寄存器为‘0’时,控制NMOS打开,Pmos关闭,在数据寄存器为‘1时将端口置为高阻态,IO口状态由外部上下拉决定。

6.推挽输出 :POMS,NMOS均启用,输入数据寄存器输出‘1’时PMOS打开,为高电平状态,反之为低电平。

7. 推挽复用功能 :GPIO端口复用功能输出推挽。

8. 开漏复用功能:GPIO端口复用功能输出开漏。

2.寄存器操作

        GPIOX_CRL --端口配置低寄存器 ---设置输入输出模式及速度0-7    config register low

        GPIOX_CRH--端口配置高寄存器---设置输入输出模式及速度8-15    config register hight

        GPIOX_IDR--端口输入数据寄存器---低16位有效,读对应IO口状态   input date register

        GPIOX_ODR--端口输出数据寄存器---低16位有效,写状态  output date register

        GPIOX_BSRR--端口位设置/清除寄存器--操作ODR寄存器置1置0  bit set reset register 

        GPIOX_BRR--端口位清除寄存器--操作ODR寄存器置0  bit  reset register 

        GPIOX_LCKR--端口配置锁定寄存器

        存储器映像   GPIOA  起始地址  0x4001 0800 -0x4001 0BFF

#define GPIOA_CRL     *(unsigned int*)(0x40010800+0x00)  //强制类型转换先转换成指针
#define GPIOA_CRH     *(unsigned int*)(0x40010800+0x04)  //然后指针解引用,给对应寄存器赋值
#define GPIOA_IDR     *(unsigned int*)(0x40010800+0x08)  //地址位GPIOA基地址+偏移值
#define GPIOA_ODR     *(unsigned int*)(0x40010800+0x0C)
#define GPIOA_BSRR     *(unsigned int*)(0x40010800+0x10)
#define GPIOA_BRR     *(unsigned int*)(0x40010800+0x14)
#define GPIOA_LCKR     *(unsigned int*)(0x40010800+0x18)


gpio.c文件中为结构体类型

typedef struct    
{
    unsigned int CRL;
	unsigned int CRH;
	unsigned int IDR;
	unsigned int ODR;
	unsigned int BSRR;
	unsigned int BRR;
	unsigned int LCKR;
}GPIO_TypeDef;

#define GPIOA ((GPIO_TypeDef*)GPIOA_BASE)  //强制类型转换为结构体指针类型,指向上边的结构体。

3.库函数操作

#include "led.h"
#include "stm32f10x.h"                  // Device header

void LED_init(void)
{
  //1.创建结构体变量
  GPIO_InitTypeDef led_init;
  //2.使能APB2 GPIOB
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
  
  //3.结构体配置
  
  led_init.GPIO_Mode =GPIO_Mode_Out_PP;
  led_init.GPIO_Pin=GPIO_Pin_5 ;
  led_init.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOB, &led_init);	
  GPIO_SetBits(GPIOB,GPIO_Pin_5); 
	
  led_init.GPIO_Mode =GPIO_Mode_Out_PP;
  led_init.GPIO_Pin=GPIO_Pin_5 ;
  led_init.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOE, &led_init);
  GPIO_SetBits(GPIOE,GPIO_Pin_5); 
  
}

        


总结

GPIO是目前操作的第一个外设,通过库函数操作还是很简单的,步骤比较一致。

1.使能对应外设时钟

2.配置相关对应寄存器/结构体配置

3.初始换GPIO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值