【STM32】基础知识 第七课 存储器映射 寄存器映射

news2025/3/13 4:13:09

【STM32】基础知识 第七课 存储器映射 & 寄存器映射

  • STM32 寻址范围
  • 存储器映射
  • 存储器功能划分 (F1 为例)
    • Block 0
    • Block 1
    • Block 2
    • 寄存器映射
  • 寄存器映射 (F1 为例)
  • 寄存器映射举例
  • 寄存器地址计算
    • GPIO 外设基地址及偏移量
    • 寄存器地址及偏移量
    • 寄存器地址计算过程
  • 使用结构体映射寄存器
  • STM32F103xe.h 主要组成部分

STM32 寻址范围

32 位的单片机可以友 32 根地址线 (每根地址线有两种转态: 导通或不导通). 单片机内存地址访问的存储单元是按字节编址的 (而不是 bit)

地址线根数地址编号 (二进制)地址编号数 (即内存大小)
10, 12
200, 014
3000, 001, 010, 011, 100, 101, 110, 1118
n 2 n 2^n 2n

STM32 寻址大小: 2 32 = 4 G 2^{32} = 4G 232=4G (字节)
STM 寻址范围: 0x0000 0000~0xFFFF FFFF

STM32 存储器映射

存储器映射

存储器指可以存储数据的设备, 本身没有地址信息, 对存储器分配地址的过程称为存储器映射.

存储器功能划分 (F1 为例)

ST 将 4GB (2^32) 地址空间分成 8 个块.

存储块功能地址范围
Block 0Code (Flash)0x0000 0000 ~ 0x1FFF FFFF (512 MB)
Block 1SRAM0x2000 0000 ~ 0x3FFF FFFF (512 MB)
Block 2片上外设0x4000 0000 ~ 0x5FFF FFFF (512 MB)
Block 3FSMC Bank1&20x6000 0000 ~ 0x7FFF FFFF (512 MB)
Block 4FSMC Bank3&40x8000 0000 ~ 0x9FFF FFFF
Block 5FSMC 寄存器0xA000 0000 ~ 0xBFFF FFFF
Block 60xC000 0000 ~ 0xDFFF FFFF (512 MB)
Block 7Cortex M3 内部外设0xE000 0000 ~ 0xFFF FFFF (512 MB)

Block 0

Block0 (FLASH) 功能划分:

存储块功能地址范围
Block 0FLASH 或系统存储器别名区0x0000 0000 ~ 0x0007 FFFF (512 KB)
Block 0保留0x0008 0000 ~ 0x07FF FFFF
Block 0用户 FLASH, 用于存储用户代码0x0800 0000 ~ 0x0807 FFFF (512 KB)
Block 0保留0x0808 0000 ~ 0x1FFF EFFF
Block 0系统存储器, 存储出厂 Bootloader0x1FFF F000 ~ 0x1FFF F7FF (2 KB)
Block 0选项字节, 配置读保护等0X1FFF F800 ~ 0x1FFF F80F (16 B)
Block 0保留0x1FFF F810 ~ 0x1FFF FFFF

Block 1

Block1 (SRAM) 功能划分:

存储块功能地址范围
Block 1SRAM0x2000 0000 ~ 0x2000 FFFF (64 KB)
保留0x2001 0000 ~ 0x3FFF FFFF

Block 2

存储块功能地址范围
Block 2APB1 总线外设0x4000 0000 ~ 0x4000 77FF
Block 2保留0x4000 7800 ~ 0x4000 FFFF
Block 2APB2 总线外设0x4001 0000 ~ 0x4000 3FFF
Block 2保留0x4001 4000 ~ 0x4001 7FFFF
Block 2AHB 总线外设0x4001 8000 ~ 0x4002 33FF
Block 2保留0x4002 3400 ~ 0x5FFF FFFF

STM32 寄存器映射

寄存器映射

寄存器 (Register) 是单片机内部一种特殊的内存, 可以实现对单片机各个功能的控制.

简单来说: 寄存器就是单片机内部的控制机构.

STM32 寄存器分类:

