STM32------寄存器映射和存储器映射
辨别STM32芯片引脚方向
划黄线的丝印下面那个小圆圈对应的引脚就是1号引脚,逆时针依次递增如果没有小圆圈,那么丝印正对着自己,左上角第一个引脚就是1号引脚,逆时针依次递增
STM32构成
stm32由内核,Flash,SRAM,外设构成
外设包含:GPIO,USART,SPI,I2C,ADC,DAC等等
STM32的内存分配
1、STM32芯片在做出来的时候,内部内存已经被分配好了内存块,每个内存块储存不同的东西
图1
图2
这两个图是一个完整的图,截取于STM32f407数据手册中。
关于STM32内存的讲解
图3
图4
图5
在STM32内部的每个内存块存放不同的功能,而每个内存块都有地址,假如我们要用GPIO外设,从上图可知外设的首地址为0x4000 0000(如图1)。在上图的每个内存块中又分为好几个内存块,每个内存块有不同的寄存器,一个地址存放4个字节,在STM32内存中,1个地址存放32位的寄存器,有的寄存器有可能用不到32位(地址之间都相差4,比如第一个地址为0x00,那第二个地址为0x04),只用其中的低16位,那高16位将被保留(如图3)。在图2中我只列出外设内存块中,GPIO的内存块,在这个内存块中又分为GPIOA内存块,GPIOB内存块等等,内存块中存放的就是一些寄存器,每4个地址存放一个32位的寄存器,在图2中我们会看到有一个偏移地址,这个偏移地址是基于每个最小内存块(就是像GPIOA,GPIOB之类的内存块)的首地址。每个最小内存块都有地址范围(如图1),且GPIO内存块的首地址就是GPIOA内存块的首地址。
寄存器映射
学过C语言的同学都知道指针,我们要想取地址中的值必须利用指针,比如GPIOA_OTYPER寄存器的偏移地址为0x04,且GPIOA内存块的首地址为0X4000 0000,那么我们就可以利用下面的方式来取寄存器中的值。
首先我们知道GPIOA_OTYPER寄存器的地址为(0x04+0x4000 0000),这样写还不够,因为编译器并不知道这是地址,所以我们利用指针将其转成地址(unsigned int *)(0x04+0x4000 0000),最后我们再利用指针*(unsigned int *)(0x04+0x4000 0000)就可以读写寄存器了。
#define GPIOA_OTYPER *(unsigned int *)(0x04+0x4000 0000)这就是寄存器映射。
寄存器映射:给具有特殊功能的内存块的首地址取一个具有特殊意义名称的过程就叫做寄存器映射。
存储器映射
定义:芯片在做的时候,内存并没有地址,我们给内存分配地址的过程中就叫做寄存器映射。
内存大小计算
从图1,2中我们可以知道每个大内存块占512MB,所以芯片内存为32GB。
计算过程:以一个code内存块为例,数字0也代表一个地址,0x1FFF FFFF-0x0000 0000=536 870 911十进制,由于0也是一个地址,则0x1FFF FFFF-0x0000 0000=536 870 911+1
,比如地址从0——》0xFF ,0xFF-0=15,而实际地址0也是一个内存,所以必须加1。一个地址中存放1Byte,(536 870 912Byte/1024)=524 288KB/1024=512MB。