当前位置: 首页 > news >正文

STM32--GPIO

教程

视频

博主教程

STM32系统结构图

GPIO

GPIO(General Purpose Input/Output)是STM32内部的一种外设。

一个STM32芯片内存在多个GPIO外设,每个GPIO外设有16个引脚;

比如GPIOA:PA0~PA15;

GPIOB:PB0~PB15。

每个IO引脚都有输入电路和输出电路。

GPIO8种工作模式

链接

输入模式

由上下拉电阻控制。

上拉模式如何保持高电平

工作原理

  1. 当配置为上拉模式时,GPIO内部会连接一个上拉电阻(通常约30-50kΩ)到VDD

  2. 当没有外部信号驱动时,上拉电阻会将引脚电压拉至高电平

VDD(正电源)

下拉模式如何保持低电平

工作原理

  1. 当配置为下拉模式时,GPIO内部会连接一个下拉电阻(通常约30-50kΩ)到GND

  2. 当没有外部信号驱动时,下拉电阻会将引脚电压拉至低电平

VSS(负电源/地)

输出模式

由正负半导体控制 。

MOS

MOS(金属氧化物半导体)。

PMOS中的"P"

  • P代表Positive(正)

  • 当输出高电平时导通

NMOS中的"N"

  • N代表Negative(负)

  • 当输出低电平时导通

推挽输出

1上高,0下低;

开漏输出

PMOS断开,无效,只有NMOS在工作。

通用和服用输出

复用输出模式,与通用输出模式很是类似。只是输出的高低电平的来源,不是写程序让CPU直接写输出数据到寄存器,取而代之利用片上(stm32芯片上的)外设模块的复用功能输出来决定的。

GPIO编程控制步骤

1,使用RCC开启GPIO的时钟;

2,使用GPIO_Init()函数初始化GPIO;

3,使用输出/输出函数控制GPIO口。

GPIO的库函数

设置GPIO引脚电平

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:设置指定GPIO端口的单个或多个引脚为高电平(置1)

参数

  • GPIOx:GPIO端口(如GPIOA、GPIOB等)

  • GPIO_Pin:要设置的引脚(可使用|组合多个引脚)

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:设置指定GPIO端口的单个或多个引脚为低电平(置0)

参数

  • GPIOx:GPIO端口

  • GPIO_Pin:要清除的引脚(可使用|组合多个引脚)

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

功能:设置指定GPIO端口的单个引脚状态

参数

  • GPIOx:GPIO端口

  • GPIO_Pin:要设置的引脚(只能单个引脚)

  • BitVal:引脚状态(Bit_SETBit_RESET

// 设置GPIOC的Pin4为高电平
GPIO_WriteBit(GPIOC, GPIO_Pin_4, Bit_SET);// 设置GPIOC的Pin4为低电平
GPIO_WriteBit(GPIOC, GPIO_Pin_4, Bit_RESET);

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

功能:一次性设置整个GPIO端口的输出状态

参数

  • GPIOx:GPIO端口

  • PortVal:16位值,表示所有引脚的状态(每个bit对应一个引脚)

// 设置GPIOA所有引脚状态:Pin0=1, Pin1=0, Pin2=1, 其他=0
GPIO_Write(GPIOA, 0x0005);  // 二进制 0000 0000 0000 0101

获取引脚输入/输出电平

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

http://www.xdnf.cn/news/296839.html

相关文章:

  • 【MCP Node.js SDK 全栈进阶指南】专家篇(2):MCP多模型支持架构
  • 破解工业3D可视化困局,HOOPS Visualize助力高效跨平台协作与交互!
  • 免费轻量化办公pdf修改软件 一键格式转换基础修改到高级加密
  • React Native【详解】搭建开发环境,创建项目,启动项目
  • 【FPGA开发】什么是Streaming流式传输?流式传输的最主要的设计思想是什么?
  • Kotlin重构Android项目实践
  • RAG_Techniques:探索GitHub热门RAG技术开源项目
  • pcl对应点聚类算法
  • OpenAI大变革!继续与微软等,以非营利模式冲击AGI
  • Spring Security鉴权:文件上传需要携带token
  • 【开源深度解析】从零打造AI暗棋对战系统:Python实现中国象棋暗棋全攻略
  • 昇腾Atlas 200I DK A2 开发者套件无法上网问题的解决
  • 【JVM】从零开始深度解析JVM
  • 【Java学习】反射
  • Kubernetes排错(九)-节点排错
  • 测试因strcpy执行拷贝引起的内存溢出
  • 五一假期集训【补题】
  • Python cv2图像几何变换全攻略:从理论到实战
  • Python 函数装饰器和闭包(闭包)
  • 人工智能在心理健康领域的创新应用:从诊断到干预
  • Tensorrt 基础入门
  • 民主与民族主义作为暴力时代的财政策略
  • Python小酷库系列:bidict,可以双向查询的dict
  • 代码随想录第33天:动态规划6(完全背包基础)
  • RHCSA笔记2
  • 2025年PMP 学习五
  • 关于麒麟服务器实现docker-compose服务开机自启
  • 浔川AI测试版内测报告
  • DeepWiki 是什么,怎么使用
  • 《深度剖析:SOAP与REST,API集成的两极选择》