大类小类说明
内核寄存器内核相关寄存器包含 R0~R15, xPSR, 特殊功能寄存器等
内核寄存器中断控制寄存器包含 NVIC 和 SCB 相关寄存器, NVIC 有: ISER, ICER, ISPR, IP 等. SCB 有: VTOR, AIRCR, SCR 等
内核寄存器SysTick 寄存器包含 CTRL, LOAD, VAL 和 CALIB 四个寄存器
内核寄存器内存保护寄存器可选功能, STM32F103 没有
内核寄存器调试系统寄存器ETM, ITM, DWT, IPIU 等相关寄存器
外设寄存器包含 GPIO, UART, IIC, SPI, TIM, DMA, ADC, DAC, RTC, I/WWDG, PWR, CAN, USB 等各种外设寄存器

寄存器映射 (F1 为例)

寄存器是特殊的存储器, 给寄存器地址命名的过程, 就叫寄存器映射.

寄存器地址映射寄存器名字
0x4001080C给寄存器地址命名GPIOA_ODR

寄存器映射举例

直接操作寄存器地址:

*(volatile unsigned int*)(0x4001 080C) = 0xFFFF;

定义一个名字后再操作:

#define GPIOA_ODR *(volatile unsigned int*)(0x4001080C)

GPIOA_ODR = 0XFFFF;
  • 使用volatile 关键词对寄存器地址进行修饰, 告诉编译器, 该地址运行过程中随时可能变化, 编译时不要优化该地址
  • GPFDAT 宏定义代表了某寄存器中的值

寄存器地址计算

为了方便编写代码及使用, 我们将寄存器地址分为三个部分:

  1. 总线基地址 (BUS_BASE_ADDR)
  2. 外设基于总线基地址的偏移量 (PERIPH_OFFSET)
  3. 寄存器相对外设基地址的偏移量 ( REG_OFFSET)

寄存器地址 = BUS_BASE_ADDR + PERIPH_OFFSET + REG_OFFSET

总线基地址:

总线基地址偏移量
APB 10x4000 00000
APB 20x4001 00000x1 0000
AHB0x4001 80000x1 8000

APB1 总线的基地址, 也叫外设基地址 (PERIPH_BASE).

此表的偏移量: 是相对外设基地址 (PERIPH_BASE) 来说的.

GPIO 外设基地址及偏移量

所属总线外设基地址偏移量
APB 2 0x4001 0000GPIOA0x4001 08000x800
APB 2 0x4001 0000GPIOB0x4001 0C000xC00
APB 2 0x4001 0000GPIOCox4001 1000
0x1000
APB 2 0x4001 0000GPIODox4001 1400
0x1000
APB 2 0x4001 0000GPIOEox4001 1800
0x1000
APB 2 0x4001 0000GPIOFox4001 1C00
0x1000
APB 2 0x4001 0000GPIOGox4001 2000
0x2000

此表的偏移量: 是相对 APB2 外设基地址 (APB2PERIPH_BASE) 来说的.

寄存器地址及偏移量

所属外设寄存器地址偏移量
GPIOA 0x4001 0800GPIOA_CRL0x4001 08000x00
GPIOA 0x4001 0800GPIOA_CRH0x4001 08040x04
GPIOA 0x4001 0800GPIOA_IDR0x4001 08080x08
GPIOA 0x4001 0800GPIOA_ODR0x4001 080C0x0C
GPIOA 0x4001 0800GPIOA_BSRR0x4001 08100x10
GPIOA 0x4001 0800GPIOA_BRR0x4001 08140x14
GPIOA 0x4001 0800GPIOA_LCKR0x4001 08180x18

寄存器地址计算过程

  1. 获取总线基地址, APB2 总线基地址: 0x4001 0000
  2. 获取外设地址偏移量, GPIOA 相对 APB2 总线偏移量是: 0x800
  3. 获取寄存器地址偏移量, ODR 相对 GPIOA 外设地址的偏移量是 0x0C

寄存器地址 = BUS_BASE_ADDR+ PERIPH_OFFSET+ REG_OFFSET

