4.寄存器和存储器的操作

技术世界低调点儿 技术世界低调点儿     2022-12-11     212

关键词:

如何访问STM32 寄存器内容

我们知道寄存器就是一些有特定功能的内存单元,所以要访问STM32 寄存器也就是操作STM32 的内存单元,根据C 语言指针的特点,可以使用指针来操作STM32 的内存单元。
首先介绍两个概念:
片内、外设,片内指做成芯片的集成电路内部,简称片内(也称片上),片外同理显而易见;外设是外部设备的简称,是指集成电路芯片外部的设备。集成电路芯片与外部设备的连接一般需要专门的接口电路和总线的连接(包括控制总线路、地址总线和数据总线等)。由于大规模集成电路的技术发展得很快,现在许多芯片在制造时已经能够将部分接口电路和总线集成到芯片内部。对于这部分电路与传统的接口电路和总线是有区别的,为了加于区别可以称之为片内外设,其含义是在集成电路芯片内部集成的用于与外部设备连接的独立于内核的控制器、接口电路和总线等。
早起由于IC集成工艺不发达,很多东西都是外设的,比如PWM、ADC、CAN等DSP芯片,原本都是需要芯片外接的,即使是现在,仍然有独立的ADC芯片,比如ADS8364等等。但是现在,PWM、ADC等等东西大多都已经集成在DSP芯片内,当然,无论如何,芯片总还是会需要外接一些设备实现某种系统,为了与那些外设相区别,就将集成在芯片内,但是又不属于芯片本身的称为“片上外设”。

STM32 外设地址映射

片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设, APB1 挂载低速外设,APB2 和AHB 挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。APB1 总线的地址最低,因此片上外设就从这这个地址开始,也称外设基地址。
(1)总线基地址
从存储器映射那张图的 Block2 可以看到,分为 4 大块,每块都有一个起始地址,这个起始地址就是基地址,然后到下一块起始地址的时候就会和前一块地址出现偏差,这个差值就是偏移量,即相对基地址的偏移量。

(2)外设基地址
每条总线上都会挂接着很多的外设,这些外设也会有自己的地址范围,XXX 外设的首个地址即最低地址就是 XXX 外设的基地址,也称作 XXX 边界地址。这里我们就以 GPIO 外设来讲解外设基地址。

外设 GPIOx 都是挂接在 APB2 总线上,属于高速的外设,而 APB2 总线的基地址是0x4001 0000,故 GPIOA 的相对 APB2 总线的地址偏移是 800。

( 3 )外设寄存器地址
XXX 外设的寄存器就分布在其对应的外设地址范围内。这里我们以 GPIO 外设为例,GPIO 是通用输入输出端口的简称,可以通过软件来控制其输入和输出。GPIO 有很多个寄存器,每一个都有特定的功能。每个寄存器为 32bit,占四个字节,这些寄存器都是按顺序依次排列在外设的基地址上。寄存器的位置都以相对该外设基地址的偏移地址来描述。

我们以 GPIOC_BSRR 寄存器来说明

**A.**红色框 4 表示的我们所查找寄存器的名称,寄存器 GPIOx_BSRR 内的 x 表示的是STM32GPIO 端口,范围是 A-E,也就是说在 GPIOA、GPIOB 等端口中都有这个寄存器。

**B.**红色框 5 表示的是相对 GPIOx 地址的偏移值,比如现在我们使用的是GPIOC 外设,其基地址是 0x4001 1000,那么本寄存器 GPIOx_BSRR 地址 = 0x40011000+0x10=0x40011010。对于其他的 GPIO 外设也是一个原理。

**C.**红色框 6 和 7 表示的是寄存器的位表。其中 6 表示寄存器编号,因为一个寄存器是 32bit,所以范围是 0-31。7 表示的是相应位的权限,w:只写,r:只读,rw:可读可写。本寄存器位权限是 w,所以只能写,如果试图读本寄存器,是无法保证读取到它真正内容的。而有的寄存器位权限为只读,一般是用于表示STM32 外设的某种工作状态的,由 STM32 硬件自动更改,通过读取那些寄存器位来判断外设的工作状态。

**D.**红色框 8 是寄存器位功能说明。这个也是寄存器说明中最重要的部分,它详细介绍了寄存器每一个位的功能。例如本寄存器中有两种寄存器位,分别为BRy 及 BSy,其中的 y 数值表示的是管脚号,可以是 0-15。如 BR0、BS0 用于控制 GPIOx 的第 0 个引脚,若 x 表示 GPIOC,那就是控制 GPIOC 的第 0 引脚,而 BR1、BS1 就是控制 GPIOC 第 1 个引脚。其中 BRy 引脚的说明是“ 0:不会对相应的 ODRx 位执行任何操作; 1:对相应 ODRx 位进行复位”。这里的“复位”是将该位设置为 0 的意思,而“置位”表示将该位设置为 1;说明中的 ODRx 是另一个寄存器的寄存器位,我们只需要知道 ODRx 位为 1 的时候,对应的引脚 x 输出高电平,为 0 的时候对应的引脚输出低电平即可(感兴趣可以查询该寄存器 GPIOx_ODR 的说明了解)。所以,如果对 BR0 写入“ 1”的话,那么 GPIOx 的第 0 个引脚就会输出“低电平”,但是对 BR0 写入“ 0”的话,却不会影响 ODR0 位,所以引脚电平不会改变。要想该引脚输出“高电平”,就需要对“ BS0”位写入“ 1”,寄存器位 BSy 与 BRy 是相反的操作。

