STM32学习笔记----(4)GPIO

2023-10-31

STM32必须掌握的有时钟树和系统架构,感觉那个是比较简单的,多看几遍就能看会了。在后面的笔记中也会记录到这些,如果自己看不懂的话可以跟着不同外设的笔记来了解一下。
这篇笔记是讲解的GPIO,学会了GPIO的话就可以完成32的第一个功能

GPIO描述

GPIO,英文全称为General-Purpose IO ports,中文意思是通用I/O端口。
在嵌入式系统中,经常需要控制许多结构简单的外部设备或者电路,这些设备有的需要通过CPU控制,有的需要CPU提供输入信号。并且,许多设备或电路只要求有开/关两种状体就够了,比如LED的亮与灭。对这些设备的控制,使用传统的串口或者并口就显得比较复杂,所以,在嵌入式微处理器上通常提供了一种“通用可编程I/O端口”,也就是GPIO。
在这里插入图片描述

GPIO外设位于APB2总线上,在使用时我们需要开APB2总线的时钟。
在这里插入图片描述
GPIO外设的最大时钟频率为72MHz。

GPIO模式

GPIO端口的每个位可以由软件分别配置
成多种模式。
─ 输入浮空
─ 输入上拉
─ 输入下拉
─ 模拟输入
─ 开漏输出
─ 推挽式输出
─ 推挽式复用功能
─ 开漏复用功能

输入配置

当I/O端口配置为输入时:
● 输出缓冲器被禁止(没有输出功能)
● 施密特触发输入被激活
● 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接
● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器模拟输入除外
● 对输入数据寄存器读访问可得到I/O状态(状态:0/1)
在这里插入图片描述

在这里插入图片描述
注意:
用寄存器编程配置上下拉输入时要注意,因为上下拉输入时,CNF0,CNF1都为0,1,所以配置上下拉输入时要配置ODR寄存器对应的位,对应位1为上拉,0为下拉,如上图所示。

输出配置

当I/O端口被配置为输出时:
● 输出缓冲器被激活
─ 开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活—不能被控制)。
─ 推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。(两个MOS管都可以被控制,此时工作一定是一个导通一个截至)
● 施密特触发输入被激活
● 弱上拉和下拉电阻被禁止(M3的单片机输出没有上下拉,M4的单片机输出有上下拉)
● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
● 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态(开漏访问输入数据寄存器可以得到I/O口的状态)
● 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。(输出状态也可以获取I/O口的状态----访问输出数据寄存器)
在这里插入图片描述
读取IO口状态的方法:
1、在开漏模式时,访问输入数据寄存器可以得到I/O口的状态
2、输出状态也可以获取I/O口的状态----访问输出数据寄存器

GPIO寄存器介绍

每个GPI/O端口有:
两个32位配置寄存器(GPIOx_CRL, GPIOx_CRH)
两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR)
一个32位置位/复位寄存器(GPIOx_BSRR)
一个16位复位寄存器(GPIOx_BRR)
一个32位锁定寄存器(GPIOx_LCKR)。
在这里插入图片描述
配置寄存器:GPIOx_CRL, GPIOx_CRH
数据寄存器:GPIOx_IDR和GPIOx_ODR

CRL and CRH 端口配置高寄存器

在这里插入图片描述

IDR 端口输入数据寄存器

在这里插入图片描述

ODR 端口输出数据寄存器

在这里插入图片描述
注意:对GPIOx_BSRR(x = A…E),可以分别地对各个ODR位进行独立的设置/清除

BSRR 端口位设置/清除寄存器

在这里插入图片描述
在标准库中让某一个端口输出1,就是对BSRR寄存器进行操作的。
为啥不用BSRR寄存器让端口输出0呢?因为操作BSRR寄存器输出0有点麻烦,还有一个BRR寄存器,让端口输出0比较简单点。如果想不明白看程序和寄存器想想就明白了。
如下所示:

/*****************************************
Sets the selected data port bits.
设置选定的数据端口位。(端口输出1)
*******************************************/
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  
  GPIOx->BSRR = GPIO_Pin;
}

BRR 端口位清除寄存器

在这里插入图片描述
在这里插入图片描述
在标准库中让某一个端口输出0,就是对BRR寄存器进行操作的,如下所示:

/****************************************
 Clears the selected data port bits.
 清除选定的数据端口位。(端口设置为0)
 ***************************************/
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  
  GPIOx->BRR = GPIO_Pin;
}

程序

