STM32 对外设基地址,总线外设基地址和寄存器基地址的理解

发布者:独行侠客最新更新时间:2021-11-24 来源: eefocus关键字:STM32 手机看文章 扫描二维码
随时随地手机看文章

前言

本博文基于STM32F103ZET6和MDK以及V3.5.0库函数;

本博文从Cortex-M3内核的寻址空间映射一直聊到库函数是怎样配置具体的某一个寄存器

如有不足之处,多多指教;

Cortex-M3存储器映射

由于STM32系列芯片为32位处理器,所谓32位处理器,也即是地址总线有32根,可寻址空间为2^32=4GB;如下图

在这里插入图片描述

从图片上可以看出,ARM公司已经为芯片生产厂商们划分好了存储映射空间;并且,0x40000000~0x5FFFFFFF这段地址,映射片上外设的寄存器地址;STM32F10x.h这个头文件正是吧STM32的所有寄存器进行地址映射,此文件通过宏定义的方式,将各个寄存器的地址转换为相应的符号名称,如下图;图片中第一个方框为外设基地址,第二个方框是总线外设基地址,第三个方框是寄存器组基地址;

在这里插入图片描述

外设基地址: PERIPH_BASE ,且值为0x40000000,可以看出是整个外部设备地址的开始,所以叫外设基地址;


#define PERIPH_BASE           ((uint32_t)0x40000000)


总线外设基地址:


#define APB1PERIPH_BASE       PERIPH_BASE

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)

#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)  //不同芯片AHB总线外设基地址可能不同;


显然,APB1的总线起始地址与外设基地址相同;APB1,APB2和AHB总线上分别挂在这很多外设;


寄存器组基地址: (每一个外设有一个寄存器组,下面以挂在在APB2上的GPIOA寄存器组举例)


#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)


寄存器偏移地址:(以GPIOA_CRH为例)

在这里插入图片描述

图片中的偏移地址为此寄存器相对于此外设寄存器组基地址的相对偏移地址; 即此地址为:

GPIOA_BASE + 0x04

= APB2PERIPH_BASE + 0x0800 + 0x04

= PERIPH_BASE + 0x10000 + 0x0800 + 0x04

= 0x40000000 + 0x10000 + 0x0800 + 0x04

= 0x40010804;

即0x40010804就是GPIOA_CRH的寄存器地址,在对此寄存器进行配置的时候,就是对此地址进行操作;

关键字:STM32 引用地址:STM32 对外设基地址,总线外设基地址和寄存器基地址的理解

上一篇:用的Jlink但是却提示找不到Ulink的解决办法
下一篇:STM32 BOOT0和BOOT1对于下载程序的应用

推荐阅读最新更新时间:2024-10-24 10:57

