STM32学习之存储器映射及位带

  STM32是32位的芯片,意味着有从0x00000000~0xFFFFFFFF 4G也就是32位的寻址空间,在设计芯片的时候,采用的是ARM所设计的架构,ST(意法半导体)公司在基于ARM的对芯片添加了自己的外设。

注意:这里是一个地址空间存放一个字节,即1Byte

  ARM规定:

Vendor-specific memory 511MB 存放特定厂商的代码

Private peripheral bus  1M 物理总线

External device  1.0GB 片上外设不够用时,外扩在此区域

Extermal RAM  1.0GB  RAM空间不够用时,外扩在此区域

peripheral 0.5GB 外设都在此区域 如 GPIO口,定时器等等

SRAM 0.5GB 用来存放运行时的数据

Code(Flash) 0.5GB 用来存放相应的代码和数据 

ST公司又根据ARM的划分添加了相应的外设

 以GPIO口为例:我们操作GPIO口实际上是操作地址为0x40020000~0x400223FF的寄存器

ST的封装如下:

GPIO_TypeDef * 是一个结构体指针类型,而这个结构体的地址为各个端口号的基地址,

 

地址计算为:PERIPH_BASE设备的基地址加上0x00020000的偏移地址为AHB1的地址,AHB1的地址加上各个端口的偏移地址即为各个GPIO口的基地址,再加上每个端口上寄存器的偏移量就得到了该寄存器的地址。

重写GPIOF的寄存器

#define GPIOF_BASEADDR   0x40021400
#define rGPIOF_MODER    *(uint32_t *)(GPIOF_BASEADDR+0x00)
#define rGPIOF_OTYPER   *(uint32_t *)(GPIOF_BASEADDR+0x04)
#define rGPIOF_OSPEEDR  *(uint32_t *)(GPIOF_BASEADDR+0x08)
#define rGPIOF_PUPDR    *(uint32_t *)(GPIOF_BASEADDR+0x0C)


void LED_myCOnfig(void)
{
    RCC->AHB1ENR |= (1<<5);
    rGPIOF_MODER &=~ (3<<12);
    rGPIOF_MODER |= (1<<12);
    rGPIOF_OTYPER &=~ (1<<6);
    rGPIOF_OSPEEDR &=~ (3<<12);
    rGPIOF_OSPEEDR |= (2<<12);
    rGPIOF_PUPDR &=~ (3<<12);
}

位带:

猜你喜欢

转载自www.cnblogs.com/whpl22-Blog/p/11270536.html