STM32的寄存器深度解析

news2024/9/27 15:22:45

目录

一、STM32 寄存器概述

二、寄存器的定义与作用

三、寄存器分类

1.内核寄存器

2.外设寄存器

四、重要寄存器详解

1.GPIO 相关寄存器

2.定时器相关寄存器

3.中断相关寄存器

4.RCC 相关寄存器 

五、寄存器操作方法

1.直接操作寄存器

2.使用库函数操作寄存器 

六、总结


        在嵌入式系统开发中,STM32 微控制器以其强大的性能和丰富的功能而备受青睐。而理解和掌握 STM32 的寄存器是深入学习和开发 STM32 的关键。本文将详细介绍 STM32 的寄存器,帮助读者更好地理解和应用 STM32。

一、STM32 寄存器概述

        寄存器是 CPU 内部用来存放数据的小型存储区域,具有高速存储的特点。在 STM32 中,寄存器可以暂存指令、数据和地址,为微控制器的高效运行提供了关键支持。例如,通过对特定寄存器的操作,可以实现对 GPIO(通用输入输出)端口的配置,控制外设的输入输出状态。在实际的嵌入式开发中,了解和掌握 STM32 寄存器的使用方法至关重要。它不仅可以帮助开发者实现对硬件的精确控制,还能提高程序的性能和可移植性。无论是直接操作寄存器,还是使用高级的库函数,都需要对寄存器的原理有深入的理解。

二、寄存器的定义与作用

        寄存器是一种有限存贮容量的高速存贮部件,在 STM32 微控制器中,它作为 CPU 内部的小型存储区域,起着至关重要的作用。寄存器可以暂存指令、数据和地址,就像一个特殊的地址存放数据的地方。例如,存放数据的寄存器可以直接存储某个引脚的高低电平数据,当需要读取这个数据时,就可以直接到这个寄存器所在的地方询问数据是多少。不同的数据会存放在不同的寄存器中,通过地址来区分这些寄存器,就像不同的行李寄存处在不同的店铺号一样。

        指令、地址寄存器与数据寄存器类似,里面存放的都是 0 和 1,在特定的规定下,数据寄存器里面存放的 0 和 1 表示数据,指令寄存器里存放的表示指令。可以把寄存器类比为有特殊功能的地方,既然是个地方当然就有地址了,所以,可以把寄存器想象为特殊的地址。比如厨房可以类比为寄存器,负责做饭这个特殊功能;仓库也是个寄存器,负责存东西这个特殊功能。需要某些功能的时候,就要操作某个寄存器。

三、寄存器分类

1.内核寄存器

  • 通用目的寄存器:用于存储数据和地址,参与算术逻辑运算等操作。在 STM32 中,通用目的寄存器包括 R0-R15 等。其中 R0-R7 是低组寄存器,所有指令都能访问;R8-R12 是高组寄存器,16 位指令不能访问,32 位指令不受限制。
  • 堆栈指针寄存器(R13):每一种异常模式(如中断等)都有其自己独立的 R13,通常指向异常模式所专用的堆栈。不同的模式下都有各自独立的堆栈,用于在程序执行过程中保存临时数据、局部变量等,保证各种模式下程序的状态的完整性。
  • 连接寄存器(R14):保存子程序返回地址。当使用 BL 或 BLX 指令进行跳转时,跳转指令自动把返回地址放入 R14 中,子程序通过把 R14 复制到程序计数器 PC 来实现返回。当异常发生时,异常模式的 R14 用来保存异常返回地址。
  • 程序计数器(R15):存放正在执行的指令的地址。在读取时,返回的值是当前指令的地址加上一定的偏移量(这与处理器的架构和流水线设计有关);向 PC 中写数据,会引起一次程序的分支。

