STM32的外设寄存器在哪里?它们是在 cortex-m 内核中还是在外围单元中?

Where are the peripherals register in STM32? are they in the cortex-m core or in the peripheral unit itself?

我有两个问题。 memory region of the cortex-m core cpu 1- stm32 微控制器的内存是在 cortex-m 内核内部还是外部?如果它在 cortex-core 内部,为什么它没有显示在 cortex-m 核心通用用户指南的框图中?block diagram of the cortex-m core

2-我试图理解 stm32 架构,但我遇到了歧义。 usart block diagram

正如你在图片中看到的那样,参考手册说 USART 单元有一些寄存器(即数据寄存器)。 但是这些寄存器也存在于cortex-m核心的内存区域(如果第一个问题的答案是"inside")。它们到底在哪里?每个寄存器有两个寄存器吗?还是它们位于 cortex-m 内核或外围设备本身? 它与内存映射 i/o 定义有关吗?

CPU 核心内部的唯一存储是寄存器(包括通用和专用寄存器)。其他一切都是外部的,包括 RAM 和 ROM。

外设控制寄存器本质上存在于外设内部。但是,CPU 访问它们的方式与访问 RAM 或 ROM 的方式相同;这就是内存映射的意义,它告诉你哪些地址指的是 RAM、ROM、外围寄存器和其他东西。 (请注意,大部分内存映射未使用 - 一个 32 位地址 space 能够寻址 4GB 内存,而且我所知道的微控制器都没有这么大的存储空间。)适当的组件 'responds'根据地址在内存总线上读写请求。

对于基本概述,内存映射 IO 上的 Wikipedia page 相当不错。

请注意,其中 none 特定于 Cortex-M。几乎所有现代微处理器设计都使用内存映射。另请注意,Cortex-M 的实际总线架构相当复杂,因此您从维基百科文章中获得的任何理解都将是对真实实现的抽象。

外围设备通过总线连接到核心。地址解码器知道特定总线处理哪个地址。

不仅外围设备通过总线连接。记忆以相同的方式连接。公共汽车通过桥梁相互连接。那些桥梁知道如何指挥交通。

从核心的角度来看,外围寄存器的工作方式与存储单元相同。

差距呢。通常如果地址解码器不理解地址,它会产生异常——硬件错误(在 ARM 术语中称为 HardFault)

细节非常复杂,除非您要设计自己的芯片,否则寄存器级编程器不需要。

请看下图,显示了 STM32 Cortex-M4 处理器的框图。 我突出显示了 CPU 核心(左上角);以及您可以在微控制器中找到的其他组件。

CPU"core"顾名思义就是"core";但微控制器还集成了Flash存储器、RAM和一些外设;内核之外的几乎所有内容(调试线除外)都通过总线矩阵访问,这对于 ROM、RAM 和集成外围设备同样如此。

请注意 "microprocessor" 和 "microcontroller" 之间的主要区别在于后者具有专用的板载外围设备。

STM32 设备上的外设由 CPU 通过内存映射 I/O 访问,请看下图:

如您所见,尽管线性地址 space 从 0x00000000 到 0xFFFFFFFF,地址 space 被分区在 "segments"、f.e、程序存储器开始在 0x00000000,SRAM 在 0x20000000,外设在 0x40000000。特定的外设寄存器可以 read/written 由位于基地址特定偏移量处的指针组成。

对于此设备,USARTS 映射到 APB1 区域,因此地址范围为 0x40000000-0x4000A000。请注意,实际外设地址可能因设备而异。