STM32寄存器

2023-11-14

问题

什么是寄存器?
什么是存储器映射?
什么是寄存器映射?


STM32架构

  程序存放在FLASH中。const的常量存放在FLASH中,变量(全局、静态变量)存放在SRAM中。
  System总线主要读取寄存器。

  AHB(高速)总线上挂着SDIO、复位和始终控制RCC,通过桥接又分出APB1(低速总线)和APB2(高速总线),两条总线分别挂着一些外设
在这里插入图片描述
  FSMC用于驱动液晶屏
  学习重点是AHB1、2上的外设


存储器映射

  存储器本身不具有地址信息,给存储器分配地址的过程就成为存储器映射,再分配一个地址叫重映射。

寄存器映射

  给有特定功能的内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。在这里插入图片描述

总线基地址(AHB、APB1、APB2)

  基地址由首地址 + 相对外设基地址的偏移 = 其他寄存器的绝对地址

在这里插入图片描述

GPIOX基地址

在这里插入图片描述

GPIOB端口的寄存器列表

在这里插入图片描述


C语言对寄存器的封装(以GPIO外设为例)

在这里插入图片描述

/* 使用结构体封装寄存器列表 */
typedef unsigned			int uint32_t;	// 无符号32位变量
typedef unsigned short		int uint16_t;	/* 无符号16位变量
											   short = short int 
											   = signed short int = 2Byte */

// GPIO 寄存器列表
typedef struct {
	uint32_t CRL;		// GPIO端口配置低寄存器		地址偏移:0x00
	uint32_t ORH;		// GPIO端口配置高寄存器		地址偏移:0x04
	uint32_t IDR;		// GPIO数据输入寄存器		地址偏移:0x08
	uint32_t ODR;		// GPIO数据输出寄存器		地址偏移:0x0C
	uint32_t BSRR;		// GPIO位设置/清楚寄存器		地址偏移:0x10
	uint32_t BRR;		// GPIO端口位清楚寄存器		地址偏移:0x14
	uint32_t LCKR;		// GPIO端口配置锁定寄存器	地址偏移:0x18
} GPIO_TypeDef;

/* --------------------------------------------------------------------*/
// 使用 GPIO_TypeDef 把地址强制转换成指针
#define GPIOA		((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB		((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOC		((GPIO_TypeDef *) GPIOA_BASE)
......(A-H)

// 使用定义好的宏直接访问
// 访问GPIOA端口的寄存器
GPIOA->BSRR = 0xFFFF;
GPIOA->CRL = 0xFFFF;
GPIOA->ODR = 0xFFFF;

uint32_t temp;
temp = GPIOA->IDR;		// 读取 GPIO_IDR 寄存器的值到变量temp中
	

GPIO简介

基本框图
基本框图
  该图从最右端看起,最右端就是代表 STM32 芯片引出的 GPIO 引脚,其余部件都位于芯片内部。
  框图详解可看《零死角玩转STM32——F103指南者》——第八章的GPIO简介

框图刨析——GPIO的八种工作模式

代码 8-1 GPIO 8 种工作模式

typedef enum
{
	GPIO_Mode_AIN = 0x0, 		// 模拟输入
	GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入
	GPIO_Mode_IPD = 0x28, 		// 下拉输入
	GPIO_Mode_IPU = 0x48, 		// 上拉输入
	GPIO_Mode_Out_OD = 0x14,	// 开漏输出
	GPIO_Mode_Out_PP = 0x10, 	// 推挽输出
	GPIO_Mode_AF_OD = 0x1C, 	// 复用开漏输出
	GPIO_Mode_AF_PP = 0x18 		// 复用推挽输出
} GPIOMode_TypeDef;

输出模式——4种

  • 推挽/开漏
    在输出模式中,推挽模式时双 MOS 管以轮流方式工作,输出数据寄存器 GPIOx_ODR可控制 I/O 输出高低电平。开漏模式时,只有 N-MOS 管工作,输出数据寄存器可控制 I/O输出高阻态或低电平。输出速度可配置,有 2MHz\10MHz\50MHz 的选项。输出速度指 I/O 支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。
    在输出模式时,施密特触发器是打开的,即输入、输出可用,通过输入数据寄存器 GPIOx_IDR可读取 I/O 的实际状态。

  • 复用功能(推挽/开漏)
    复用功能模式中,输出使能,输出速度可配置,可工作在开漏或推挽模式,但是输出信号源于其它外设,输出数据寄存器 GPIOx_ODR 无效,输入可用。通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。通过对 GPIO 寄存器写入不同的参数,就可以改变 GPIO 的工作模式。
    要了解具体寄存器时一定要查阅《STM32F10X-中文参考手册》 中对应外设的寄存器说明。在 GPIO 外设中,控制端口高低控制寄存器 CRH 和 CRL 可以配置每个 GPIO 的工作模式和工作的速度,每 4 个位控制一个 IO,CRH 控制端口的高八位,CRL 控制端口的低 8 位。

