STM32的GPIO寄存器描述

news2025/1/16 15:52:37

寄存器:

        软件控制硬件(在程序中操作对应控制器),通过寄存器,就是 寄存器(可以存放数据),但是其中的数据具有特定的硬件含义(查看芯片手册),设置寄存器的值,对应的控制器就执行对应的工作。相当于寄存器就是控制器硬件留给软件的接口

具体操作:

  • 寄存器是硬件与软件的接口

    • 寄存器本质上是一个特定地址上的存储单元,它能够存储数据,并且这些数据代表特定的硬件状态或控制指令。硬件厂商在设计芯片时,会为各种外设(如GPIO、UART、SPI等)设计一系列寄存器,每个寄存器内的每一位(bit)或一组位(bits)都具有特定的意义和功能。
    • 软件程序通过读写这些寄存器中的数据,控制或获取硬件的状态。
  • 寄存器的具体意义由芯片手册定义

    • 芯片手册(例如STM32的参考手册)详细描述了每个寄存器的功能、地址、位的意义以及如何通过设置寄存器来控制硬件的行为。
    • 例如,对于STM32中的GPIO寄存器,设置某个位可以使一个引脚工作在输出模式或者输入模式,写入一个寄存器的特定位可以控制引脚的电平高低。
  • 寄存器映射到特定的内存地址

    • 在微控制器中,寄存器通常是映射到一个特定的内存地址范围,这称为寄存器地址映射。这些地址通常是固定的,程序通过访问这些地址来读写寄存器。
    • 例如,在STM32中,GPIOA端口的寄存器可能映射到内存地址0x40010800处。程序可以通过指针或者宏定义访问这些地址。
  • 通过寄存器配置控制器

    • 控制器硬件的行为通过寄存器的设置来控制。例如:
      • 配置引脚为输入或输出模式(通过GPIO的MODER寄存器)。
      • 启动或关闭某个外设(例如通过使能寄存器使能定时器、ADC等)。
      • 设置通信协议的波特率、时钟频率等。

    通过编写软件来修改寄存器的内容,程序可以控制硬件如何工作。比如:

    • 控制GPIO引脚的高低电平,驱动外部LED开关。
    • 通过修改ADC配置寄存器,启动模数转换并获取数据。
    • 通过USART寄存器,设置串口通信参数并发送数据

下面以 STM32F103RCT6为例子:

        在STM32F103RCT6中,GPIO端口的配置主要通过两个寄存器来控制,分别是GPIO_CRL(低寄存器)和GPIO_CRH(高寄存器)。每个寄存器的每4位对应一个引脚的具体配置,其中包括两位用于设置引脚的模式(MODE),两位用于设置引脚的配置(CNF)。

  • CNFy[1:0](引脚的配置位,分别控制浮空、上拉、开漏等模式):

    • 位31:3027:2623:2219:1815:1411:107:63:2:分别对应端口的第7到第0位的配置。

    • 这些位的具体配置如下:

      • 输入模式(MODEy[1:0] = 00)下:

        • 00:模拟输入模式。
        • 01:浮空输入模式(复位后的默认状态)。
        • 10:上拉/下拉输入模式(具体选择上拉或下拉取决于GPIO_ODR寄存器)。
        • 11:保留(不使用)。
      • 输出模式(MODEy[1:0] > 00)下:

        • 00:通用推挽输出模式。
        • 01:通用开漏输出模式。
        • 10:复用功能推挽输出模式。
        • 11:复用功能开漏输出模式。
  • MODEy[1:0](引脚的模式位,分别控制引脚是输入、输出及输出速度):

    • 位29:2825:2421:2017:1613:129:85:41:0:分别对应端口的第7到第0位的模式。

    • 这些位的具体配置如下:

      • 00:输入模式(复位后的默认状态)。
      • 01:输出模式,最大输出速度为10 MHz。
      • 10:输出模式,最大输出速度为2 MHz。
      • 11:输出模式,最大输出速度为50 MHz。

当然,这只是配置了对应的GPIO模式,并不能设置值,设置值需要通过端口输入数据寄存器(GPIOx_IDR)  端口输出数据寄存器(GPIOx_ODR)

 

 例子:配置 STM32F103 的 PC1 引脚为输入模式,并读取其电平状态;

1. 配置 PC1 为浮空输入模式,并读取电平状态。

步骤:

  • 配置 PC1 引脚为浮空输入模式。
  • 读取 GPIOC_IDR(输入数据寄存器)的相应位来判断 PC1 引脚的电平状态。
