STM32的寄存器深度解析
目录
一、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 的寄存器有所帮助。
相关文章:

STM32的寄存器深度解析
目录 一、STM32 寄存器概述 二、寄存器的定义与作用 三、寄存器分类 1.内核寄存器 2.外设寄存器 四、重要寄存器详解 1.GPIO 相关寄存器 2.定时器相关寄存器 3.中断相关寄存器 4.RCC 相关寄存器 五、寄存器操作方法 1.直接操作寄存器 2.使用库函数操作寄存器 六…...
win11 运行vmware workstation 虚拟机很卡,解决办法
本身win11的hyper V和vmare workstation有兼容性问题,正常来说,不能二者共存 需要在win11上流畅运行vmare虚拟机,需要在win11用管理员权限打开power shell 然后在里面运行命令: bcdedit /set hypervisorlaunchtype off powercfg /powerthr…...

C语言 | Leetcode C语言题解之第404题左叶子之和
题目: 题解: bool isLeafNode(struct TreeNode *node) {return !node->left && !node->right; }int sumOfLeftLeaves(struct TreeNode *root) {if (!root) {return 0;}struct TreeNode **q malloc(sizeof(struct TreeNode *) * 2001);in…...
jeesite支持db2数据库初始化sql
点击下载:jeesite5.8.1-db2-sql.rar 提取码: yqev...

微信小程序页面制作——婚礼邀请函(含代码)
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
股票量化接口api,国内股票期权怎么交易
炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取…...
Spring解决循环依赖的原理
通过将自己注入自己,使用代理对象调用add方法解决了事务失效问题,但是这样不会产生循环依赖吗? 在OrdersCreateServiceImpl 中注入的是OrdersCreateServiceImpl 的代理对象,并不是OrdersCreateServiceImpl 本身实例,构…...

Openal o1初探
9 月 13 日,OpenAI 正式公开一系列全新 AI 大模型,传说的“草莓”终于上线,但是正式命名不叫“草莓”,而是o1。 一、为什么叫o1 为什么取名叫o1,OpenAI是这么说的: For complex reasoning tasks this is…...

基于python+django+vue的学生成绩管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…...

mimd 公平收敛在相图中的细节
aimd 的收敛已经说腻了,我曾经画了好几次相图。有朋友希望我能画一个 mimd 相图,我就再画一个稍微详细的。 下面相图收敛到稳定点的前提异步 mimd: 之所以要异步,举个例子,在执行 gx 时,要确保 y 已经执…...

爬虫--翻页tips
免责声明:本文仅做分享! 伪线程 from DrissionPage import ChromiumPage import timepage ChromiumPage() page.get("https://you.ctrip.com/sight/taian746.html") # 初始化 第0页 index_page 0# 翻页点击函数 sleep def page_turn():page…...

论文内容分类与检测系统源码分享
论文内容分类与检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…...
【MySQL】将表导出CSV(可以使用excel打开)
1、准备工作 查看数据库: show databases;切换数据库: use 数据库名;查看表名字 show tables;2、单个表导出 需要替换导出csv文件目录和表名 SELECT * INTO OUTFILE 目录/文件名.csv FIELDS TERMINATED BY , ENCLOSED BY " LINES TERMINATED …...

通用四期ARM架构银河麒麟桌面操作系统V10【安装、配置FTP服务端】
一、操作环境 服务端:银河麒麟桌面操作系统V10SP1 (服务端包链接:https://download.csdn.net/download/AirIT/89747026) 客户端:银河麒麟桌面操作系统V10SP1 (客户端包链接:https://downloa…...
梧桐数据库(WuTongDB):RBO(Rule-Based Optimizer)优化器简介
RBO(Rule-Based Optimizer,基于规则的优化器) 是一种早期的数据库查询优化方法,它通过预定义的一组规则来决定查询的执行计划,而不是像 CBO(Cost-Based Optimizer,基于成本的优化器)…...

【农信网-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...

Gitea Action 简单配置(CI/CD)
线上pipeline,(我使用是本地仓库的,你们使用切换成官网的即可) # 工作流的名称name: Build and Push Docker Image deployment-k8s# 触发条件,只在 master 或 main 分支发送推送时触发 on:push:branches:- main# 作业,…...

苍穹外卖 修改nginx的端口后websocket连接失败解决
苍穹外卖 修改nginx的端口后websocket连接失败解决 问题: 后端配置好websocket后前端仍显示如图所示的错误 解决: 先用websocket在线工具测试后端是否能正常连接(这个基本上不会出现问题)用f12观察前端发送的请求 正常来说这个请…...
快速解决Linux中wine程序中文显示为方块的问题
在home目录下Ctrlh 将显示.wine文件夹,把window系统中的C:\WINDOWS\Fonts文件夹直接copy到.wine/drive_c/windows 目录中并覆盖其Fonts目录即可。 参考链接: https://www.cnblogs.com/jee-cai/p/14095220.html https://blog.csdn.net/srz2017/article/…...

【C++前后缀分解 动态规划】2100. 适合野炊的日子|1702
本文涉及知道点 C前后缀分解 C动态规划 LeetCode2100. 适合野炊的日子 你和朋友们准备去野炊。给你一个下标从 0 开始的整数数组 security ,其中 security[i] 是第 i 天的建议出行指数。日子从 0 开始编号。同时给你一个整数 time 。 如果第 i 天满足以下所有条件…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...