2.外设寄存器

  • 控制寄存器(xxx_CR):用来控制、配置外设的工作方式,例如 GPIO 端口模式寄存器(GPIOx_MODER),可以配置 GPIO 引脚为输入、输出、模拟等不同的工作模式。
  • 状态寄存器(xxx_SR):存储了当前外设的工作状态,例如串口的状态寄存器(USART_SR),可以通过读取该寄存器的某些位来判断串口是否发送完成、是否接收到数据等。
  • 数据寄存器(xxx_DR):用于存储外设进行输入输出的数据。比如 GPIO 端口的输入数据寄存器(GPIOx_IDR)用于读取 GPIO 引脚的输入状态,输出数据寄存器(GPIOx_ODR)用于设置 GPIO 引脚的输出状态。
  • 位操作寄存器:针对某些需要对单个位进行操作的场景,STM32 提供了位操作寄存器。例如 GPIOx_BSRR(设置 / 清除寄存器),可以对 GPIO 引脚的单个位进行置位和复位操作,方便了对特定引脚位的控制,而不必对整个寄存器进行操作。
  • 锁定寄存器:用于锁定某些寄存器的配置,防止意外的修改。比如 GPIO 端口配置锁定寄存器(GPIOx_LCKR),可以在配置完成后锁定 GPIO 的配置,避免误操作改变引脚的配置。

四、重要寄存器详解

1.GPIO 相关寄存器

  • GPIO 端口模式寄存器(GPIOx_MODER)
    • 功能:用于配置 GPIO 引脚的工作模式,如输入、输出、模拟、复用等模式。
    • 位定义:每两位控制一个引脚的模式,比如 00 表示输入模式,01 表示输出模式,10 表示模拟模式,11 表示复用功能模式。
    • 举例:若要将 GPIOA 的引脚 5 配置为输出模式,需要将 GPIOA_MODER 寄存器的第 10、11 位设置为 01。
  • GPIO 端口输出类型寄存器(GPIOx_OTYPER)
    • 功能:配置 GPIO 引脚的输出类型是推挽输出还是开漏输出。
    • 位定义:每一位对应一个引脚,0 表示输出推挽(复位状态),1 表示输出开漏。
    • 举例:将 GPIOA_OTYPER 的第 5 位设置为 1,可将 GPIOA 的引脚 5 配置为开漏输出。
  • GPIO 端口输出速度寄存器(GPIOx_OSPEEDR)
    • 功能:设定 GPIO 引脚的输出速度,速度越快,功耗越高,但信号传输速度也越快。
    • 位定义:每两位控制一个引脚的输出速度,00 表示 2MHz(低速),01 表示 25MHz(中速),10 表示 50MHz(快速),11 表示 30pF 时为 100MHz(高速,15pF 时为 80MHz 输出最大速度)。
    • 举例:若要将 GPIOA 的引脚 3 的输出速度设置为快速,需将 GPIOA_OSPEEDR 寄存器的第 6、7 位设置为 10。
  • GPIO 端口上拉 / 下拉寄存器(GPIOx_PUPDR)
    • 功能:配置 GPIO 引脚的上拉或下拉状态,用于在输入模式下确保引脚的默认电平状态。
    • 位定义:每两位控制一个引脚,00 表示无上拉或下拉(浮空),01 表示上拉,10 表示下拉,11 为保留。
    • 举例:将 GPIOA_PUPDR 的第 4 位设置为 01,可将 GPIOA 的引脚 4 配置为上拉输入。
  • GPIO 端口输入数据寄存器(GPIOx_IDR)
    • 功能:该寄存器为只读寄存器,用于读取 GPIO 引脚的输入电平状态。
    • 位定义:每一位对应一个引脚,读取该位的值为 0 或 1,分别表示对应引脚的低电平或高电平。
    • 举例:读取 GPIOA_IDR 寄存器的值,可以获取 GPIOA 所有引脚的输入电平状态。
  • GPIO 端口输出数据寄存器(GPIOx_ODR)
    • 功能:可通过软件读写该寄存器来设置 GPIO 引脚的输出电平,写入 0 为低电平,写入 1 为高电平。
    • 位定义:每一位对应一个引脚的输出状态。
    • 举例:向 GPIOA_ODR 寄存器的某一位写入 1,可将对应引脚设置为高电平输出。
  • GPIO 端口置位 / 复位寄存器(GPIOx_BSRR)
    • 功能:用于对 GPIO 引脚进行置位或复位操作,操作方式简单快速,无需通过修改 GPIOx_ODR 寄存器来实现。
    • 位定义:寄存器的高 16 位为复位位,低 16 位为置位位。写入 1 到相应的位可对引脚进行操作,写入 0 则无操作。
    • 举例:要将 GPIOA 的引脚 2 置位,可向 GPIOA_BSRR 寄存器的第 2 位(低 16 位中的第 2 位)写入 1;要将引脚 7 复位,可向 GPIOA_BSRR 寄存器的第 7 位(高 16 位中的第 7 位)写入 1。
  • GPIO 端口配置锁定寄存器(GPIOx_LCKR)
    • 功能:用于锁定 GPIO 的配置,防止意外的修改。
    • 位定义:第 16 位为锁定键,写入特定的序列可激活锁定功能;第 0 - 15 位为锁定位,用于指定哪些引脚的配置被锁定。
    • 举例:按照锁定键写序列操作 GPIOx_LCKR 寄存器,可锁定 GPIO 引脚的配置。

