第3章 存储器与寄存器介绍

devtools/2024/10/21 23:00:23/

第3章 存储器与寄存器介绍

1.什么是存储器映射
2.什么是寄存器及寄存器映射
3.如何访问STM32寄存器内容

1.什么是存储器映射

存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射(具体地址分配参考芯片数据手册及中文参考手册)
在这里插入图片描述

2.什么是寄存器及寄存器映射

通过给有特定功能的内存单元起一个别名,这个别名就是我们所说的寄存器。给已经分配好地址的有特定功能的内存单元起别名的过程就叫寄存器映射。

3.如何访问STM32寄存器内容

我们知道寄存器就是一些有特定功能的内存单元,所以要访问STM32寄存器也就是操作STM32的内存单元,根据C语言指针的特点,可以使用指针来操作STM32的内存单元。
假如我们要让STM32的GPIOF的第9管脚输出低电平,我们怎么使用C语言来处理?
首先我们要知道GPIOF挂接在哪个总线上,需要知道基地址,STM32总线地址如下:

在这里插入图片描述
所以使用C语言宏可以定义外设基地址:

#define PERIPH_BASE((unsigned int)0x40000000)

然后分别定义各总线基地址:

#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE+0x00010000)
#define APB1PERIPH_BASE (PERIPH_BASE+0x00020000)
#define AHB2PERIPH_BASE (PERIPH_BASE+0x10000000)

然后还需要知道端口外设地址,
在这里插入图片描述
同样使用C语言宏定义其端口地址:

#define	GPIOA_BASE (AHB1PERIPH_BASE+0x0000)
#define GPIOB_BASE (AHB1PERIPH_BASE+0x0400)
#define GPIOC_BASE (AHB1PERIPH_BASE+0x0800)
#define GPIOD_BASE (AHB1PERIPH_BASE+0x0C00)
#define GPIOE_BASE (AHB1PERIPH_BASE+0x1000)
#define GPIOF_BASE (AHB1PERIPH_BASE+0x1400)
#define GPIOG_BASE (AHB1PERIPH_BASE+0x1800)
#define GPIOH_BASE (AHB1PERIPH_BASE+0x1C00)

有了外设端口地址后,还需要知道GPIOF端口的寄存地址,如下表格:
在这里插入图片描述
同样使用C语言宏定义其端口寄存器地址:

#define GPIOF_MODER(GPIOF_BASE+0x00)
#define GPIOF_OTYPER(GPIOF_BASE+0x04)
#define GPIOF_OSPEEDR(GPIOF_BASE+0x08)
#define GPIOF_PUPDR(GPIOF_BASE+0x0C)
#define GPIOF_IDR(GPIOF_BASE+0x10)
#define GPIOF_ODR(GPIOF_BASE+0x14)
#define GPIOF_BSRR(GPIOF_BASE+0x18)
#define GPIOF_LCKR(GPIOF_BASE+0x1C)
#define GPIOF_AFRL(GPIOF_BASE+0x20)
#define GPIOF_AFRH(GPIOF_BASE+0x24)

这些寄存器具体的功能可以参考STM32F4中文参考手册。
在这里插入图片描述
控制GPIOF引脚9输出低电平(即通过BSRR寄存器的BR9置1)即:

*(unsigned int *)GPIOF_BSRR=(0x01<<(16+9));

控制GPIOF引脚9输出高电平(即通过BSRR寄存器的BS9置1)

*(unsigned int *)GPIOF_BSRR=0x01<<9;

读取GPIOF端口所有引脚的电平(读IDR寄存器)

unsigned int temp;
temp=*(unsigned int *)GPIOF_IDR;

我们这里仅仅以GPIO这个外设为例,给大家讲解了如何使用C语言对寄存器封装的,对于其他的外设也是使用同样方法。其实到了后面的实验程序的编写时,我们都是使用ST公司提供的固件库,他把STM32所有外设都已经封装好了,我们这里分析这个封装过程只是想让大家更加清楚理解如何使用C来封装寄存器的。


http://www.ppmy.cn/devtools/125557.html

相关文章

【HarmonyOS开发笔记 1】 -- 开发环境的搭建

DevEco Studio 的下载与安装 下载 下载路径&#xff1a; https://developer.huawei.com/consumer/cn/download/ 安装 解压后双击 deveco-studio-5.0.3.814.exe 指定安装目录&#xff0c;或者默认&#xff0c;然后下一步 一直“下一步”&#xff0c; 直到最后安装完成 新…

Java的四种循环语句

背景&#xff1a; Java 中主要有四种循环语句&#xff1a;for 循环、while 循环、do-while 循环 和 foreach 循环&#xff08;也称为增强型 for 循环&#xff09;。下面我将分别介绍这四种循环语句&#xff0c;并给出相应的实例。 for循环&#xff1a; 1. for 循环for 循环是…

【机器人数值优化】数值优化基础(一)从理论到实战全方位指南 | 解锁机器人技术的核心技能

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…

与鸿蒙同行,Java Solon v3.0 正式发布(向下兼容)

与 HarmonyOS NEXT 10月8日公测同行。Solon &#xff08;开放原子开源基金会&#xff0c;孵化项目&#xff09; v3.0 正式发布&#xff0c; 且将在 2025 年启动华为编程语言 “仓颉” 版开发&#xff08;届时会有 Solon-Java 和 Solon-CJ 两大版本&#xff09;。本次大版本更新…

c++基础知识复习(1)

前期知识准备 1 构造函数 &#xff08;1&#xff09;默认构造函数&#xff1a;没有参数传入&#xff0c;也没有在类里面声明 &#xff08;2&#xff09;手动定义默认构造函数&#xff1a;没有参数传入&#xff0c;但是在类里面进行了声明 可以在类外实现或者类内实现 以下案…

环境变量(Linux)

文章目录 一、什么是环境变量&#xff1f;二、环境变量的作用1. 方便命令执行&#xff1a;2.配置系统和应用程序&#xff1a;3.用户自定义环境变量&#xff1a; 三、Linux 常见环境变量四、设置环境变量1.临时设置&#xff1a;2.永久设置&#xff1a; 五、环境变量的优先级六、…

PyTorch gather与scatter_详解

PyTorch gather与scatter_详解 在 PyTorch 常用的算子中&#xff0c;有两个理解巅峰的存在&#xff0c;那就是 torch.gather 与 torch.scatter_&#xff0c;在 Seq2Seq 、Attention、crf viterbi等结构的源码中&#xff0c;都可以看到这两个算子的身影&#xff0c;今天来详细讲…

【回顾原生JDBC手动管理事务以及两种方式实现Spring编程式事务】

文章目录 一.关于事务1.事务概念2.事务四个基本特性3. 事务的生命周期4.事务的隔离级别5.事务的应用场景 二.回顾原生JDBC手动管理事务三.Spring编程式事务1.使用 TransactionTemplate 进行编程式事务管理2.使用 PlatformTransactionManager 进行编程式事务管理 四.编程式事务的…