了解了这些,写一个点灯的程序还是很简单的

/*******************************
一些实用的重定义
**********************************/
#define led0 GPIOB
#define led1 GPIOE


#define Led_On(port, pin)		  (port->ODR &= ~(0x1<<pin))
#define Led_Off(port, pin)	  (port->ODR |= (0x1<<pin))
#define Led_Toggle(port, pin) (port->ODR ^= (0x1<<pin))


/**************************
寄存器版本的LED初始化程序
初始化的GPIOB.5/GPIOE.5
*************************/
void LED_init(void)
{
	//开启时钟GPIOB/E
	RCC->APB2ENR |= 1<<3;
	RCC->APB2ENR |= 1<<6;
	
	//设置GPOPB5 and GPIOE5
	GPIOB->CRL&=0XFF0FFFFF; 
	GPIOB->CRL|=0X00300000;//PB.5 推挽输出 
	GPIOE->CRL&=0XFF0FFFFF; 
	GPIOE->CRL|=0X00300000;//PE.5 推挽输出 
	
	//GPIO输出初始化
	GPIOB->ODR|=1<<5;      //PB.5输出高
	GPIOE->ODR|=1<<5;      //PE.5输出高
}

/**********************************
标准库初始化
******************************/
void LED_init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	//开启时钟GPIOB/E
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
	
	//设置GPOPB5 and GPIOE5
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE,&GPIO_InitStructure);
	//GPIO输出初始化
	GPIO_SetBits(GPIOE, GPIO_Pin_3);	//PB.5输出高
	GPIO_SetBits(GPIOE, GPIO_Pin_2);  //PE.5输出高   
}

编写程序两种库的组合有:
标准库+寄存器
hal库+寄存器

GPIO就简单介绍到这里,GPIO的其他功能将会在后期用到的时候逐渐介绍。

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

STM32学习笔记----(4)GPIO 的相关文章

  • Vue项目打包并发布的完整步骤记录

    如何将Vue项目打包并发布 我这边是测试发布到本地 不过步骤是一样的 步骤如下 1 安装部署Nginx服务器 说明 Nginx engine x 是一个高性能的HTTP和反向代理服务器 也是一个IMAP POP3 SMTP服务器 同时 也是
  • HttpRunnerManager部署

    基于HttpRunner的接口自动化测试平台 HttpRunner djcelery and Django HttpRunner手册 http cn httprunner org git地址 httprunner HttpRunnerMan
  • Java空指针异常:java.lang.NullPointException原因

    Java空指针异常在工作中经常看到 之前我不是很懂这个概念以为如果某个对象没初始化就会报错结果不是 我通过debug打断点发现了具体原因和解决方法 原因 在excel上传解析的时候发现 如果没有初始化对象 里面就是null的 没有分配空间