2.定时器相关寄存器

  • 自动装载寄存器(TIMx_ARR)
    • 功能:决定了定时器的计数周期。当定时器的计数器达到 ARR 的值时,会产生更新事件,可用于触发中断或 DMA 请求等操作。
    • 工作模式:分为自动装载寄存器缓冲寄存器和自动装载寄存器影子寄存器。通过 ARPE 位控制缓冲寄存器的数据何时更新到影子寄存器。当 ARPE = 0 时,写 ARR 时数据直接写入影子寄存器;当 ARPE = 1 时,只有更新事件发生时,缓冲寄存器的数据才更新到影子寄存器。
    • 举例:若要设置定时器的周期为 1000 个计数单位,可将 TIMx_ARR 的值设置为 999(从 0 开始计数到 999 为 1000 个计数单位)。
  • 预分频器控制寄存器(TIMx_PSC)
    • 功能:对定时器的时钟源进行分频,以降低定时器的计数频率。
    • 工作模式:也分为预分频器缓冲寄存器和预分频器影子寄存器。更新事件发生时,缓冲寄存器的内容更新到影子寄存器中。
    • 举例:如果将 TIMx_PSC 的值设置为 999,且定时器的时钟源频率为 72MHz,那么经过预分频器后,定时器的计数频率为 72MHz / (999 + 1) = 72kHz。
  • 控制寄存器(TIMx_CR1 等)
    • 功能:包含定时器的各种控制位,如定时器的使能位、计数模式(向上计数、向下计数、中心对齐计数等)选择位、更新中断使能位等。
    • 位定义:不同的位具有不同的功能,通过对这些位的设置来控制定时器的工作状态。
    • 举例:设置 TIMx_CR1 寄存器的 CEN 位为 1,可使能定时器开始计数。

3.中断相关寄存器

  • 中断使能寄存器(NVIC_ISER 等)
    • 功能:用于使能相应的中断。STM32 有多个中断源,每个中断源都有对应的使能位在中断使能寄存器中。
    • 位定义:例如在 NVIC_ISER[0] 寄存器中,每一位对应一个中断号,写入 1 使能该中断,写入 0 禁止该中断。
    • 举例:要使能外部中断线 0 的中断,需要将 NVIC_ISER[0] 的第 0 位设置为 1。
  • 中断优先级寄存器(NVIC_IPR 等)
    • 功能:设置中断的优先级。STM32 支持多个中断优先级,通过对这些寄存器的设置可以确定不同中断的优先级顺序,高优先级的中断可以打断低优先级的中断执行。
    • 位定义:每个中断号都有对应的 4 位用于设置优先级,数值越小优先级越高。
    • 举例:将某个中断的优先级设置为较高优先级,可将其在 NVIC_IPR 寄存器中对应的 4 位设置为较小的值。

 

4.RCC 相关寄存器 

  • 时钟控制寄存器(RCC_CR)
    • 功能:用于开启或关闭 STM32 的各种时钟源,如高速外部时钟(HSE)、高速内部时钟(HSI)、低速外部时钟(LSE)、低速内部时钟(LSI)等,以及配置时钟的相关参数,如时钟的分频系数等。
    • 位定义:不同的位对应不同的时钟源和参数设置,通过对这些位的操作来控制时钟的状态。
    • 举例:要开启 HSE 时钟,需要将 RCC_CR 寄存器的 HSEON 位设置为 1。
  • 时钟配置寄存器(RCC_CFGR)
    • 功能:用于配置系统时钟的来源以及各种分频系数,如 AHB、APB1、APB2 等总线的分频系数,以确定不同外设的时钟频率。
    • 位定义:通过设置寄存器中的不同位来选择系统时钟源(如 HSE、HSI 等)以及设置分频系数。
    • 举例:若要将系统时钟设置为 HSE 经过分频后作为系统时钟,需要在 RCC_CFGR 寄存器中进行相应的设置。

 