1. 推挽输出(Push-Pull,PP)

在这里插入图片描述

  • 可以输出高低电平,用于连接数字器件。高电平由VDD(3.3V)决定,低电平由VSS(0V)决定。
  • 推挽结构指两个三极管受两路互补的信号控制,总是在一个导通的时候另外一个截止。优点:开关效率高、电流大、驱动能力强。
  • 输出高电平时,电流输出到负载,叫灌电流,可以理解成推。输出低电平时,负载电流流向芯片,叫拉电流,即挽。

2. 开漏输出(Open-Drain,OD)

在这里插入图片描述
  推挽输出是直接链接VDD(3.3V)和Vss(0V)进行输出,开漏输出则不同,它只连接了我们的Vss(0V),如果模式为开漏输出的话,正常情况他只能输出低电平,无法输出高电平。

  • 正常情况只输出低电平。
  • 如果要输出高电平,则需要外接上拉电阻。(该模式的好处是,高电平将会是Vcc的电压,是我们可以控制的电压,从而实现了电平转换的效果)
  • 开漏输出具有“线与”功能,一个为低,全部为低,多用于I2C和SMBUS总线。

3. 复用推挽/开漏输出(Alternate Function,AF)

  这两个放在一起,GPIO引脚除了作为输入/输出引脚使用外,还可以作为片上外设(USART、I2C、SPI等)专用引脚,即一个引脚可以有多种用途,但同一时刻一个引脚只能使用复用功能中的一个。当引脚设置为复用功能时,可选择复用推挽输出模式或复用开漏输出模式,在设置为复用开漏输出模式时,需要外接上拉电阻。

输入模式——4种(模拟/浮空/上拉/下拉)

  在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器 GPIOx_IDR读取 I/O 状态。其中输入模式,可设置为上拉、下拉、浮空和模拟输入四种。上拉和下拉输入很好理解,默认的电平由上拉或者下拉决定。浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候用的是这个模式。模拟输入则用于 ADC 采集。

1. 上拉输入

在这里插入图片描述
  外部没有信号传入时,默认为高电平,该模式的典型应用就是外接按键,当没有按键按下时,引脚为确定的高电平,当按键按下时,引脚电平被拉为低电平。

2. 下拉输入

在这里插入图片描述
  外部没有信号传入时,默认为低电平。

3. 浮空输入

  此时I/O引脚浮空,读取的电平是不确定的,外部信号是什么电平,引脚就输入什么电平,芯片复位上电后,默认为浮空输入模式。

4. 模拟输入

  引脚信号直接链接模拟输入,实现对外部信号的采集,可以收集0~Vss的电压值。

GPIO输出初始化顺序

  1. 选定具体的GPIO
  2. 配置GPIO工作模式(CRL和CRH寄存器)
  3. 控制GPIO输出高低电平(ODR、BRR和BSRR)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32寄存器 的相关文章