汇编语言寄存器都叫啥?

1、寄存器32位寄存器有16个,分别是:4个数据寄存器(EAX、EBX、ECX、EDX)。2个变址和指针寄存器(ESI和EDI);2个指针寄存器(ESP和EBP)。6个段寄存器(ES、CS、SS、DS、FS、GS)。1个指令指针寄存器(EIP);1个标志寄存器(EFlags... 查看详情

汇编各寄存器的作用说明

4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI)2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP)1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息... 查看详情

简述8086/8088各种寻址方式中,段寄存器和便宜地址的组合方式

...存放的地点有三处:存放在指令的地址码字段中;存放在寄存器中;存放在存储器的数据段、堆栈段或附加数据段中。与其对应的三种操作数是:立即操作数、寄存器操作数和存储器操作数。寻找这些操作数有三种基本寻址方式... 查看详情

汇编push,pop指令

...压栈指令):格式:PUSH操作数//subesp,4;mov[esp],EBP操作数可以是寄存器,存储器,或者立即数二、POP出栈指令(弹栈指令)格式:POP操作数//movEBP,[esp];addesp,4操作数是寄存器,或者存储器,不能是立即数三、代码分析1、测试PUSH和POP与ESP... 查看详情

汇编语言从入门到精通-通用寄存器功能的说明

1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位... 查看详情

8086寻址方式(代码片段)

...即寻址  所谓立即,就是取数不需要再去访问存储器和寄存器,而直接在指令中给出(此时指令已经从存储器中加载到了指令队列缓冲器)。大多是常量被赋值给寄存器的情况,目的操作数一般不会出现立即寻址:MOVAX,12A2H;//... 查看详情

8086指令系统中的寻址方式

...据段中,偏移地址是3100H单元和3101H单元的内容复制一份到寄存器AX中。"[]"内用16位上述表示存放数据的偏移地址,数据的段基地址默认为数据段段重设段寄存器:[偏移地址]MOVAX,ES:[1200H]该指令中,表示将内存里附加段中,偏移地... 查看详情

计算机组成与设计---硬件/软件接口---处理器(代码片段)

...作输出是输入的函数状态(时序)部件存储信息寄存器:将数据存储在电路里时钟信号决定数据更新时刻边沿触发:当Clk从0变为1时更新数据带有写信号控制的寄存器仅在时钟边沿且写控制信号为1时更新数据在存... 查看详情

计算机操作系统-第四章:存储器管理

存储层次至少三级:CPU寄存器,主存,辅存。寄存器和主存储器又被称为可执行存储器。(可使用一条load或store指令对可执行存储器访问,但辅存需要通过io设备实现)主存储器简称内存或主存,用于保存进程运行时的程序和数... 查看详情

操作系统_硬件环境

...CPU运算器:算术和逻辑运算控制器:取指令,CPU与内存的交互寄存器:暂存数据,地址,指令信息(速度最快)高速缓冲:CPU和内存之间(速度快于内存,低于寄存器)特权指令和非特权指令特权指令:由操作系统使用的指令(管态)非特权指令:由... 查看详情

运行内存ram是啥

...。 (1)存储矩阵。如图所示,RAM的核心部分是一个寄存器矩阵,用来存储信息,称为存储矩阵。 (2)地址译码器。地址译码器的作用是将寄存器地址所对应的二进制数译成有效的行选信号和列选信号,从而选中该存储... 查看详情

通用寄存器都有哪些?

各有什么作用?1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。2、变址寄存器32位CPU有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16... 查看详情

计算机组成与设计---硬件/软件接口---指令:计算机的语言(代码片段)

名字示例注释32个寄存器$s0~$s7,$t0~$t9,$zero,$a0~$a3,$v0~$v1,$gp,$fp,$sp,$ra,$at寄存器用于数据的快速取.在MIPS中,只能对存放在寄存器中的数据执行算术操作,寄存器$zero的值恒为0,寄存器$at被汇编器保留,用于处理大的常... 查看详情

计算机组成与设计---硬件/软件接口---指令:计算机的语言(代码片段)

名字示例注释32个寄存器$s0~$s7,$t0~$t9,$zero,$a0~$a3,$v0~$v1,$gp,$fp,$sp,$ra,$at寄存器用于数据的快速取.在MIPS中,只能对存放在寄存器中的数据执行算术操作,寄存器$zero的值恒为0,寄存器$at被汇编器保留,用于处理大的常... 查看详情

8086/8088的指令都有哪些寻址方式

...参加操作的数据。1.立即操作数:它在指令中直接给出。2.寄存器操作数:它被放到寄存器中。3.存储器操作数:当然在存储器也就是内存中。4.i/o操作数:它在你给出的i/o端口中。2)转移地址操作数:在指令当中不是参加运算或被处理... 查看详情

操作系统存储器管理

...指令和数据,数据能够从主存储器中读取并将他们装入到寄存器中,或者从寄存器存入到主存储器,CPU与外围设备交 查看详情

cpu中都有哪些寄存器资源,他们的初始值分别是多少

参考技术A寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一。由于寄存器的存取速度比内存快,所以,在用汇编语言编写程序时,要尽可能充分利用寄存器的存储功能。寄存器一般用来保存程序的... 查看详情

x86汇编语言基础

....执行的高效性3.编写程序的复杂性4.调试的复杂性二.通用寄存器1.数据寄存器数据寄存器用来存放计算的结果和操作数,也可以存放地址。每个寄存器又有自己专用的目的:AX:累加器,使用频率最高,用于算数、逻辑运算以及... 查看详情