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

stm32之GPIO寄存器

文章目录

      • 1 背景
      • 2 GPIO寄存器的类型
        • 2.1 端口配置寄存器
        • 2.2 设置/清除寄存器和位清除寄存器
      • 3 总结

1 背景

C51单片机在进行数据的输入输出时,是直接操作与外部引脚关联的内部寄存器,例如,当设置P2_1为0时,就是将外部引脚的P21引脚设置为低电平,当读取P2_1时,就是读取P21的电平。与之类似,stm32芯片内部也有很多用于输入输出的寄存器,这些寄存器也是用于操作外部引脚,但是比C51单片机复杂很多。

2 GPIO寄存器的类型

stm32的GPIO口以16位为一组,按照字母顺序分为PA、PB、PC等,PA包含PA0~PA15。

每组GPIO口需要通过多个寄存器进行读写操作:

  • CRL、CRH:端口配置低寄存器和端口配置高寄存器
  • IDR:输入数据寄存器
  • ODR:输出数据寄存器
  • BSRR:设置/清除寄存器
  • BRR:位清除寄存器
  • LCKR:锁定寄存器
2.1 端口配置寄存器

端口配置寄存器用于配置端口的模式,每个端口使用4位进行描述,总共需要64位,于是就用两个32位寄存器存储。

例如,对于GPIOA口,使用GPIOA_CRL和GPIOA_CRH两个32位寄存器进行模式的配置,其中PA0口使用GPIOA_CRL的低4位进行模式的设置,PA1使用GPIOA_CRL的从低到高的第4位到第7位(最低位索引为0)进行模式的设置,剩余端口依次类推。

4位配置的值以及含义:

请添加图片描述

当MODE1和MODE0都为0时,表示输入模式,然后根据CNF1和CNF0区分4种输入模式,否则,就是输出模式,然后根据CNF1和CNF0区分4种输出模式,并且,在输出模式下,MODE1和MODE0还可以表示输出速率。

输入数据寄存器和输出数据寄存器的含义比较明显:输入数据寄存器就是外部引脚通过内部电路转换为0和1后保存到寄存器中,输出数据寄存器则是通过内部电路转换到外部引脚的高低电平,不过两个寄存器都是32位,而外部引脚则是16个一组,因此,两个寄存器都只使用低16位。

2.2 设置/清除寄存器和位清除寄存器

输出数据寄存器只能对整个32位进行操作,如果希望对单个位进行操作(否则,就需要先读取GPIO组的数据,然修改后再整体设置),设置/清除寄存器用于对单个位进行操作。

设置/清除寄存器是32位,高16位是清除位,低16位是设置位,分别对应GPIO组的某个位。例如,GPIOA对应的设置/清除寄存器是GPIOA_BSRR,GPIOA_BSRR的高16位(31位到16位)为清除位,如果索引为20的位设置为1,则将PA4设置为0,如果索引为20的位设置为0,则无效果,同理,GPIOA_BSRR的低16位(15位到0位)为设置位,如果索引为5的位设置为1,则将PA5设置为1,如果索引为5的位设置为0,则无效果。如果针对某一位,同时设置了设置和清除,则设置位生效。

有时候,可能只需要进行清除,可以使用位清除寄存器,也叫做复位寄存器,可以将某些位设置为0。

位清除寄存器是32位,只使用低16位,如果某一位设置为1,则将对应位的输出数据寄存器的值设置为0。例如,GPIOA对应的位清除寄存器是GPIOA_BRR,如果GPIOA_BRR的索引为6的位设置为1,则将PA6设置为0,其他位无变化。

3 总结

外部引脚以16位为一组,内部的数据寄存器都是32位,为了对端口进行配置并方便的进行数据的输入输出,在提供基本的输入输出寄存器的同时,还提供了端口配置寄存器和设置/清除寄存器,能够配置寄存器的模式,并且能够方便的操作单个位。

从开发编程的角度上看,数据寄存器都是只能整体操作,而不能单个位操作,因此,如果是直接操作数据寄存器的话,就需要先读取再设置,操作起来比较麻烦,有了设置/清除寄存器,可以方便的操作单个位,而不影响其他位。而在C51单片机中,数据寄存器是可以位寻址的,可以直接对某一位进行与或的操作。

相关文章:

  • 【Hexo + Github 搭建自己的专属博客】
  • Itextpdf电子签章
  • 数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅱ)
  • 【MySQL】数据库--表操作
  • android pdf框架-10,相册浏览
  • flutter 修改app名字和图标
  • FPGA时钟资源详解(4)——区域时钟资源
  • Redis部署中的问题总汇
  • 【ansible】Failed to connect to the host via ssh Permission denied
  • Python中模块
  • 让IIS支持.NET Web Api PUT和DELETE请求
  • 《web应用技术》第一次课后练习
  • 【热门话题】Yarn:新一代JavaScript包管理器的安装与使用
  • 网络七层模型之数据链路层:理解网络通信的架构(二)
  • Go第三方框架--gin框架(二)
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • C++类中的特殊成员函数
  • java8-模拟hadoop
  • JavaScript设计模式与开发实践系列之策略模式
  • Js基础——数据类型之Null和Undefined
  • MySQL数据库运维之数据恢复
  • PAT A1092
  • Python socket服务器端、客户端传送信息
  • python 学习笔记 - Queue Pipes,进程间通讯
  • React-redux的原理以及使用
  • Spring-boot 启动时碰到的错误
  • Spring核心 Bean的高级装配
  • 初识 webpack
  • 分布式任务队列Celery
  • 配置 PM2 实现代码自动发布
  • 前端存储 - localStorage
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 日剧·日综资源集合(建议收藏)
  • 使用Gradle第一次构建Java程序
  •  一套莫尔斯电报听写、翻译系统
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # 计算机视觉入门
  • # 透过事物看本质的能力怎么培养?
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (WSI分类)WSI分类文献小综述 2024
  • (多级缓存)多级缓存
  • (分布式缓存)Redis哨兵
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (十一)手动添加用户和文件的特殊权限
  • (转)拼包函数及网络封包的异常处理(含代码)
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET运行机制
  • 。Net下Windows服务程序开发疑惑