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

如何访问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 是相反的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值