STM32寄存器的简介、地址查找,与直接操作寄存器

1、STM32寄存器的简介

2、STM32寄存器地址查找

3、直接操作STM32寄存器

1、STM32寄存器的简介

1. 寄存器映射
在存储器 Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共32bit,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地址,然后通过 C 语言指针的操作方式 (既然一个单元是四个字节那我们就用一次取四个字节的指针(int * )来操作这些功能单元) 来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

2. 什么是寄存器
寄存器:给特定功能的的单元取的别名这个别名就叫做寄存器,所以寄存器只是特定功能的的单元的名字而已

比如,我们找到 GPIOB 端口的输出数据寄存器 ODR 的地址是 0x4001 0C0C(至于这个地址如何找到可以先跳过,后面我们会有详细的讲解),ODR 寄存器(就是4字节的功能单元)是 32bit,低 16bit有效,对应着 16 个外部 IO,写 0/1 对应的的 IO 则输出低/高电平。现在我们通过 C 语言指针的操作方式,让 GPIOB 的 16 个 IO 都输出高电平,具体见。

 

3. 如何给功能单元取个别名(寄存器)

我们利用C语言的#define 定义一个寄存器标识符

 

这样再操作一个功能单元就简单多了,而且更容易理解

接下来就是层层套娃找到GPIOB端口的所有功能单元地址,将他们分不同的功能改个别名变成寄存器,以后直接操作对应的寄存器就OK啦。

4. STM32的外设地址映射
片上外设区分为三条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。其中 APB1 总线的地址最低,片上外设从这里开始,也叫外设基地址。

 列出了所用STM32F10xxx中内置外设的起始地址。

 

 

外设寄存器

在 XX 外设的地址范围内,分布着的就是该外设的寄存器。以 GPIO 外设为例, - GPIO(general purpose input output)是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚 ,基本功能是控制引脚输出高电平或者低电平。最简单的应用就是把 GPIO 的引脚连接到 LED 灯的阴极,LED 灯的阳极接电源,然后通过 STM32 控制该引脚的电平,从而实现控制 LED 灯的亮灭。

 2、STM32寄存器地址查找

方法1:

直接查询手册中寄存器映像(map),USART1的DR地址为0x40013804


方法2:

手册中查看,DR寄存器的偏移地址为0X04,那么USART1的DR地址可以写成(USART1_BASE + 0X04)。

其中USART1_BASE在stm32l151xb.h中有定义

#define USART1_BASE           (APB2PERIPH_BASE + 0x00003800U)


方法3:

如果我们要修改DR的值为0X03,我们会写成:USART1->DR = 0X03,那么DR的地址就是(uint32_t)(&USART1->DR)
3、直接操作STM32寄存器

GPIO寄存器一览

GPIOx->CRL(x=A…E)
GPIOx->CRH(x=A…E)
GPIOx->IDR(x=A…E)
GPIOx->ODR(x=A…E)
GPIOx_BSRR(x=A…E)
GPIOx_BRR(x=A…E)

 

这个寄存器主要是设置GPIO的低8位(0~7)端口的配置
MODE 用来设置端口输出的速度 (在输入模式下不需要配置,仅在输出模式下需要配置)CNF 用来设置输入模式或者输出模式
例如
设置PA0为推挽输出速度为50MHz

7-6-5-4-3-2-1-0

 设置PA0为上下拉输入(默认下拉)
7-6-5-4-3-2-1-0

 设置PB5为模拟输入
7-6-5-4-3-2-1-0

GPIOx->IDR(x=A…E)

设置PA10为推挽输出
15-14-13-12-11-10-9-8 

设置PA10为上下拉输入(默认下拉)

设置PA10为推挽输出
15-14-13-12-11-10-9-8

设置PB15为模拟输入
15-14-13-12-11-10-9-8

 

 

 

 

这个寄存器是用来读取当前端口的电平状态,低16位(0~15)每一位对应每一个端口

例如
读取PA0的数值

读取PB5的数值

 

 读取PB15的数值

 

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32中,寄存器操作是通过直接访问寄存器来对硬件进行配置和控制的一种方式。这种操作方式可以使用寄存器地址和指针来实现。STM32系列芯片提供了一个头文件stm32f10x.h,其中包含了寄存器地址的映射关系。通过引用这个头文件,我们可以使用寄存器的具体名称而不是地址来进行操作。 要找到所需的寄存器,我们可以使用C语言中的指针和取地址操作符(&)。类似于使用scanf语句从控制台输入一个变量时需要使用&符号来获取变量的地址一样,不同的寄存器有不同的地址。因此,要找到对应的寄存器,我们只需找到对应的地址即可[2]。 在学习STM32的过程中,大部分人最初可能会使用标准库版本,对于寄存器操作可能不太熟悉。寄存器是CPU内部用来存放数据的小型存储区域,用于临时存放参与运算的数据和运算结果。 综上所述,STM32寄存器操作是通过直接访问寄存器来配置和控制硬件,可以使用寄存器地址和指针来实现。为方便使用,STM32提供了一个头文件stm32f10x.h,其中包含了寄存器地址的映射关系。使用指针和取地址操作符(&),我们可以找到所需寄存器地址寄存器是CPU内部用于存放数据的小型存储区域,用于临时存放参与运算的数据和运算结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32寄存器简介地址查找,与直接操作寄存器](https://blog.csdn.net/geek_monkey/article/details/86291377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [关于STM32寄存器操作学习](https://blog.csdn.net/lemou1211/article/details/129170414)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值