Flash:永久存储程序代码和固定数据,掉电不丢失(可以擦除的ROM,EEPROM和FLASH的区别是EEPROM按块擦除,而EEPROM可以按字节擦除

ICode总线:从 Flash 取指令

DCode总线:访问常量或 SRAM 数据

System 总线:通过总线矩阵连接APB、AHB总线访问外设寄存器、SRAM、外部存储

FSMC 和 SDIO:FSMC 是一个并行总线控制器,用于高效地连接和访问外部存储器(如 SRAM)或设备(如 LCD),只能连接静态存储器;而 SDIO 是一个串行通信接口,专门用于连接 SD 卡、TF 卡以及 SDIO 接口的设备(如 WiFi 模块)。

AHB:高速外设(DMA、FSMC、SDIO)

APB1:低速外设(UART2-5、I2C、低速定时器)

APB2:高速外设(GPIO、USART1、SPI1、高级定时器、ADC)

DMA :可在外设与内存间直接搬运数据,减少内核负担,提高效率。

典型DMA数据流示例(ADC采样+UART发送):

  1. RCC 配置时钟,开启 ADC、UART、DMA

  2. ADC 采样完成触发 DMA,将数据搬到 SRAM

  3. DMA 再将 SRAM 数据搬到 UART 寄存器发送

  4. NVIC 处理中断(如 UART 错误)

STM32F103C8T6有4G寻址空间,可分为8个512M的地址块,地址从 0x0000 0000 ~ 0xFFFF FFFF 的 4GB 是 STM32 理论分配的地址空间。

单片机在每次上电时都是从 0 地址开始执行,那么这就存在一个问题,我们下载程序时是将代码放在主Flash ,其地址为 0x0800 0000 ~ 0x0807 FFFF,起始地址并不在 0 地址,那单片机要如何找到代码并执行呢?在地址划分的区域可以看出,0x0000 0000 ~ 0x0007 FFFF 这块区域的功能是专门进行地址重映射的,而要进行重映射的区域取决于 BOOT 引脚,通过 BOOT1 和 BOOT0 引脚的电平值,可以选择将0x0000 0000 ~ 0x0007 FFFF 映射到不同的存储器上。
这就解释了为什么我们在 keil 中设置好程序的下载地址为 0x8000000,但是单片机上电是确实从 0 开始执行。是因为我们在硬件上设置了 BOOT0=0,BOOT1=X,从而导致了主FLASH 区被映射到了0x0000 0000 ~ 0x0007 FFFF(512KB),故而代码是下载到 0x80000000 往后的存储空间中,却说运行又是从 0x00000000 地址运行的。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