历史上的今天
今天是:2024年11月24日(星期日)
2021年11月24日 | STM32 对外设基地址,总线外设基地址和寄存器基地址的理解
2021-11-24 来源:eefocus
前言
本博文基于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的寄存器地址,在对此寄存器进行配置的时候,就是对此地址进行操作;
史海拾趣
|
CTimeSpan span = SysStopTime - SysStartTime; CString s = span.Format( \"Total days: %D, hours: %H, mins: %M, secs: %S\" );   ...… 查看全部问答> |
|
硬件工程师 职责: 1. 负责与客户、营销团队、研发团队、供应商或联盟伙伴共同设计和研制工程产品或产品模块的全过程. 2. 制定和建立设计规范和技术要求。 3. &nbs ...… 查看全部问答> |
|
我是刚开始学习51芯片,老师让我设计一个电路图,我需要实现的功能为数模转换和模数转换,另外接一个4×4键盘,留四个io口,一个用于连接LCD.我想知道我该用什么软件画图,我该从什么地方着手实现.… 查看全部问答> |
|
如题!!都说PT2313很简单,我都是按照PDF说明写程序的,怎么一点声音都没有呢!跪求各位大侠的...程序如下:我用的是MSP430F149做MCU_______ void delay() { unsigned char q0; for(q0=0;q0 0; Count -- ) &n ...… 查看全部问答> |
|
朋友们,CCS V5 编程时怎么使用asin() 函数啊, 包含头文件“math.h”不好使啊 朋友们,CCS V5 编程时怎么使用asin() 函数啊, 包含头文件“math.h”不好使啊… 查看全部问答> |