GPIOA_ODR = 0x4001 0000+0x800+0x0C=0x4001 080C

使用结构体映射寄存器

定义结构体:

typedef struct{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSSR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
}GPIO_TypeDEF;  // 声明变量

例子:

GPIOA_BASE: 0x4001 0800
# define GPIOA ((GPIO_TypeDef*)GPIOA_BASE)
&GPIOA->CRL: 0x4001 0800
&GPIOA->CRH: 0x4001 0804
&GPIOA->IDR: 0x4001 0808
&GPIOA->ODR: 0x4001 080C

// 实际应用
GPIOA->ODR = 0xFFFF;

STM32F103xe.h 主要组成部分

文件主要组成部分说明
stm32f103xe.h中断编号定义定义 IRQn_Type 枚举类型, 包含 STM32F103 内部所有中断编号 (中断号), 方便后续编写代码
stm32f103xe.h外设寄存器结构体类型定义以外设为单位, 使用结构体类型定义每个外设所有寄存器, 方便寄存器映射
stm32f103xe.h寄存器映射1. 定义总线地址和外设基地址
2. 使用外设结构体类型定义将外设基地址强制转换成结构体指针, 完成寄存器映射
stm32f103xe.h寄存器位定义定义外设寄存器每个功能位的位置及掩码
stm32f103xe.h外设判定判断某个外设是否合法 (即是否存在改外设)

出处: 笔记摘自正点原子

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

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

相关文章

《2-数组》

数组 1.简介: 数组(Array)是一种固定长度的存储相同数据类型在连续内存空间中的数据结构 引出:[索引 (Index)]----元素在数组中的位置 2.初始化 写法:一般用到无初始值、给定初始值 在不给定…

中国制造业连续13年全球第一,MES管理系统,打造竞争新优势

根据工业和信息化部最近发布的数据,在2022年,中国的制造业增加值在全球的占比接近30%,制造业规模已连续13年位居世界第一。根据国家统计局的最新数字,一到二月份,我国的生产值与去年同期相比上升了2.1&…

实现声明式锁,支持分布式锁自定义锁、SpEL和结合事务

目录 2.实现 2.1 定义注解2.2 定义锁接口2.3 锁的实现 2.3.1 什么是SPI2.3.2 通过SPI实现锁的多个实现类2.3.3 通过SPI自定义实现锁3.定义切面 3.1 切面实现3.2 SpEL表达式获取动态key3.3 锁与事务的结合4.测试 4.1 ReentrantLock测试4.2 RedissonClient测试4.3 自定义锁测试5…

移动硬盘如何分区?教您快速解决!

案例:怎么对移动硬盘进行分区? 【我平常找一个文件需要耗费很长时间,十分麻烦。我现在想通过对移动硬盘进行分区的方式,整理好我的文件,方便使用时查找。有没有人知道移动硬盘怎么分区?教教我!…

深入浅出JS定时器:从setTimeout到setInterval

前言 当谈到 JavaScript 编程语言最基本的概念时,定时器就是一个必须掌握的知识点。在编写网站时,你经常会遇到需要在一定时间间隔内执行一些代码的情况。这时候,JavaScript 定时器就可以派上用场了。 什么是定时器? JS 定时器是…

[Gitops--2]Argocd和Gitlab-runner安装配置

ArgoCd Argo是一组k8s原生工具集,用于运行和管理k8s上的作业和应用程序.Argo提供了一种在k8s上创建工作和应用的三种计算模式:服务模式,工作流模式和基于事件模式.所有的Argo工具都实现为了创建控制器和自定义资源. 为什么选ArgoCD 应用程序的定义,配置和环境都应该是声明性…

ChatGPT和GPT-4帮你写人物传记

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

研读Rust圣经解析——Rust learn-11(测试,迭代器,闭包)

研读Rust圣经解析——Rust learn-11(测试,迭代器,闭包) 测试编写测试模块声明test模块编写测试方法执行测试测试结果检查 闭包定义一个闭包完整写法闭包可以捕获环境闭包类比函数闭包类型推断闭包获取所有权将被捕获的值移出闭包和…