五、寄存器操作方法

1.直接操作寄存器

  • 通过指针直接访问寄存器地址,进行读写操作。这种方法需要对寄存器地址有准确的了解,并且需要注意数据类型的匹配。
  • 例如:
#define GPIOA_BASE (0x40020000UL)
#define GPIOA_MODER (*(volatile uint32_t *)(GPIOA_BASE + 0x00))

void setup_gpio()
{
    GPIOA_MODER |= (1 << 10); // 设置 GPIOA 引脚 5 为输出模式
}

2.使用库函数操作寄存器 

  • STM32 提供了丰富的库函数,可以方便地对寄存器进行操作。使用库函数可以提高开发效率,并且减少错误的发生。
  • 例如:
#include "stm32f4xx.h"

void setup_gpio()
{
    GPIO_InitTypeDef GPIO_InitStruct;

    // 使能 GPIOA 时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    // 配置 GPIOA 引脚 5 为输出模式
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
}

六、总结

STM32 的寄存器是控制微控制器功能的关键。通过对寄存器的深入理解和掌握,可以实现对 STM32 的精确控制,提高开发效率和系统性能。在实际开发中,可以根据具体需求选择直接操作寄存器或使用库函数操作寄存器。同时,需要注意寄存器的地址和数据类型的匹配,以及操作的安全性和稳定性。希望本文对读者理解和应用 STM32 的寄存器有所帮助。 

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

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

相关文章

4个方法教你图片转PDF怎么弄。

我们有时候会接触了一些重要的图片文件或者资料&#xff0c;想要装换成可编辑的PDF格式&#xff0c;更方便自己管理。这时候就会需要转换的工具&#xff0c;我这里就有&#xff14;款可以完成这种转换的高效工具可以分享给大家。 1、365PDF转换软件 直通车&#xff1a;www.pdf…

软件设计之JavaWeb(3)

软件设计之JavaWeb(3) 此篇应在MySQL之后进行学习: 路线图推荐&#xff1a; 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷全新JavaWeb教程&#xff0c;企业主流javaweb技术栈 资料可以去尚硅谷官网免费领取 此章节最好学完JDBC观看 学习内容&#xff1a; 请求转发…

jenkins流水线+k8s部署springcloud微服务架构项目

文章目录 1.k8s安装2.jenkins安装3.k8s重要知识1.简介2.核心概念3.重要命令1.查看集群消息2.命名空间3.资源创建/更新4.资源查看5.描述某个资源的详细信息6.资源编辑7.资源删除8.资源重启9.查看资源日志10.资源标签 4.k8s控制台1.登录2.界面基本操作1.选择命名空间2.查看命名空…

损耗金属件检测系统源码分享

损耗金属件检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

全球和局部精细化:提升大模型推理能力的新方法

人工智能咨询培训老师叶梓 转载标明出处 尽管大模型在数学、科学或编程任务上表现出优异的推理精细化能力&#xff0c;但它们在没有外部反馈的情况下&#xff0c;很难识别何时何地需要精细化。为了解决这一问题&#xff0c;来自Meta的FAIR团队和佐治亚理工学院的研究者们提出了…

智能营销才是营销的未来

智能营销新纪元&#xff1a;大模型如何为运营与产品经理赋能 在数字化浪潮席卷全球的今天&#xff0c;营销行业正经历着一场前所未有的变革。随着人工智能技术的飞速发展&#xff0c;特别是大模型技术的兴起&#xff0c;为产品经理和运营人员提供了前所未有的工具与视野&#…

雷·达利欧(Ray Dalio)的20条《原则》

达利欧在《原则》&#xff08;Principles&#xff09;一书中总结了许多实用的原则。这些原则被广泛认同&#xff0c;并且适用于多种情景。以下是20条核心原则的英语原文以及中文翻译&#xff1a; 1. Embrace reality and deal with it. 翻译: 拥抱现实并应对它。适合场景: 适用…

c++中的继承和多态

目录 Linux中的管道通信 ​编辑派生类的默认成员函数 继承 派生类的构造 隐藏 如何设计一个不能被继承的类 菱形继承 virtual virtual是如何解决的 内存对象模型 继承和组合 继承 组合 多态 概念 多态的构成条件 虚函数的重写 Linux中的管道通信 派生类的默认成…