随机推荐

  • Entity Framework Core系列教程-22-跟踪实体图(TrackGraph)

    Entity Framework Core中的ChangeTracker TrackGraph 在上一章中 您了解了不同的方法为Entity Framework Core 2中的实体图的每个实体设置不同的EntityState 在这里 您将
  • 字节序转换函数

    由于主机的千差万别 主机的字节序不能做到统一 但是对于网络上传输的变量 它们的值必须有一个统一的表示方法 网络字节序是指多字节变量在网络传输时的表示方法 网络字节序采用大端字节序的表示方法 所以小端字节序的系统通过网络传输变量的时候需要进行
  • vuex刷新后数据不会保存??解决办法在此

    我们在写vue项目的时候 经常要用到vuex作为内存来储存 但是我们存放在vuex中的数据 用户数据 当前页面的数据等等 在刷新后就会丢失 那么如何解决呢 超级简单 1 安装vuex persistedstate npm install s
  • STM32串口USART1中断接收和中断发送

    先贴出中断函数 plain view plain copy void USART1 IRQHandler void IF USART GetiTStatus USART1 USART IT RXNE RESET USART ClearITP
  • vue 实现分享功能

    今天给大家分享一个vue的分享插件vshare 实现如下 1 开发环境 vue element 2 电脑系统 windows10专业版 3 组件安装 通过命令在控制台输入 npm install vshare save 4 组件导入 在ma
  • 【刷题】蓝桥杯

    蓝桥杯2023年第十四届省赛真题 平方差 C语言网 dotcpp com 初步想法 x y2 z2 y z y z 即x a b a y z b y z 2y a b 即a b是2的倍数就好了 即x存在两个因数之和为偶数就能满足条件 但时间
  • 抠矩形图程序

    根据抠图位置的起始点坐标和长宽进行矩形抠图 示例代码 原图大小为640 480 每个像素占16bit 起始点坐标 234 124 抠图长宽分别为238 282 include
  • mysql java测试_JAVA 访问MySQL数据库(使用方法及测试)

    说明 本文使用的JDBC框架是基于Java SE 1 8 MySQL Eclipse 工具下载 MySQL V5 5 x64 64位 MySQL V5 5 x86 32位 要根据你电脑的情况选择相应的MySQL版本 我的电脑是64位 所以本
  • 【牛客SQL】SQL17 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

    题目描述 描述 有一个薪水表salaries简况如下 请你获取薪水第二多的员工的emp no以及其对应的薪水salary 示例1 输入 drop table if exists salaries CREATE TABLE salaries
  • Matlab批量拟合曲线并绘制在一张图上

    文章目录 简单的拟合 批量拟合并呈现在一张图上 最终结果与完整代码 简单的拟合 在命令行输入 cftool 可以启动工具箱 1 在 选择数据 中导入数据 2 选择拟合方法 matlab提供的方法或者你自己定义的函数 matlab提供的方法
  • 数据结构——非线性结构(树与二叉树)

    文章目录 一 非线性结构的概述 二 树的基本概念 1 树的定义 2 专业术语 3 树的性质 三 树的分类 1 一般树 2 二叉树 是有序树 2 1 概念 2 2 分类 1 一般二叉树 2 满二叉树 3 完全二叉树 2 3 二叉树的性质 2
  • 【西南交大电子实习】用ESP32和HX711实现的称重计/电子秤的Arduino代码

    参考 https randomnerdtutorials com esp32 load cell hx711 7月12日 Update 修改为克g 盎司oz 克拉ct之间的切换 增加计数功能版本代码 需要安装的arduino库 Adafru
  • JS变量的使用【弹出输入框,提示用户名输入姓名;弹出一个对话框,输出用户刚才输入的姓名】

    一 代码 二 结果显示 1 输入名字 2 输出名字 三 补充变量 1 变量只声明不赋值 输出结果是undefined 2 变量不声明不赋值 直接使用某个变量会报错 3 不声明直接赋值使用 也可使用 4 尽量不要用name作为变量名
  • 我玩了玩chatGPT,她确实NB!

    大家好 我是北妈 0 如果这几天你不知道一个叫chatGPT的东西 那说明你网感真不太好了 或者说你过的很幸福 完全不需要关注网络世界的新动向 因为毫不夸张地说 北妈个人未来可以预见的是 普通互联网从业人士已经赶不上时代趋势 以后如果地球没
  • Spring Source Tools安装Virgo插件

    1 STS 3 7 4 安装Virgo插件失败 需要先安装 先下载一个STS IDE 地址 http spring io tools sts all 然而在STS中添加Virgo插件 如果你直接在Install new software中输
  • mysql 1054错误 "Unknown column 'xxx' in 'field list'"

    出现问题的代码如下 s 测试 sql INSERT INTO ffff ID VALUES s s try cursor execute sql db commit print 写入成功 except Exception as e prin
  • FPGA基本IP核之FIFO(异步)

    异步FIFO 创建新的异步FIFO IP核 可以看出相比于同步FIFO这里做了写和读两侧并且各自用一个时钟 一般选用二级同步 然后勾选读和写两侧需要用到的三种信号 选择添加额外的MSB 由于分成两侧时 中间不知道数据是否写满了或者写空了 添
  • GE IS215VCMIH2BB IS200VCMIH2BCC 数字量输入模块

    GE IS215VCMIH2BB 和 IS200VCMIH2BCC 是数字量输入模块 通常用于工业自动化和控制系统中 用于接收和处理数字量输入信号 以下是这些模块可能具备的一些常见功能和产品特点 多通道输入 这些模块通常具有多个数字量输入通
  • 【数据读写】csv文件与xls/xlsx文件

    目录 一 csv格式与xls xlsx格式的区别 二 两种文件格式的读写操作 1 csv文件的读 写函数 csvread csvwrite 2 xls xlsx文件的读 写函数 xlsread xlswrite 三 应用案例 1 实例1 参
  • STM32寄存器

    问题 什么是寄存器 什么是存储器映射 什么是寄存器映射 STM32架构 程序存放在FLASH中 const的常量存放在FLASH中 变量 全局 静态变量 存放在SRAM中 System总线主要读取寄存器 AHB 高速 总线上挂着SDIO 复