【STM32F407学习笔记】初识STM32F4

初识STM32F4

  • 1. 存储器组织结构
  • 2. 标准库对寄存器的封装
    • 2.1总线基地址和外设基地址的封装
    • 2.2 外设寄存器的封装

1. 存储器组织结构

STM32内部的程序存储器(FLASH)、数据寄存器(RAM)、寄存器和IO端口都排列在同一个顺序的4GB的地址空间内,我们编程时也是依据此地址来找到相应寄存器操作。存储器、寄存器本身不具有地址信息,它们的地址由厂商或用户分布。

序号 用途 地址范围
Block0 FLASH/SRAM 0x0000 0000~0x1FFF FFFF(512M)
Block1 SRAM 0x2000 0000~0x3FFF FFFF(512M)
Block2 片上外设 0x4000 0000~0x5FFF FFFF(512M)
Block3 保留 0x6000 0000~0x7FFF FFFF(512M)
Block4 保留 0x8000 0000~0x*FFF FFFF(512M)
Block5 保留 0xA000 0000~0xCFFF FFFF(512M)
Block6 保留 0xD000 0000~0xDFFF FFFF(512M)
Block7 Cortex-M4内核外设 0xE000 0000~0xFFFF FFFF(512M)

组织结构如图中所示
【STM32F407学习笔记】初识STM32F4_第1张图片

  • 程序存储器(FLASH)Block0(0x0000 0000~0x1FFF FFFF)内部功能划分
    【STM32F407学习笔记】初识STM32F4_第2张图片

  • 数据存储器(SRAM)Block1(0x2000 0000~0x3FFF FFFF)内部功能划分
    Block1用于设计片内的数据存储器(SRAM),这一部分相当于电脑的内存条。程序运行的局部变量,堆栈等都存储在这个范围内。

  • 外设Block2(0x4000 0000~0x5FFF FFFF)内部功能划分
    Block2用于设计片上的外设寄存器,根据外设的总线速度不同,Block2被分成了APB和AHB两部分,其中APB又被分为APB1和APB2,AHB分为AHB1和AHB2。速度:AHB2>AHB1>APB2>APB1。

    【STM32F407学习笔记】初识STM32F4_第3张图片

    • STM32外设寄存器地址映射
      【STM32F407学习笔记】初识STM32F4_第4张图片
      通过上表,片上外设区分为四条总线,根据外设速度不同,不同总线挂载这些不同的外设。APB总线下挂在低速外设,AHB总线挂载高速外设。如APB1总线下的第一个外设就是TIM2,它所占据的地址范围是0x4000 0000-0x4000 03FF,那么在这个范围内TIM2的寄存器地址又是怎么映射的呢?
      如图中所示为TIM2到TIM5寄存器的映射【STM32F407学习笔记】初识STM32F4_第5张图片第一列表示寄存器的偏移地址,我们就是根据这个寄存器偏移地址得到寄存器的地址。这个“偏移地址”是相相对于外设基地址的偏移量。例如外设TIM2的地址范围是0x4000 0000~0x4000 03FFF,那么TIM2的基地址就是0x4000 0000。类似于外设基地址的定义,总线基地址是总线地址范围的最低地址。TIM2的部分寄存器映射表如下所示:
      【STM32F407学习笔记】初识STM32F4_第6张图片
      根据上表可以总结:
      外设寄存器地址=外设基地址+对应寄存器偏移地址
      既然得到了寄存器的地址,那么我们就可以直接操作寄存器来配置外设了,例如:我们需要配置GPIOA端口都输出高电平,我们寄存器怎么操作?
      找到GPIOA的端口置位寄存器:
      【STM32F407学习笔记】初识STM32F4_第7张图片
      BR0~ B15:复位IO口,BS0~ BS15:置位IO口

      1. 寄存器名称
        寄存器位图,首先要看的就是寄存器的名称。本土中寄存器位:GPIO端口置位/复位寄存器(GPIOx_BSRR)(x=A,…,I),说明GPIOA、GPIOB、…、GPIOI都有这个寄存器
      2. 寄存器偏移地址和复位值
        外设寄存器地址=外设基地址+寄存器偏移地址
        则GPIOA_BSSR=0x4002 0000+0x18=0x40020018。
        复位值就是芯片复位后,该寄存器的默认值,GPIOA_BSSR复位后都是0。
      3. 寄存器位表
        寄存器位表可以得到寄存器用了多少位,STM32的寄存器都是32位,也就是4个字节,但不是所有寄存器都将这32位用完,有些只用了一部分。也可以知道位权限:“w”可写,“r”可读,“rw”可读可写,很明显GPIOx_BSSR是只写寄存器。
      4. 位功能描述
        详细介绍了寄存器每一位的功能以及用法。

      那么可以使用这段代码将GPIOA的端口设置输出高电平:

      *(uint32_t*)(0x40020018)=0xFF;//设置GPIOA输出高电平
      

      在“stm32f4xx.h”中将这些寄存器全部封装。

2. 标准库对寄存器的封装

2.1总线基地址和外设基地址的封装

STM32库函数为了让编程更加方便,他们把总线基地址和外设基地址都以相应的宏定义起来,总线或外设都以它们的名字作为宏名,如图中所示:
【STM32F407学习笔记】初识STM32F4_第8张图片

2.2 外设寄存器的封装

为了方便的访问寄存器,引入C语言中的结构体语法对寄存器进行封装,如图中所示:
【STM32F407学习笔记】初识STM32F4_第9张图片
这段代码声明了GPIO_TypeDef的结构体类型,结构体内有8个成员变量,变量名正好对应寄存器名。C语言语法规定,结构体内变量的存储空间是连续的,其中32位的变量占用4个字节,16位的变量占用2个字节。
【STM32F407学习笔记】初识STM32F4_第10张图片
这段代码用GPIO_TypeDef类型定义一个指针GPIOx,并让指针指向地址GPIOH_BASE,然后访问它的各个寄存器,设置值。更进一步,我们直接用宏定义好GPIO_TypeDef类型的指针,而且指针指向各个GPIO端口的首地址,使用时我们直接使用宏访问寄存器即可。

你可能感兴趣的:(STM32学习,stm32,单片机,学习)