前言
本博文基于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 对外设基地址,总线外设基地址和寄存器基地址的理解
推荐阅读最新更新时间: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的所有寄存器进行地址映射,此文件通过宏定义的方式,将各个寄存器的地址转换为相应的符号名称,如
[单片机]
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
[模拟电子]
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 当外设总线
[单片机]
STM32入门系列-STM32外设地址映射
片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。APB1总线的地址最低,因此片上外设就从这这个地址开始,也称外设基地址。 总线基地址 从存储器映射那张图的Block2可以看到,分为4大块,每块都有一个起始地址,这个起始地址就是基地址,然后到下一块起始地址的时候就会和前一块地址出现偏差,这个差值就是偏移量,即相对基地址的偏移量。如下图所示。 从上图可以看到APB1总线基地址是0x4000 0000,相对外设基地址的偏移量是0,所以此总线也是外设Block2的基
[单片机]
STM32 DMA外设地址的计算问题
STM32 DMA外设地址的计算其实很简单 其实就是外设寄存器的起始地址+外设数据寄存器的地址偏移。 外设寄存器的起始地址:可以从数据手册上存储器映像查得(见2.3) 外设数据寄存器的地址偏移:就是外设数据寄存器的偏移地址(见各外设的数据寄存器)。 例如: ADC1 起始地址为0X4001 2400 ADC_DR 偏移地址0X4C。 则可得到DMA外设地址 0X4001 244C。
[单片机]