[数据集][目标检测]俯拍航拍森林火灾检测数据集VOC+YOLO格式6116张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6116 标注数量(xml文件个数)&#xff1a;6116 标注数量(txt文件个数)&#xff1a;6116 标注…

Lombok介绍

一、Lombok 1.1何为Lombok Lombok是Java的一个库&#xff0c;是一个工具&#xff0c;使用这个工具能够使得我们通过使用注解的方式减少Java中代码的开发。其简化主要是针对Java中的简单Java对象(就是无继承、无实现的)类。我们化简的就是这些类中重复冗余出现的构造函数&#…

运算符学习

ctrlaltL 自动格式化代码 原码反码补码 负数用反码去计算不会出错。跨零就会出错。补码解决了 字节-128到127

双指针的用法以及示例

当然可以&#xff01;双指针&#xff08;Two Pointers&#xff09;是一种常用的算法技巧&#xff0c;特别适用于处理数组或链表等线性数据结构的问题。以下是双指针用法的总结&#xff1a; 双指针用法总结 基本概念&#xff1a; 双指针技术使用两个指针在数据结构上进行遍历&a…

SpringBoot集成Thymeleaf模板引擎,为什么使用(详细介绍)

学习本技术第一件事&#xff1a;你为什么要使用&#xff0c;解决什么问题的&#xff1f; 1.为什么使用&#xff08;使用背景&#xff09;&#xff1f; 首先应用场景是单体项目&#xff0c;如果是前后端分离就不用关注这个了&#xff0c;因为单体项目你前后端都是写在一个项目…

关于决策树的一些介绍(二)

我之前写过一篇关于决策树的文章&#xff0c;但在那篇文章里没有提及基尼系数&#xff0c;信息熵与信息增益等相关问题&#xff0c;所以我将在这篇文章中进行补充。 一、 决策树的一份python代码 首先&#xff0c;我先给出一份最基础的决策树代码&#xff0c;在这里&#xff…

在 Python 画图中同时设置中英文字体

前言 在使用matplotlib.pyplot画图时&#xff0c;默认情况下都是黑体字&#xff0c;很不美观。如果含有中文&#xff0c;可能无法显示&#xff1b;显示了中文之后英文字体就不能使用。本文针对这些问题逐一给出解决方案。 同时设置中英文字体 我们都知道&#xff0c;按照下面的…

00898 互联网软件应用与开发自考复习

资料来自互联网软件应用与开发大纲 南京航空航天大学 高纲4295和JSP 应用与开发技术(第 3 版) 马建红、李学相 清华大学出版社2019年 识记:要求考生能够识别和记忆本课程中有关互联网软件开发与应用的概念性内容,并能够根据考核的不同要求,做出正确的表述、选择和判断。领会…

合资油车断崖式崩盘,买车的千万慎重了

文 | AUTO芯球 作者 | 雷慢 合资车&#xff0c;燃油车全体大逃亡的时候来了&#xff0c; 你敢信吗&#xff0c;8月份&#xff0c;国内新能源汽车零售渗透率达到54%&#xff0c; 我给大家讲个冷笑话&#xff0c; 几个月前还有车企老总说什么&#xff0c; “只要传统车企一发…

linux 操作系统下的curl 命令介绍和使用案例

linux 操作系统下的curl 命令介绍和使用案例 1. curl 命令简介 curl 是一个利用 URL 规则在命令行下工作的文件传输工具。它支持文件的上传和下载&#xff0c;是综合传输工具&#xff0c;但传输的协议主要是 HTTP/HTTPS 和 FTP。curl 还支持很多种类型的服务器认证方式&#…

网络(三)——协议是什么???

文章目录 协议的概念结构化数据网络计算机服务端定制协议客户端代码 协议的概念 计算机之间的传输媒介是光信号和电信号。通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息。要想传递各种不同的信息&#xff0c;就需要约定好双方的数据格式。 结构化数据 我们知道TCP是面向…

Linux基础---07文件传输(网络和Win文件)

Linux文件传输地图如下&#xff0c;先选取你所需的场景&#xff0c;若你是需要Linux和Linux之间传输文件就查看SCP工具即可。 一.下载网站文件 前提是有网&#xff1a; 检查网络是否畅通命令&#xff1a;ping www.baidu.com&#xff0c;若有持续的返回值就说明网络畅通。Ctr…