STM32外设地址总线外设地址寄存器地址的理解
前言 本博文基于STM32F103ZET6和MDK以及V3.5.0库函数; 本博文从Cortex-M3内核的寻址空间映射一直聊到库函数是怎样配置具体的某一个寄存器; 如有不足之处,多多指教; Cortex-M3存储器映射 由于STM32系列芯片为32位处理器,所谓32位处理器,也即是地址总线有32根,可寻址空间为2^32=4GB;如下图 从图片上可以看出,ARM公司已经为芯片生产厂商们划分好了存储映射空间;并且,0x40000000~0x5FFFFFFF这段地址,映射片上外设的寄存器地址;STM32F10x.h这个头文件正是吧STM32的所有寄存器进行地址映射,此文件通过宏定义的方式,将各个寄存器的地址转换为相应的符号名称,如
[单片机]
<font color='red'>STM32</font> 对<font color='red'>外设</font>基<font color='red'>地址</font>,<font color='red'>总线</font><font color='red'>外设</font>基<font color='red'>地址</font>和<font color='red'>寄存器</font>基<font color='red'>地址</font>的理解
STM32外设寄存器地址定义
一直都是用STM32做项目中的主控芯片,在编程的时候,之前一直忽视了一个问题,那就是寄存器的位置是如何定义的,为什么用一个USART1- CR操作就能够给这个CR寄存器赋值?其实这是一个比较底层的问题,不懂这方面的知识也并不影响使用STM32,因为底层的定义工作,厂家一般都会做好,但是多了解一点原理性的东西,对自己还是很有帮助的。 这里我就以STM32F407的USART寄存器为例,介绍一下ST厂家是如何做寄存器定义的。 首先在stm32f4xx.h中 typedef struct { __IO uint16_t SR; /*! USART Status register, Address
[单片机]
通过SerDes远端I2C接口访问16位I2C外设寄存器地址
  引言   Maxim吉比特多媒体串行链路(GMSL)串行器/解串器(SerDes)系列包括MAX9249、MAX9259、MAX9260、MAX9263和MAX9264,具有UART/I2C转换器,用于远端控制I2C接口外设。这些外设包括相机传感器、I/O端口扩展器、音频模/数转换器(ADC)和数/模转换器(DAC),以及LED照明。   在GMSL数据资料和相关技术文件中,通过UART端口直接连接至电子控制单元(ECU)的一端被称为"本地端",另一端被称为"远端".   I2C外设接口是控制通道基本模式中的默认设置。GMSL系列SerDes只转换器件地址不同于GMSL串行器或解串器地址的UART数据包。UART/
[嵌入式]
通过SerDes远端I2C接口访问16位I2C外设寄存器地址
摘要:本应用笔记介绍如何通过吉比特多媒体串行链路(GMSL) SerDes的远端I2C接口访问16位寄存器地址。 引言 Maxim吉比特多媒体串行链路(GMSL)串行器/解串器(SerDes)系列包括MAX9249、MAX9259、MAX9260、MAX9263和MAX9264,具有UART/I2C转换器,用于远端控制I2C接口外设。这些外设包括相机传感器、I/O端口扩展器、音频模/数转换器(ADC)和数/模转换器(DAC),以及LED照明。 在GMSL数据资料和相关技术文件中,通过UART端口直接连接至电子控制单元(ECU)的一端被称为“本地端”,另一端被称为“远端”。 I2C外设接口是控制通道基本模式中的默认设置。GM
[模拟电子]
通过SerDes远端I2C接口访问16位I2C<font color='red'>外设</font><font color='red'>寄存器</font><font color='red'>地址</font>
s3c2440裸机-内存控制器2-不同位宽外设与CPU地址总线的连接
不同位宽设备的连接 我们先看一下2440芯片手册上外设rom是如何与CPU地址总线连接的。 8bit rom与CPU地址线的连接 8bit*2 rom与CPU地址线的连接 8bit*4 rom与CPU地址线的连接 16bit rom与CPU地址线的连接 16bit*2 rom与CPU地址线的连接 从上面的图中,我们知道可以对2片位宽为8bit的外设扩展级联成1个16bit的外设,同理可用4片位宽为8bit的外设进行级联成1个32bit的外设... 从上面的图中,我们还看见一个规律: 当外设总线位宽为8bit时, 外设A0接CPU的地址总线ADDR , A - ADDR ...A - AD
[单片机]
s3c2440裸机-内存控制器(二、不同位宽外设与CPU地址总线的连接)
不同位宽设备的连接 我们先看一下2440芯片手册上外设rom是如何与CPU地址总线连接的。 8bit rom与CPU地址线的连接 8bit*2 rom与CPU地址线的连接 8bit*4 rom与CPU地址线的连接 16bit rom与CPU地址线的连接 16bit*2 rom与CPU地址线的连接 从上面的图中,我们知道可以对2片位宽为8bit的外设扩展级联成1个16bit的外设,同理可用4片位宽为8bit的外设进行级联成1个32bit的外设... 从上面的图中,我们还看见一个规律: 当外设总线位宽为8bit时, 外设A0接CPU的地址总线ADDR , A - ADDR ...A - ADDR 当外设总线
[单片机]
s3c2440裸机-内存控制器(二、不同位宽<font color='red'>外设</font>与CPU<font color='red'>地址</font><font color='red'>总线</font>的连接)
STM32入门系列-STM32外设地址映射
片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。APB1总线的地址最低,因此片上外设就从这这个地址开始,也称外设基地址。 总线基地址 从存储器映射那张图的Block2可以看到,分为4大块,每块都有一个起始地址,这个起始地址就是基地址,然后到下一块起始地址的时候就会和前一块地址出现偏差,这个差值就是偏移量,即相对基地址的偏移量。如下图所示。 从上图可以看到APB1总线基地址是0x4000 0000,相对外设基地址的偏移量是0,所以此总线也是外设Block2的基
[单片机]
<font color='red'>STM32</font>入门系列-<font color='red'>STM32</font><font color='red'>外设</font><font color='red'>地址</font>映射
STM32 DMA外设地址的计算问题
STM32 DMA外设地址的计算其实很简单 其实就是外设寄存器的起始地址+外设数据寄存器的地址偏移。 外设寄存器的起始地址:可以从数据手册上存储器映像查得(见2.3) 外设数据寄存器的地址偏移:就是外设数据寄存器的偏移地址(见各外设的数据寄存器)。 例如: ADC1 起始地址为0X4001 2400 ADC_DR 偏移地址0X4C。 则可得到DMA外设地址 0X4001 244C。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved