STM32F103笔记(二)——GPIO原理

2023-05-16

GPIO的工作原理与两个实验实例

  • 一. STM32F103 GPIO说明
    • 1. stm32 GPIO引脚的主要功能
    • 2. GPIO相关配置寄存器的简介
    • 3. STM32F103 GPIO的8种工作方式
      • 4种输入模式
      • 4种输出模式
  • 二. 点亮LED实例(如何设置某个IO的高低电平)
    • 1. 库函数版本
    • 2. 寄存器版本
  • Summary

相关资料:
《STM32中文参考手册》第105页 GPIO的功能描述
《STM32数据参考手册》第20页 相关的IO口功能描述

一. STM32F103 GPIO说明

✦ 对于STM32F103ZET6(精英版,战舰版)
一共有7组IO口(GPIO_A~GPIO_G)
每组有16个IO(GPIO_x0~GPIO_x15)
一共有7*16=122个IO

1. stm32 GPIO引脚的主要功能

▶正常IO的输入和输出

▶所以IO都有外部中断的能力

▶端口复用功能
复用功能意思是:一些端口不仅仅可以做为通用IO口,还可以复用为一些外设引脚,比如PA9,PA10可以复用做STM32的串口1引脚。(通过寄存器进行配置)
在这里插入图片描述在这里插入图片描述
▶端口重映射功能
端口重映射功能意思是:可以把某些功能引脚映射到其他引脚
如串口1默认引脚是PA9,PA10,可以通过重映射功能映射到PB6,PB7
在这里插入图片描述
在这里插入图片描述

2. GPIO相关配置寄存器的简介

每组GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)

“每组GPIO端口” 的意思是指:(GPIOA,GPIOB…GPIOG)

一组GPIO端口含有7个寄存器,一共可以控制一组GPIO端口的16个IO口
如下图:
在这里插入图片描述
关于GPIO配置寄存器的具体资料在参考手册第113页

3. STM32F103 GPIO的8种工作方式

4种输入模式

(1). 输入浮空
浮空输入状态下,IO的电平状态不确定,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的
黄色区域才有起作用,通过① I/O端口输入,最后来到④处被读取
在这里插入图片描述
(2). 输入上拉
黄色区域起作用,通过① I/O端口输入,中间通过上拉电阻将电平拉高,最后来到④处被读取在这里插入图片描述
(3). 输入下拉
黄色区域起作用,通过① I/O端口输入,中间通过上拉电阻将电平拉高,最后来到④处被读取在这里插入图片描述
(4). 模拟输入
通常用于AD转换,以电压的形式输入,不是以电平的形式在这里插入图片描述

4种输出模式

(1). 开漏输出
开漏相当于输出口接了个NPN,集电极是开路的,可以接一个电阻到3.3V,也可以接一个电阻到5V。在输出1的时,可以是5V电压,也可以是3.3V电压了.但是不接电阻上拉的时候,就无法输入高电平了。

cpu通过“输出数据寄存器”来控制“输出控制电路"的高低电平
if “输出控制电路"为高电平,N-mos管不起作用,I/O口的电平状态取决于外部拉高或者拉低,与cpu输出的无关。且cpu可通过⑤⑥⑦读取到该I/O口的电平状态。
if “输出控制电路"为低电平,N-mos管起作用,I/O口为低电平。且cpu可读取到该IO口为低电平。
在这里插入图片描述
(2). 开漏复用功能
与开漏输出类似
在这里插入图片描述
(3). 推挽式输出
推挽即有高有低,任何时候IO口的电平都是确定的,不需要外接上拉或者下拉电阻。

cpu通过输出寄存器控制“输出控制电路”
if“输出控制电路”为1,N-mos管不起作用,P-mos管起作用,I/O口为高电平
if“输出控制电路”为0,N-mos管起作用,P-mos管不起作用,I/O口为低电平

在这里插入图片描述
(4). 推挽式复用输出
与推挽式输出类似
在这里插入图片描述

二. 点亮LED实例(如何设置某个IO的高低电平)

1. 库函数版本

点亮LED本质上就是对连接LED的IO口设置低电平
在这里插入图片描述
所以对某个IO口设置高低电平大致分为以下几个步骤:

  1. 使能GPIOx的时钟
    库函数如下:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

第一个参数为GPIO端口(如GPIOA, GPIOB…)
第二个参数为“ENABLE”(使能)或“DISABLE”(不使能)

例如:该实例中LED0在为GPIOB,LED1在GPIOE
故:

void RCC_APB2PeriphClockCmd(GPIOB,ENABLE);
void RCC_APB2PeriphClockCmd(GPIOE,ENABLE);
  1. 初始化GPIOx
    库函数如下:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

第一个参数为GPIO端口(如GPIOA,GPIOB…)
第二个参数为一个结构体,该结构体有三个元素,分别是该GPIO的具体某个IO口,该IO的速度,该IO的模式

例如:该实例中LED0是GPIOB的PIN_5,LED1是GPIOE的PIN_5,且IO口的模式是PP(推挽式输出),速度是50MHz

故:
先定义一个结构体用于上面那个函数的第二个参数

GPIO_InitTypeDef GPIO_Initstr;
GPIO_Initstr.GPIO_Pin=GPIO_Pin_5;//选择具体的IO口	
GPIO_Initstr.GPIO_Mode=GPIO_Mode_Out_PP;//推挽式输出	
GPIO_Initstr.GPIO_Speed=GPIO_Speed_50MHz;//50MHz的速度

再:

GPIO_Init(GPIOB,&GPIO_Initstr);
GPIO_Init(GPIOE,&GPIO_Initstr);
  1. 设置某IO口为高电平或低电平
    库函数如下:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)//设置高电平;
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)//设置低电平;

第一个参数为GPIO端口(如GPIOA,GPIOB…)
第二个参数是在该GPIO下具体的某个IO口

例如:该实例中该实例中LED0是GPIOB的PIN_5,LED1是GPIOE的PIN_5。并且该IO设置为0时点亮,设置为1时熄灭
故:

	GPIO_SetBits(GPIOB,GPIO_Pin_5);//设置PB5为高电平	
    GPIO_SetBits(GPIOE,GPIO_Pin_5);//设置PE5为高电平

最后将上述几个模块的代码结合起来即可

2. 寄存器版本

  1. 使能GPIOx时钟。(通过配置寄存器RCC_APB2ENR)

    RCC_APB2ENR寄存器在中文参考手册的第70页

    由于该实例中该实例中LED0是GPIOB端口的,LED1是GPIOE端口。
    故将第六位置1,和第三位置1,从而使能GPIOE和GPIOB
    在这里插入图片描述在这里插入图片描述
    配置代码如下:

RCC->APB2ENR|=1<<3;//将第三位 置1
RCC->APB2ENR|=1<<6;//将第六位 置1
  1. 初始化GPIOx。(配置寄存器GPIOx_CRH/CRL)(CRH控制8-15个IO,CRL控制0-7个IO)

通过配置CRL/CRH寄存器将PB5和PE5设置为推挽式输出,速度为50MHz,作用相当于库函数版本的GPIO_Init()函数!

**CRL寄存器一共有32个位,每4个位(一个CNFx和一个MODEx)控制一个IO口

。例如CNF1和MODE1就是控制IO1** (CRH类似)

在这里插入图片描述
其中CNFx 和MODEx 的各种组合效果如下图:
在这里插入图片描述
在该实例中具体代码如下:

GPIOB->CRL&=0xFF0FFFFF;//先将PB5清零,其他位F(1111)是保留的意思
GPIOB->CRL|=0x00300000;	//后将PB5设置为3(0011)
这两行代码的作用是将PB5设置推挽式输出,速度为50MHz
!!!!!其作用相当与库函数版本的 GPIO_Init()函数!!!!!!!!
  1. 设置某IO口为高电平或低电平。(配置寄存器GPIOx_ODR或者BSRR/BRR)

通过配置ODR寄存器来将某个IO口设置为高电平;

ODR寄存器相关配置如下图:
每一个位控制一个IO口
在这里插入图片描述

GPIOB->ODR|=1<<5;//使ODR的第五位 置1,实现PB5输出高电平
GPIOE->ODR|=1<<5;//使ODR的第五位 置1,实现PE5输出高电平

最后将上述几个模块代码结合起来,就可以实现将某一个IO口设置为高电平或低电平!

Summary

库函数是利用固件库现有的函数间接地对底层的寄存器进行操作,不需要去看懂每一个寄存器,直接通过调用固件库里的函数即可,每个函数通过它的名字和介绍即可了解该函数的作用,并且每个函数的参数都可查到明确的范围。
寄存器则需了解底层每一个寄存器里每一位对应的作用,直接对寄存器每一位进行置0或置1。