随机推荐

  • Python爬虫自学要多久?

    时下python爬虫成为时下一种流行的编程语言 从零开始学python爬虫知识要多久了 所谓爬虫是指网络爬虫 web spider 如果把互联网比作一张巨大无比的蜘蛛网 那么web spider就是在这张网上爬来爬去的蜘蛛 而爬虫是通过py
  • 双向电平转换芯片TXB0304应用笔记

    TXB0304作为新一代自动识别方向的电平转换芯片 跟上一代同类器件TXB0104相比 具有更低的工作电压 0 9V 更高的转换速率 1 8V 3 3V间电平转换时最高速率140MBPS 以及更小的封装等优势 也正是因为需要在较低工作电压时
  • 自己动手写CSDN博客提取器源码分析之三:处理网页保存为pdf文件

    转载自 http blog csdn net w397090770 article details 7768129 下面我讲下处理pdf文件的 这里我用了PD4ML来处理的 原因有几个 1 它对CSS的支持做的很好 2 可以处理图片 很爽吧
  • python——获取当前文件路径

    1 os getcwd os getcwd 不需要参数 os getcwd 获取的是当前工作的路径 也就是脚本运行的地方 而不是脚本本身所存在的地方 代码 print os getcwd 测试结果 2 os path abspath os
  • npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! webpack_test@1.0.0 dev: `webpack` npm ERR! Exit s

    webpack打包时 报如图错误 问题产生的原因 webpack版本过高 导致npm i 时安装的依赖不再出现在node modules中 从而命令执行报错 解决方案1 运行npm i dev 安装一下开发环境下的依赖即可 随后再执行需要运
  • 云计算虚拟机技术-KVM安装

    云计算虚拟机技术 KVM安装 作者 尹正杰 版权声明 原创作品 谢绝转载 否则将追究法律责任 身为运维的小伙伴估计大家都清楚KVM 因为在CentOS里面KVM还算很折腾的一个软件 早期CentOS使用的xen虚拟化 后因收购KVM 于是就
  • 程序员工具网站(比较有意思)

    http www cxy521 com index html
  • html中中文显示乱码,网页中文显示乱码问题

    大家好 本人目前在学习ASP NET MVC5 出现了网页显示中文乱码的问题 诡异的是Home Index页面下的中文是可以正常显示的 其他页面的中文就不能正常显示了 不能正常显示中文的页面中 通过后台代码显示的字符串是正常的 直接卸载HT
  • Oracle数据库 Explain工具(语句执行索引使用情况)

    1 Explain工具的作用 Explain工具可以查看SQL语句的执行过程SQL索引的使用情况 2 Oracle数据库查看语句执行的情况语句 explain plan for select id from abc where a 1 an
  • 不确定性世界中的行为预测

    桔妹导读 自动驾驶系统中的行为预测模块主要负责预判其他交通参与者未来一段时间的行为 其困难主要源自现实世界和人类行为的高度不确定性 本文列举了现实环境中的不同场景 讨论了两种不同预测方法 即基于行为规划的预测和基于机器学习的预测 用于准确预
  • 多元统计分析实验-线性回归

    1 实验目的 通过本实验使学生熟练运用python语言编写线性回归分析程序 2 实验内容 有以下两组数据 第一组数据为我国2004年31个地区城镇居民年人均可支配收入和年人均消费性支出数据 第二组数据为随机抽查的36个人的当前年薪y 美元
  • 基于直方图均衡化的水下激光图像处理(MATLAB仿真)

    原文 http blog csdn net sunlinyi66 article details 39215447 基于直方图均衡化的水下图像增强 MATLAB仿真 可以对RGB三个通道进行直方图规定化从而实现水下图像增强 此处我们使用的是
  • python爬虫学习34

    python爬虫学习34 目录 python爬虫学习34 九 parsel 库的使用其一 9 1 parsel 库的下载 9 2 初始化 9 3 提取文本 今天呢就进入到爬虫网页数据解析提取的最后一个小节 与大家一同学习parsel库的使用
  • 牛客网 D-坐标计数

    链接 https ac nowcoder com acm contest 10746 D 来源 牛客网 题目描述 定义一个坐标变换 坐标 x y 变换后变为 x y x y 给定一片矩形区域 计算区域内有多少个整数点在经过有限次变换后变为
  • redis持久化机制

    redis持久化机制 https www jianshu com p 9d6cebe98d5a
  • C# - var 关键字

    C var 关键字 引言 var 关键字使用规则 var 在表达式中的应用 例 1 var 可以选 例 2 var 必要 引言 C 代码经常会看到 var 关键字定义一个变量 带点神秘色彩 今天就来揭秘一下 从 C 3 0 开始 在方法范围
  • 【2022年1月1日更新】宝塔+青龙+Nvjdc&一对一推送+wskey智能化+管理员推送+Ninja+SaoBing面板+kingfeng+go-cqhttp/qqbot

    前言 2023年这些技术一部分不能用了 现在最优的技术是 青龙 ark短信登录 傻妞机器人 cqhttp或one node 具体可以参考我专栏里的其他文章 专栏 青龙相关 首先声明我也不是什么大佬 只是坑踩多了有经验了而已 看了无数大佬的文
  • GitHub上排名前100的优秀开源项目

    主要对当前 GitHub 排名前 100 的项目做一个简单的简介 方便初学者快速了解到当前 Objective C 在 GitHub 的情况 若有任何疑问可通过微博 甲骨文儿联系我 项目名称 项目信息 1 AFNetworking 作者是
  • 文件系统(4)——Ubuntu system service设置自动登录

    参考链接 linux systemd启动方式解析 如何开机自动登录 开机自动运行程序 https blog csdn net a617996505 article details 88423794 涉及文件 OK3399 linux ubu
  • STM32学习笔记----(4)GPIO

    STM32必须掌握的有时钟树和系统架构 感觉那个是比较简单的 多看几遍就能看会了 在后面的笔记中也会记录到这些 如果自己看不懂的话可以跟着不同外设的笔记来了解一下 这篇笔记是讲解的GPIO 学会了GPIO的话就可以完成32的第一个功能 ST