
1、总线 系统结构: 系统包括一个由多个互相连接的32位AHB总线组成的矩阵。
– Cortex-M4 with FPU core I-bus, D-bus and S-bus – DMA1 memory bus – DMA2 memory bus – DMA2 peripheral bus – Ethernet DMA bus – USB OTG HS DMA bus
– Internal Flash memory ICode bus – Internal Flash memory DCode bus – Main internal SRAM1 (112 KB) – Auxiliary internal SRAM2 (16 KB) – AHB1 peripherals including AHB to APB bridges and APB peripherals – AHB2 peripherals – FSMC 总线矩阵也能够提供主到从的访问,从而使能并发访问,甚至在多个高速外设同时工作的时候也能够高效工作. 64Kbyte的CCM(core coupled memory)数据RAM不是总线矩阵的一部分,只能通过CPU来访问。 总线类型:
总线结构图: ![]() 2、内存分布 编程空间(代码空间), 数据空间, 寄存器和I/O端口被组织在同一个线性的 4Gb空间中。所有的数据都按照小端存储,可寻址内存空间被分为8个块, 每块包括512MB。 所有没有被分配到片上内存或者片上外设的空间都被成为”reserved” 嵌入式SRAM。 STM32F407ZG配置了4 Kbytes的备份 SRAM,192 Kbytes的系统SRAM。 嵌入式SRAM可以以字节,半字,字的方式访问,可以以CPU的速度进行无需等待的访问,嵌入式SRAM被分为以下3个块:
在STM32中提供了两个位带操作域以及对应的位带别名域。
位带操作公式:
例子:
以后我们想直接操作某个寄存器的某一位的时候,只需要找到这一位对应的别名地址,然后对别名地址进行读写即可实现对这一位的读写。如果想实现这中操作的话,只需要定义宏即可,例如下面的:
内核编程手册给出的M系列4GB内存分布。 ![]() 3、启动配置启动方式
我的板子启动是在main flash memory,由前面的ARM编译工具一节可以知道代码从0x08000000开始运行,这个也是由分散加载文件指定的,也是板子上面main flash实际地址物理地址重映射。 下面的内存空间可以被重映射:
映射表为: ![]() 映射到0x00000000地址处的内存块可以由SYSCFG控制器的(SYSCFG_MEMRMP)寄存器低二位决定,如下表所示:
可以看出来从main flash启动的时候flash memory会被重新映射到0地址开始处,大小为1MB,但是我的板子依然是从0x08000000地址处运行代码的,现在由表中数据可以看出来从0地址开始运行也是可以的,可能是为了适应不同的启动方式,所以才从0x08000000地址处开始运行系统代码的。如果要从其他的地方运行flash memory中的代码,只需要在那种方式对应的被重映射到0地址空间代码段开头加上一个跳转语句,直接跳转到0x08000000地址处就可以运行代码了。
![]() flash memory特性:
![]() 额外补充时钟一节内容: VOS 在 PWR_CR 寄存器的 bit15 位被设置。 等待周期 等待周期指的是CPU访问Flash的等待时间,CPU访问Flash的周期就是等待周期加上1,这个与Flash的硬件性能有关。 ![]() |
STM32 GUI LTDC 最大像素时钟评估方法
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
刘氓兔的64位入门挑战【1】——MP257芯片下单和硬件准备
刘氓兔的64位入门挑战【0】——MP257选型
STM32功能安全设计包,助力产品功能安全认证