GPIO的使能分为 1使能时钟,2初始化GPIO,3对具体IO置电平.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F103笔记(二)——GPIO原理 的相关文章

  • STM32F103 PB3,PB4,PA15,IO不可控问题

    STM32默认启动时PB4 PB3 PA15三个引脚不是普通IO xff0c 而是JTAG的复用功能 xff0c 分别为JNTRST JTDI JTDO 由上可以知要使PB3可以用 须关闭JTAG DP SW DP 可以不管 添加以下配置即
  • void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)的一些理解

    GPIO TypeDef GPIOA BASE 表示将GPIOA BASE强制转换为指针类型的结构体 xff0c define GPIOA GPIO TypeDef GPIOA BASE 表示用 GPIO TypeDef GPIOA BAS
  • 【STM32学习】(二)CubeMX基于HAL库GPIO输出/输入

    本文主要记录下初学cubeMX进行HAL库配置 单片机 xff1a STM32F407ZGT6 一 新建工程 打开CubeMX xff0c Access To MCU SELETOR 二 配置CubeMX 1 设置Debug方式 因为我用的
  • Arduino通过继电器控制电机(5V小马达)ESP8266-12F同理(小白初学)

    用Arduino ESP8266 12F控制电机 一 实验环境 IDE Arduino 材料 Arduino UNO ESP82266 12F 4 5V电池盒子 继电器 6脚 5V电机一个 5V小马达 面包板 杜邦线若干 二 接法 参照37
  • STM32F103 UART4串口使用DMA接收不定长数据和DMA中断发送

    一 前言 使用DMA通信的好处是 不占用单片机资源 不像普通串口中断 发送一个字节触发一次中断 发送100个字节触发100次中断 接收一个字节触发一次中断 接收200个字节触发200次中断 数据接收完毕触发一次DMA中断 发送数据完毕触发一
  • [STM32系列]二、实现STM32 GPIO端口状态实现最大速度翻转

    STM32系列 二 实现STM32 GPIO最快速度翻转 文章目录 STM32系列 二 实现STM32 GPIO最快速度翻转 前言 一 实验准备 二 测试 1 C语言翻转测试 2 汇编翻转测试 总结 前言 在STM32F103系列应用过程中
  • Linux的GPIO子系统解析 ( 一 ) 之 gpiolib.c

    文章目录 Linux的GPIO子系统解析 一 之 gpiolib c 绪论 关于GPIO子系统库文件的gpiolib c解析 drivers gpio gpiolib c gpio desc结构体 gpio chip结构体 gpio ens
  • 零基础玩转树莓派(四)—GPIO端口控制(LED灯)

    一 GPIO介绍 树莓派3B 和普通电脑不一样的地方在于它还带了40个可编程的GPIO General Purpose Input Output 可以用来驱动各种外设 如传感器 步进电机等 GPIO General Purpose I O
  • 【树莓派】error: command ‘/usr/bin/arm-linux-gnueabihf-gcc‘ failed with exit code 1(已解决)

    输入以下命令 export CFLAGS fcommon pip3 install RPi GPIO 参考网址 https askubuntu com questions 1290037 error while installing rpi
  • 学习笔记:STM32的ACD

    STM32f103系列有3个ADC ADC1 ADC2 ADC3 通道 ADC1和ADC2都有16个外部通道 2个内部通道 连接到温度传感器和内部参考电压 VREFINT 1 2V ADC3有8个外部通道 通道列表 通道顺序转换 使用多个通
  • STM32进入STOP模式并唤醒实验总结

    项目需求 需要实现设备低功耗功能 实现过程中遇到几个问题 以此记录总结 stm32f103ret6 问题一 执行PWR EnterSTOPMode PWR Regulator LowPower PWR STOPEntry WFI 后 程序继
  • STM32配合火焰传感器的火灾报警

    实验材料 STM32F03 我这里用的是正点原子的战舰 火焰传感器 还有个蜂鸣器 我这个开发板自带 也是可外接的 火焰传感器介绍 工作原理 传感器模块在环境火焰光谱或者光源达不到设定阈值时 DO 口输出低电平 当外界环境火焰光谱或者光源超过
  • STM32串口配置实验

    STM32 串口简介 串口作为 MCU 的重要外部接口 同时也是软件开发重要的调试手段 其重要性不言而喻 现在基本上所有的 MCU 都会带有串口 STM32 自然也不例外 STM32 的串口资源相当丰富的 功能也相当强劲 ALIENTEK
  • RK3568-GPIO控制

    RK3568 GPIO控制 1 Sysfs接口 实现逻辑 芯片的GPIO由芯片的GPIO控制器来管理 GPIO控制器封装在芯片内部 控制器的驱动芯片厂家已经写好了 RK3568有五组GPIO控制器 每组管理32个引脚 对应 dev下的gpi
  • STM32基本IO的寄存器介绍

    STM32基本IO的寄存器介绍 说明 简介 端口配置低寄存器 32位 数据寄存器 32位 置位 复位寄存器 32位 复位寄存器 16位 锁存寄存器 32位 说明 最近自己在学习STM32 跟着原子哥的STM32教学视频学习 参考的资料有来自
  • Python 按键和按键释放监听器

    我正在使用 python 代码控制一辆遥控玩具车 截至目前 代码如下 def getkey fd sys stdin fileno old termios tcgetattr fd new termios tcgetattr fd new
  • 什么是 /sys/class/gpio/export 和 `/sys/class/gpio/unexport 机制以及底层 sysfs 功能是什么?

    在 Android 和 Linux 下使用旧版 sysfs GPIO 的第一步是export您要使用的特定 GPIO 引脚 当您完成 GPIO 引脚的操作后unexport it 我一直在寻找一个解释export命令实际上是这样做的 但是我
  • mmap 比 ioremap 慢

    我正在为运行 Linux 2 6 37 的 ARM 设备进行开发 我正在尝试尽快切换 IO 引脚 我制作了一个小内核模块和一个用户空间应用程序 我尝试了两件事 使用以下命令直接从内核空间操作 GPIO 控制寄存器ioremap mmap G
  • 从内核模块向用户空间通知 GPIO 中断[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一段代码可以检测内核模块中的 GPIO 中断 现在 我正在寻找一种机制 在检测到来自内核模块的 gpio 中断时通知用户空间 任何与不同选项
  • Beaglebone Black 上的 GPIO

    我目前遇到了 Beaglebone black GPIO 引脚的问题 我正在寻找一种正确的方法来读取 C 中的 GPIO 引脚 p8 4 的值 如果我理解正确的话 我尝试使用一个库 该库使用了在引入设备树之前不支持的旧方法 我尝试寻找其他解

随机推荐

  • 第十四篇,STM32的CAN总线通信

    1 CAN总线的概念 CAN指的是控制器局域网网络 Controller Area Network xff0c 由德国博世汽车电子厂商开发出来 CAN使用差分信号 xff0c 具有较强的抗干扰能力和传输稳定性 CAN属于多主通信 xff0c
  • OpenCV图像处理学习十九,像素重映射cv::remap

    一 像素重映射概念 重映射就是把输入图像中各个像素按照制定的规则顺序映射到另外一张图像的对应位置上去 xff0c 形成一张新的图像 二 像素映射API函数接口 cv remap xff08 InputArray src 输入图像 Outpu
  • OpenCV图像处理学习二十一,直方图比较方法

    一 直方图比较 直方图比较是对输入的两张图像进行计算得到直方图H1与H2 xff0c 归一化到相同的尺度空间 xff0c 然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度 xff08 每张图像都有唯一的直方图与之对应 xff0
  • 嵌入式FreeRTOS学习九,任务链表的构成,TICK时间中断和任务状态切换调度

    一 tskTaskControlBlock 函数结构体 在tskTaskControlBlock 任务控制块结构体中 xff0c 其中有任务状态链表和事件链表两个链表成员 xff0c 首先介绍任务状态链表这个结构 xff0c 这个链表通常用
  • SOAP传输协议

    一 HTTP传输协议 超文本传输协议 xff08 HyperText Transfer Protocol xff0c 缩写 xff1a HTTP xff09 xff0c 它是基于请求 响应的模式协议 xff0c 客户端发出请求 xff0c
  • ONVIF简介

    一 什么是ONVIF ONVIF规范描述了网络视频的模型 接口 数据类型以及数据交互的模式 并复用了一些现有的标准 xff0c 如WS系列标准等 ONVIF规范的目标是实现一个网络视频框架协议 xff0c 使不同厂商所生产的网络视频产品 x
  • gsoap工具生成onvif设备搜索(remotediscovery)代码框架

    什么是gsoap工具 xff1f gSOAP 提供了两个工具来方便开发人员使用 C C 43 43 语言快速开发Web 服务应用 xff0c 通过 gSOAP 提供的这两个工具 xff0c 开发人员可以快速生成服务端与客户端代码框架 xff
  • Latex之给字符上加横线、波浪等

    Latex 前几天想在 x x x 上加波浪号 xff0c 一时间忘记怎么打 xff0c 现在记录下来 xff0c 以后好查阅 加 号 xff1a hat x 加横线 xff1a overline x 加宽 xff1a widehat x
  • 数据结构笔记-2(线性表)

    线性表 2 1 线性表 1 定义 是零个或多个具有相同类型的数据元素的有序数列 xff1b xff08 长度等于零的线性表为空表 xff09 非空线性表通常记为 xff1a L xff1d a 1 xff0c a 2 xff0c xff0c
  • 数据结构-6(图)

    图 图的逻辑结构 图的定义 xff1a 图是由顶点的有穷非空集合和顶点之间边的集合组成 xff0c 通常表示为 xff1a G 61 V xff0c E 其中 xff1a G表示一个图 xff0c V是图G中顶点的集合 xff0c E是图G
  • 【leetcode常见面试题】螺旋矩阵解题思路

    文章目录 螺旋矩阵解题思路先找行进路线找每条路线的结束位置再找每条路线的结束位置模拟行走 螺旋矩阵 II总结 螺旋矩阵 解题思路 本题可以采用模拟的方式 xff0c 设4种行走方向 xff0c 如下图 xff1a 先找行进路线 4个方向的行
  • C++面向对象程序设计学习心得

    C 43 43 面向对象程序设计学习心得 经过几周c 43 43 面向对象程序设计的学习 xff0c 对面向对象程序设计有了一些了解 递归 简单地讲 xff0c 递归就是程序直接或间接调用本身的编程技巧 xff0c 通过把一个不能或不好解决
  • STL学习心得

    STL概述 STL组件 1 容器 xff08 Container xff09 xff0d 管理某类对象的集合 2 迭代器 xff08 Iterator xff09 xff0d 在对象集合上进行遍历 xff08 注意 xff1a 这些集合可能
  • 安装nodejs和vue出现问题

    安装nodejs国内镜像时报错 npm install g cnpm registry 61 https registry npm taobao org不知道这是啥错误 xff0c 怎么改啊 xff1f 安装vue 从官网点击下载 下载后点
  • Jetson nano/nx通过网线连接电脑实现远程控制

    Jetson nano nx通过网线连接电脑实现远程控制 摘要1 nano nx桌面共享设置2 安装dconf editor解除加密3 自启VNC server4 网络共享5 获取IP地址6 安装PuTTy7 安装VNC Viewwer8
  • 一文解决MySQL突击面试,关键知识点总结

    文章目录 MySQL重要知识点回顾一 索引1 为什么需要索引2 索引的结构3 避免索引失效3 1 联合索引不满足最左匹配原则3 2 隐式转换3 3 like查询3 4 索引列存在运算或者使用函数3 5 优化器 4 执行计划4 1 type4
  • 51单片机应用篇-- --数码管60秒计时,独立按键可调

    开篇先说一句废话 本旺名字叫萨摩耶 xff0c xff0c Please 叫我旺财 xff0c xff0c xff0c 哈哈 xff0c 招财进宝嘛 xff01 缘由 本来按照我的学习计划 xff0c 我现在应该是单片机的学习过程 xff0
  • 【ESP32+freeRTOS学习笔记之“ESP32环境下使用freeRTOS的特性分析(3-多核环境下的调度)”】

    目录 1 不同核心上分别调度2 tick中断3 关于抢占4 关于同优级的任务按时间片调度5 空闲任务6 调度程序暂停7 启动和终止8 禁用中断9 总结 Vanilla FreeRTOS调度器是具有时间切片的固定优先级抢占调度器 xff0c
  • C++ STL 总结(持续更新)

    因为机试需要用c 43 43 xff0c 暴风吸入式学习 xff08 套用 xff09 它的模板 xff0c 发现还真的挺好用的 xff0c 总结一下 时间紧急 xff0c 取自各个网上的博客 xff0c 没来得及仔细整理 xff0c 都给
  • STM32F103笔记(二)——GPIO原理

    GPIO的工作原理与两个实验实例 一 STM32F103 GPIO说明1 stm32 GPIO引脚的主要功能2 GPIO相关配置寄存器的简介3 STM32F103 GPIO的8种工作方式4种输入模式4种输出模式 二 点亮LED实例 xff0