// 配置 PC1 为浮空输入模式
GPIOC->CRL &= ~(0xF << 4);  // 清除PC1的 CNF1 和 MODE1 位 (位4~7)
GPIOC->CRL |= (0x4 << 4);   // 设置PC1为浮空输入模式 (CNF1 = 01, MODE1 = 00)

// 读取 PC1 的输入电平
uint32_t pc1_state = (GPIOC->IDR & (1 << 1));  // 读取 PC1 的电平状态

if (pc1_state) {
    // PC1 是高电平
} else {
    // PC1 是低电平
}
  • GPIOC->CRL &= ~(0xF << 4);:首先清除 CRL 寄存器中 PC1 引脚的位(第 4 到第 7 位),因为 PC1 对应的是 CNF1MODE1(在 GPIOC_CRL 寄存器中)。
  • GPIOC->CRL |= (0x4 << 4);:设置 CNF1[1:0] = 01(浮空输入)和 MODE1[1:0] = 00(输入模式),完成浮空输入模式配置。
  • GPIOC->IDR & (1 << 1):读取 GPIOC_IDR 寄存器中 PC1 的状态(第 1 位),如果为 1,表示 PC1 是高电平;如果为 0,表示 PC1 是低电平。

下面用二进制来进行解释:

 

我们知道:

  • 0x4 是十六进制,转换为二进制是 0100
  • << 4 表示左移 4 位,即将 0100 左移 4 位。

首先,解释 0x4 的具体含义:

  • 0x4 的二进制是 0100,对应的值表示 CNF1[1:0] = 01(浮空输入模式),MODE1[1:0] = 00(输入模式)。

 

1. 0x4 转换为二进制

0x4 的二进制形式是:0x4 = 0100(二进制)

左移四位:

0000 0100 << 4 = 0100 0000

假设原来的 GPIOC->CRL 寄存器的二进制值为:

0000 0000 0000 0000 0000 0000 0000 0000

现在我们要将 0100 0000 (即 0x40)按位或到它上面:

0000 0000 0000 0000 0000 0000 0000 0000

0000 0000 0000 0000 0000 0000 0100 0000  |

=0000 0000 0000 0000 0000 0000 0100 0000

通过左移操作,0x4 被移到了 PC1 对应的位(4-7 位),然后通过按位或将它与 GPIOC_CRL 合并,确保其他位不受影响

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2214622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IntelliJ IDEA中配置scala

1.IDEA中 配置 maven 左上角 file -> Setting 选择(或直接搜maven) Build, Execution,Deployment -> Build Toos -> Maven Maven home path 选择 maven 安装目录&#xff08;bin的上层目录&#xff09; 示例&#xff1a; D:\maven\apache-maven-3.8.6 User settings…

2024.10月11日--- SpringMVC拦截器

拦截器 1 回顾过滤器&#xff1a; Servlet规范中的三大接口&#xff1a;Servlet接口&#xff0c;Filter接口、Listener接口。 过滤器接口&#xff0c;是Servlet2.3版本以来&#xff0c;定义的一种小型的&#xff0c;可插拔的Web组件&#xff0c;可以用来拦截和处理Servlet容…

基于Springboot+Vue的租房管理系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统根…

yjs机器学习常见算法01——KNN(K—近邻算法)

1.K—近邻算法 的含义&#xff1a; 简单来说就是通过你的邻居的“类别”&#xff0c;来推测你的“类别” 定义&#xff1a;如果一个样本在特征空间中的k个最相似&#xff08;即特征空间中最临近&#xff09;的样本中大多数属于某一类别&#xff0c;则该样本也属于这个类别。 2.…

Linux系统:本机(物理主机)访问不了虚拟机中的apache服务问题的解决方案

学习目标&#xff1a; 提示&#xff1a;本文主要讲述-本机(物理主机)访问不了虚拟机中的apache服务情况下的解决方案 Linux系统&#xff1a;Ubuntu 23.04&#xff1b; 文中提到的“本机”&#xff1a;代表&#xff0c;宿主机&#xff0c;物理主机&#xff1b; 首先&#xff0c…

SAM 2视觉大模型:图像和视频一键抠图,本地部署整合包

在人工智能和计算机视觉领域&#xff0c;图像和视频的分割技术一直是研究的热点。最近&#xff0c;Meta公司&#xff08;原Facebook&#xff09;推出了一款名为Segment Anything Model 2&#xff08;简称SAM 2&#xff09;的新型AI模型&#xff0c;它在图像和视频分割领域取得了…

layui table 自定义表头