Jenkins配置邮件通知

1、下载Email Extension插件 2、配置发件人邮箱地址 系统管理 > 系统配置 3、配置邮件通知 系统管理 > 系统配置 > 邮件通知 往下滑找到 通过发送测试邮件测试配置 测试 如果以上配置没有问题,会发送一封测试邮件到服务器中,如果有问题请优先检查一下端口号和是…

网络协议-HTTP协议详情讲解

目录 HTTP协议内容和方法 HTTP请求常见请求头 HTTP常见返回头 HTTP协议基本方法 常见HTTP状态码 面试解惑:301 vs 308 面试解惑:302 / 303 / 307 常见HTTP头 User-Agent Content-Type Origin Accept Referer Connection HTTP协议内容和方法…

Nginx中location规则 与 URL重写(rewrite)详解

1.Nginx中location与rewrite 1.1 location与rewrite常用的正则表达式 符号作用^匹配输入字符串的起始位置$ 匹配输入字符串的结束位置*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” 匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll”…

微信为什么使用 SQLite 保存聊天记录

SQLite “只是”一个库,它不是传统意义上的服务器。因此,在某些场合下,它确实不合适。但是,在相当多的其他场合,它却是最合适的选择。SQLite 号称是部署和使用最广泛的数据库引擎。我认为这很有可能,因为 S…

《PyTorch 深度学习实践》第10讲 卷积神经网络(基础篇)

文章目录1 卷积层1.1 torch.nn.Conv2d相关参数1.2 填充:padding1.3 步长:stride2 最大池化层3 手写数字识别该专栏内容为对该视频的学习记录:【《PyTorch深度学习实践》完结合集】 专栏的全部代码、数据集和课件全放在个人GitHub了&#xff…

SpringCloud之OpenFeign介绍案例+相关面试题

概述 OpenFeign是一个声明式的WEB服务客户端,它使WEB服务客户端变得更加容易。具有可插拔的注解支持,SpringCloud中添加了SpringMVC注解的支持。SpringCloud中集成了Ribbon和Eureka,以及SpringCloud LoadBalance,以便在使用Feign时…

C++数据结构:树

树 树是一种数据结构,它是n(n>0)个节点的有限集。n0时称为空树。n>0时,有限集的元素构成一个具有层次感的数据结构。 根 有且仅有一个结点的非空树,那个结点就是根。 A就是上面树的根节点 子树 在一棵非空树中,除根外&a…

由浅入深,一文彻底搞懂Mybatis+面试题分享

mybatis常见面试题链接:2023年-Mybatis常见面试题_是Smoky呢的博客-CSDN博客 MVC架构模式和三层架构 在说Mybatis之前,需要知道MVC架构模式和三层架构的这种思想 MVC架构模式 M:Model,数据层。都是和数据相关,比如实体…

MongoDB实现---事务机制

事务机制 原子性是MongoDB实现事务的难点,隔离性和持久性则是MongoDB事务机制的亮点 ACID支持:由于前面说过MongoDB是基于大数据、提供高度可扩展和高可用;所以其事务机制不仅仅是一般ACID还是结合了BASE理论下的ACID 原子性:保…

键盘录入及标识符

键盘录入 键盘录入介绍: ●为什么要有键盘录入? 目的:为了让我们操作的数据,变得更加灵活 举例:int a10; 这里a虽然是个变量,但记录的值,却是手动写死的。 提问:能不能让a变量记录的值,灵活…

Elasticsearch-mapping

1.Mapping基本概念 Mapping 也称之为映射,定义了 ES 的索引结构、字段类型、分词器等属性,是索引必不可少的组成部分。 ES 中的 mapping 有点类似与RDB中“表结构”的概念,在 MySQL 中,表结构里包含了字段名称,字段的…

# IMAGE - Image Perimeters

# IMAGE - Image Perimeters ## 题面翻译 ### 描述 给出一张由"x"和"."组成的矩阵。每个"x"可以向上下左右及两个斜对角进行连通,请问由某个点开始的"x",它所连通的图形的周长为多少。 ### 输入 整个测试有多…