1、32位单片机,32地址线(每根地址线有两种状态:导通和不导通)2^32=4G(字节)
2、单片机内存地址访问的存储单元是按字节(8bit)编址的(不是bit)
寻址范围
0x0000 0000 ~ 0xFFFF FFFF(4G个地址)
3、存储器映射
存储数据的设备,本身没有地址信息,分配存储器地址的过程,叫做存储器映射
例1:
19根数据线
16根地址线
总共有2^19=512个地址 0-512K→0x00000-0x80000
每个地址为16=2字节
总共512*2=1MB
映射1:0-512K
映射2:1-512K+1
映射3:100K-612K
4、存储器划分(F1)
存储块 | 功能 | 地址范围 |
block0 | code(FLASH) | 0x0000 0000~0x1FFF FFFF(512MB) |
block1 | SRAM | 0x2000 0000~0x3FFF FFFF(512MB) |
block2 | 片上外设 | 0x4000 0000~0x5FFF FFFF(512MB) |
block3 | FSMC bank1&2 | 0x6000 0000~0x7FFF FFFF(512MB) |
block4 | FSMC bank3&4 | 0x8000 0000~0x9FFF FFFF(512MB) |
block5 | FSMC存储器 | 0xA000 0000~0xBFFF FFFF(512MB) |
block6 | 没用到 | 0xC000 0000~0xDFFF FFFF(512MB) |
block7 | Cortex M3内部外设 | 0xE000 0000~0x1FFFF FFFF(512MB) |
5、寄存器映射
寄存器是单片机内特殊的内存,可以实现对单片机功能的控制
寄存器分类
大类 | 小类 | 说明 |
内核寄存器 | 内核相关寄存器 | 包含R0~R5、xPSR、特殊功能寄存器等 |
中断控制寄存器 | 包含NVIC和SCB相关寄存器,NVIC有:ISER、ICER、ISPR、IP等;SCB有:VTOR、AIRCR、SCR等 | |
SysTick寄存器 | 包含CTRL、LOAD、VAL、CALIB四个寄存器 | |
内存保护寄存器 | 可能功能,STM32F103没有 | |
调试系统寄存器 | ETM、ITM、DWT、IPIU等相关寄存器 | |
外设寄存器 | 包含GPIO、UART、IIC、SPI、TIM、DMA、DAC、ADC、RTC、I/WWDG、PWR、CAN、USB等各种外设寄存器 |
例子:
寄存器地址:0x4001080C →寄存器名字:GPIOA_ODR(映射,给寄存器地址命名)
6、寄存器映射举例
直接操作寄存器地址
(unsigned int)(0x4001 080C)=0xffff;
定义后再操作
#define GPIOA_ODR (unsigned int)(0x4001 080C)
GPIOA_ODR =0xffff;
地址计算
1、总线基地址(BUS_BASE_ADDR)
2、外设基于基地址的偏移量(PERIPH_OFFSET)
3、寄存器相对于外设基地址的偏移量(REG_OFFSET)
寄存器地址=BUS_BASE_ADDR+PERIPH_OFFSET+REG_OFFSET
7、映射方式
使用结构体的方式(分配连续内存)
typedef struct
{
__IO uint32_t CRL;/* GPIO_CRL 寄存器,相对外设基地址偏移量:0X00 */
__IO uint32_t CRH;/* GPIO_CRH 寄存器,相对外设基地址偏移量:0X04 */
__IO uint32_t IDR;/* GPIO_IDR 寄存器,相对外设基地址偏移量:0X08 */
__IO uint32_t ODR;/* GPIO_ODR 寄存器,相对外设基地址偏移量:0X0C */
__IO uint32_t BSRR; /* GPIO_BSRR 寄存器,相对外设基地址偏移量:0X10 */
__IO uint32_t BRR;/* GPIO_BRR 寄存器,相对外设基地址偏移量:0X14 */
__IO uint32_t LCKR; /* GPIO_LCKR 寄存器,相对外设基地址偏移量:0X18 */
} GPIO_TypeDef;
7*4=28字节(1个寄存器32位,32/8=4字节,所以定义的是32位的数据)