【嵌入式学习笔记】嵌入式基础6——STM32基础知识

1.STM32系统框架

1.1. Cortex M内核 & 芯片

MCU厂商,经ARM公司授权,添加不同的外设 ,就成为了各种XX32芯片。

【嵌入式学习笔记】嵌入式基础6——STM32基础知识_第1张图片

1.2.F1系统架构

  • 4个主动单元:Cortex M3内核 DCode总线(D-Bus)、Cortex M3内核 系统总线(S-Bus)、通用DMA1、通用DMA2
  • 4个被动单元:内部FLASH、内部SRAM、FSMC、AHB到APB的桥(连接的所有APB外设)
  • AHB:高级高性能总线;APB:高级外围总线

I Code(I-Bus)是指令总线;
D Code(D-Bus)是数据总线;
System(S-Bus)是系统总线,用于连接外设;
DMA是直接存储访问控制器,可以实现数据的自动搬运,整个过程不需要CPU处理;
内部Flash相当于硬盘,用于存储代码与数据;
内部SRAM相当于内存,用于数据储存;
FSMC灵活的静态存储控制器,实际上就是一个外部总线接口,可以用来访问外部SRAM、NAND/NOR FLASH、LCD等
总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁,仲裁利用轮换算法,保证各个总线之间的有序访问,从而确保工作正常。

【嵌入式学习笔记】嵌入式基础6——STM32基础知识_第2张图片

1.3.F4系统架构

  • 8个主控总线:Cortex M4内核I总线、Cortex M4内核D总线、Cortex M4内核S总线、DMA1存储器总线、DMA2存储器总线、DMA2外设总线、以太网DMA总线、USB OTG HS DMA总线
  • 8个被控总线:内部FLASH lcode总线、内部FLASH Dcode总线、主要内部SRAM1 (112KB)、辅助内部SRAM2 (16KB)、
    辅助内部SRAM3 (64KB)、(F42xxx和F43xxx)、AHB1外设(包括AHB-APB总线桥和APB外设)、AHB2外设、FSMC
    【嵌入式学习笔记】嵌入式基础6——STM32基础知识_第3张图片

1.4.F7系统架构

  • 1个AXI转AHB总线桥
    1个连接到内嵌FLASH的AXI转64位AHB总线桥
    3个连接到AHB总线矩阵的AXI转32位AHB总线桥
  • 1个AHB总线矩阵
    12个总线主控器
    8个总线从控制器
  • 12个主控总线:3x32位AHB总线、连接到内嵌Flash的64位AHB总线、AHBP总线、DMA1存储器总线、DMA2存储器总线、DMA2外设总线、以太网DMA总线、USB OTG HS DMA总线、LCD控制器DMA总线、DMA2D存储器总线
  • 8个被控总线:AHB总线上的内嵌Flash、Cortex M7 AHBS从接口(仅用于DTCM RAM的DMA数据传输)、主SRAM1 (240KB)、辅助SRAM2 (16KB)、AHB1外设(AHB-APB总线桥和APB外设)、AHB2外设(AHB-APB总线桥和APB外设)、FMC、Quad SPI
    【嵌入式学习笔记】嵌入式基础6——STM32基础知识_第4张图片

1.5.H7系统架构

  • 一个AXI总线矩阵
  • 两个AHB总线矩阵
    D2域的AHB总线矩阵
    D3域的AHB总线矩阵
  • 总线桥
  • 域间总线
    【嵌入式学习笔记】嵌入式基础6——STM32基础知识_第5张图片

2.STM32的寻址范围

32位的单片机可以有32根地址线(每根地址线有两种状态:导通/不导通),单片机内存地址访问的存储单元是按字节编址的。

  • STM32寻址大小:2^32= 4G(字节)
  • STM32寻址范围:0x0000 0000 ~ 0xFFFF FFFF

补充:64位处理器寻址范围是2^64 = 16EB = 16x1024PB = 16x1024x1024TB = 16x1024x1024GB

3.存储器映射*

存储器本身是没有地址信息的,我们对存储器分配地址的过程就叫存储器映射

  • 存储器功能划分(STM32F1)
    【嵌入式学习笔记】嵌入式基础6——STM32基础知识_第6张图片

  • Block0(FLASH)功能划分
    【嵌入式学习笔记】嵌入式基础6——STM32基础知识_第7张图片

  • Block1(SRAM)功能划分
    在这里插入图片描述

  • Block2(外设)功能划分
    【嵌入式学习笔记】嵌入式基础6——STM32基础知识_第8张图片
    【嵌入式学习笔记】嵌入式基础6——STM32基础知识_第9张图片

4.寄存器映射*

寄存器(Register):单片机内部一种特殊的内存,它可以实现对单片机各个功能的控制
寄存器映射:给寄存器地址命名的过程,如将0x4001080C命名为GPIO——ODR。

STM32中的寄存器分类如下:
【嵌入式学习笔记】嵌入式基础6——STM32基础知识_第10张图片
【嵌入式学习笔记】嵌入式基础6——STM32基础知识_第11张图片

  • 寄存器映射举例
1.直接操作寄存器地址:
*(unsigned int *)(0x4001 080C) = 0XFFFF;

2.定义一个名字后再操作:
#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
举例:
【嵌入式学习笔记】嵌入式基础6——STM32基础知识_第12张图片

  1. 获取外设挂在哪个总线上面?查:系统结构图
  2. 获取总线基地址,APB2总线基地址:0X4001 0000
  3. 获取外设地址偏移量,GPIOA相对APB2总线偏移量是:0X800
  4. 获取寄存器地址偏移量,ODR相对GPIOA外设基地址的偏移量是:0X0C
  5. 寄存器地址 = BUS_BASE_ADDR + PERIPH_OFFSET + REG_OFFSET
  6. GPIOA_ODR = 0X4001 0000 + 0X800 + 0X0C = 0X4001 080C
  • 使用结构体实现对寄存器的映射
typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;

GPIOA_BASE: 	0X4001 0800
#define   		GPIOA    	 ((GPIO_TypeDef *)GPIOA_BASE)
&GPIOA->CRL: 	0X4001 0800
&GPIOA->CRH: 	0X4001 0804
&GPIOA->IDR:  	0X4001 0808
&GPIOA->ODR: 	0X4001 080C
实际应用:
GPIOA-> ODR = 0XFFFF
  • stm32f103xe.h寄存器映射说明
    STM32F103所有寄存器映射都在stm32f103xe.h里面完成,包括各种基地址定义、结构体定义、外设寄存器映射、寄存器位定义(占了绝大部分)等。

【嵌入式学习笔记】嵌入式基础6——STM32基础知识_第13张图片

你可能感兴趣的:(嵌入式学习专栏(STM32),学习,笔记,stm32)