自定义表头-查询 js/css静态文件引用 <!-- 引入 layui.css --> <link href"//unpkg.com/layui2.9.16/dist/css/layui.css" rel"stylesheet"> <!-- 引入 layui.js --> <script src"//unpkg.com/layui2.9.16/dist/layui.js"…

【C++打怪之路Lv9】-- vector

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

Flink系统架构和应用部署方式

目录 概述 Flink集群架构组件 Client JobManager TaskManagers 算子、Task和Subtask三者关系 概念 算子和Task的关系 Task和SubTask的关系 算子和SubTask的关系 样例 Task Slots和资源的关系 Flink应用程序部署 Flink Session 集群 Flink Job 集群 Flink Appli…

「Java服务」快速接入SkyWalking方法指南

一、背景 背景&#xff1a;Apache SkyWalking 是一个开源的分布式应用性能监控&#xff08;APM&#xff09;系统&#xff0c;主要用于监控微服务、云原生和容器化应用的性能。接入SkyWalking可以排查以智能投放服务为主的服务响应问题 技术架构 SkyWalking 的核心架构包括以…

[含文档+PPT+源码等]精品基于ssm实现的原生微信小程序线上养花系统的设计与实现

基于SSM&#xff08;Spring、SpringMVC、MyBatis&#xff09;实现的原生微信小程序线上养花系统的设计与实现背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、选题背景 随着人们生活水平的提高和环境保护意识的增强&#xff0c;养花已经成为一种流行的休闲活动。…

UE5 猎户座漂浮小岛 04 声音 材质

UE5 猎户座漂浮小岛 04 声音 材质 1.声音 1.1 导入 wav格式 1.2 循环播放 1.3 mp3转wav 1.4 新手包素材&#xff08;火焰 &#xff09; particle&#xff1a;颗粒 2.材质 2.1 基本颜色 M_Yellow 2.2 混合模式与双面材质 2.3 金属感、高光、粗糙度 M_AluminumAlloy 2.4 自…

【JAVA毕业设计】基于Vue和SpringBoot的课程管理平台

本文项目编号 T 006 &#xff0c;文末自助获取源码 \color{red}{T006&#xff0c;文末自助获取源码} T006&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 数据库设计 六、…

CyberRt实践之Hello Apollo(Apollo 9.0版本)

apollo9.0环境安装参考官方网站 apollo.baidu.com/community/Apollo-Homepage-Document?docBYFxAcGcC4HpYIbgPYBtXIHQCMEEsATAV0wGNkBbWA5UyRFdZWVBEAU0hFgoIH0adPgCY%2BADwCiAVnEAhAILiAnABZxEgOzK1Y%2BQA51M3ROUnJBsbK2WZoyUdkBhcXoAMhlwDFlARnUXZdzE9AGY%2BbFINADYpUhCEFW…

(Java企业 / 公司项目)阿里云aliyun-对象存储OSS详细从开通到配置(微服务架构选用)

OSS配置文档 注册阿里云账号 https://www.aliyun.com/ 注册成功登录阿里云。 配置bucket 进入控制台&#xff1a; 搜索OSS 点击上图中控制台“对象存储OSS”&#xff0c;立即创建Bucket: 点击“立即创建”&#xff0c;填写bucket的信息&#xff0c;如下图&#xff1a; 注意…

机器学习拟合过程

import numpy as np import matplotlib.pyplot as plt# 步骤1: 生成模拟数据 np.random.seed(0) X 2 * np.random.rand(100, 1) y 4 3 * X 2 * X**2 np.random.randn(100, 1)# 步骤2: 定义线性模型 (我们从随机权重开始) w np.random.randn(2, 1) b np.random.randn(1)#…

C++11中的原子操作及其底层缓存一致性

C中的原子变量&#xff08;atomic variables&#xff09;是一种并发编程中用于保证数据一致性和线程安全的机制。在多线程环境下&#xff0c;当多个线程同时访问或修改同一个变量时&#xff0c;可能会产生竞争条件&#xff08;race condition&#xff09;&#xff0c;导致未定义…

Javascript 使用 Jarvis 算法或包装的凸包(Convex Hull using Jarvis’ Algorithm or Wrapping)

给定平面中的一组点&#xff0c;该集合的凸包是包含该集合所有点的最小凸多边形。 我们强烈建议您先阅读以下文章。 如何检查两个给定的线段是否相交&#xff1f; c https://blog.csdn.net/hefeng_aspnet/article/details/141713655 java https://blog.csdn.net/hefeng_aspne…

C#中判断的应用说明二(switch语句)

一.判断的定义说明 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。下面是大多数编程语言中典型的判断结构的一般形式&#xff1a; 二.判…