第3章STM32系列微控制器存储器与外设

更新时间:2024-05-10 03:09:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第3章 STM32系列微控制器存储器与外设

3.1 存储器和总线的结构 3.1.1 系统结构

系统的主要部分包括:

? 四个驱动单元:

- Cortex-M3内核指令总线 (I-bus),数据总线 (D-bus),以及系统总线 (S-bus) - GP-DMA(通用DMA) ? 三个被动单元:

- 内部SRAM - 内部闪存存储器

这些通过一个多级的AHB总线构架相互连接,如图3.1所示: 图3.1:系统结构

ICode总线

该总线将Cortex-M3内核的指令总线与闪存存储器指令接口相连接。指令预取操作在该总线上进行。 DCode总线

该总线将Cortex-M3内核的DCode总线与闪存存储器的数据接口相连接(常量加载和调试访问)。 系统总线

该总线将Cortex-M3内核的系统总线(外设总线)连接到一个总线矩阵,总线矩阵协调

83

着内核和DMA间的访问。 DMA总线

该总线将DMA的AHB主机接口连接到一个总线矩阵,总线矩阵协调着CPU的DCode和DMA到SRAM、闪存和外设的访问。 总线矩阵

此总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁。此仲裁利用轮换算法。此总线矩阵由三个驱动部件(CPU的DCode、系统总线和DMA总线)和三个被动部件(闪存存储器接口、SRAM和AHB2APB桥)构成。

为了允许DMA访问,AHB外设通过一个总线矩阵连接到系统总线。 AHB/APB 桥 (APB)

两个 AHB/APB 桥在AHB和两个APB总线之间提供完全同步的连接。APB1 被限制在36 MHz, APB2 工作在全速状态 (根据设备的不同可以达到72 MHz)。

- 请参照表3.1 以获取连接到每个桥的外设的地址映射。 AHB 到 APB 桥 (AHB2APBx)该桥用来连接所有的APB设备

3.1.2 存储器结构

程序存储器、数据存储器、寄存器和I/O端口被组织到一个4G字节的线性地址空间。 这些字节在存储器小端格式编码,在小端格式中,一个字中最低地址的字节为该字的最低位字节,最高地址的字节为最高位字节。

图3.2展示了STM32F10x 的内存映射,若需要更为详细的外设寄存器的映射,请参考相关的章节。

可寻址的存储器空间被分为8个512MB的主块。

所有未分配给片上存储器或外设的存储区域被视为是保留的(图3.2中灰色阴影部分)。

3.1.3 存储器映射

84

图3.2 存储器映射

85

3.1.3.1 外设存储器映射

表 3.1:寄存器边界地址 边界地址

0x4002 2400 - 0x4002 3FFF 0x4002 2000 - 0x4002 23FF 0x4002 1400 - 0x4002 1FFF 0x4002 1000 - 0x4002 13FF 0x4002 0400 - 0x4002 0FFF 0x4002 0000 - 0x4002 03FF 0x4001 3C00 - 0x4001 3FFF 0x4001 3800 - 0x4001 3BFF 0x4001 3400 - 0x4001 37FF 0x4001 3000 - 0x4001 33FF 0x4001 2C00 - 0x4001 2FFF 0x4001 2800 - 0x4001 2BFF 0x4001 2400 - 0x4001 27FF 0x4001 2000 - 0x4001 1FFF 0x4001 1800 - 0x4001 1BFF 0x4001 1400 - 0x4001 17FF 0x4001 1000 - 0x4001 13FF 0x4001 0C00 - 0x4001 0FFF 0x4001 0800 - 0x4001 0BFF 0x4001 0400 - 0x4001 07FF 0x4001 0000 - 0x4001 03FF 0x4000 8000 - 0x4000 77FF 0x4000 7000 - 0x4000 73FF 0x4000 6C00 - 0x4000 6FFF 0x4000 6800 - 0x4000 6BFF 0x4000 6400 - 0x4000 67FF 0x4000 6000 - 0x4000 63FF 0x4000 5C00 - 0x4000 5FFF 0x4000 5800 - 0x4000 5BFF 0x4000 5400 - 0x4000 57FF 0x4000 5000 - 0x4000 4FFF 0x4000 4800 - 0x4000 4BFF 0x4000 4400 - 0x4000 47FF 0x4000 4000 - 0x4000 3FFF 0x4000 3800 - 0x4000 3BFF 0x4000 3400 - 0x4000 37FF 0x4000 3000 - 0x4000 33FF 0x4000 2C00 - 0x4000 2FFF 0x4000 2800 - 0x4000 2BFF

外设 保留

闪存存储器接口 保留

复位和时钟控制RCC 保留 DMA 保留 USART1 保留 SPI 1

TIM1定时器 ADC2 ADC1 保留

GPIO 端口 E GPIO 端口 D GPIO 端口 C GPIO 端口 B GPIO 端口 A EXIT AFIO 保留

电源控制(PWR) 备份寄存器(BKP) 保留 bxCAN

共享的USB/CAN SRAM 512字节 USB 寄存器 I2C2 I2C1 保留 USART3 USART2 保留 SPI2 保留

独立的看门狗(IWDG) 窗口看门狗(WWDG) RTC

总线

AHB

APB2

APB1

86

0x4000 2400 - 0x4000 0FFF 0x4000 0800 - 0x4000 0BFF 0x4000 0400 - 0x4000 07FF 0x4000 0000 - 0x4000 03FF 保留

TIM4 定时器 TIM3 定时器 TIM2 定时器

3.1.3.2 嵌入式SRAM

STM32F10x内置20K字节的静态SRAM,可以以字节、半字(16位)、字(32位)的方式访问,SRAM的起始地址为0x2000 0000。

3.1.3.3 位段

Cortex-M3存储器映像包括两个位段(bit-band)区。这两个位段区将别名存储器区中的每个字映射到位段存储器区的一个位,在别名存储区写入一个字具有对位段区的目标位执行读-改-写操作的相同效果。

在STM32F10x里,外设寄存器和SRAM都被映射到一个位段区里,这允许执行单一的位段的写和读操作。

下面的映射公式给出了别名区中的每个字是如何对应位带区的相应位的:

bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)

其中:

? bit_word_addr 是别名存储器区中字的地址,它映射到某个目标位。 ? bit_band_base 是别名区的起始地址。

? byte_offset 是包含目标位的字节在位段里的序号 ? bit_number 是目标位所在位置(0-31)

下面的例子说明如何映射别名区中SRAM地址为0x20000300的字节中的位2: 0x22006008 = 0x22000000 + (0x300*32) + (2*4).

对0x22006008地址的写操作和对SRAM中地址0x20000300字节的位2执行读-改-写操作有着相同的效果。

读0x22006008地址返回SRAM中地址0x20000300字节的位2的值(0x01 or 0x00)。 请参考《Cortex-M3技术参考手册》以了解更多有关位段的信息。

87

3.3.3.5 外部中断配置寄存器1 (AFIO_EXTICR1)

地址偏移:08h 复位值: 0000h

位31:16 位15:0

保留

EXTIx[3:0]: EXTI x 配置(x= 0…3)

这些位由软件写入以选择EXTIx外部中断的输入源。请参阅3.5.2.5节:外部中断/事件线映射 0000: PA[x] 引脚 0001: PB[x] 引脚 0010: PC[x] 引脚 0011: PD[x] 引脚 0100: PE[x] 引脚

3.3.3.6 外部中断配置寄存器2 (AFIO_EXTICR2)

地址偏移: 0Ch 复位值:0000h

位31:16 位15:0

保留

EXTIx[3:0]: EXTI x 配置(x= 4 …7)

这些位由软件写入以选择EXTIx外部中断的输入源。 0000: PA[x] 引脚 0001: PB[x] 引脚 0010: PC[x] 引脚 0011: PD[x] 引脚 0100: PE[x] 引脚

103

3.3.3.7 外部中断配置寄存器3 (AFIO_EXTICR3)

地址偏移: 10h 复位值: 0000h

位31:16 位15:0

保留

EXTIx[3:0]: EXTI x 配置(x= 8 …11)

这些位由软件写入以选择EXTIx外部中断的输入源。 0000: PA[x] 引脚 0001: PB[x] 引脚 0010: PC[x] 引脚 0011: PD[x] 引脚 0100: PE[x] 引脚

3.3.3.8 外部中断配置寄存器4 (AFIO_EXTICR4)

地址偏移:14h 复位值: 0000h

位31:16 位15:0

保留

EXTIx[3:0]: EXTI x 配置(x= 12 …15)

这些位由软件写入以选择EXTIx外部中断的输入源。 0000: PA[x] 引脚 0001: PB[x] 引脚 0010: PC[x] 引脚 0011: PD[x] 引脚 0100: PE[x] 引脚

104

3.3.3.9 GPIO寄存器映射

表3.25:GPIO寄存器映射和复位值

3.3.3.10 AFIO寄存器映射

表3.26 :AFIO寄存器映射和复位值

105

3.4 中断和事件

3.4.1 嵌套向量中断控制器(NVIC)

特性

● 43 个可屏蔽中断通道(不包括Cortex-M3的16个中断线) ● 16 可编程的优先级等级(使用4位中断优先级) ● 低延时异常和中断处理 ● 电源管理控制

● 实现了系统控制寄存器

NVIC和处理器内核接口紧密耦合,从而使得中断处理延时很低并且最近发生的中断能得到高效处理。

所有中断包括内核异常都由NVIC管理,异常和NVIC编程的更多信息,请参阅ARM Cortex-M3TM Technical Reference Manual.中的Chap 5 Exceptions 和 Chap 8 Nested Vectored Interrupt Controller 3.4.1.1 SysTick校验值寄存器

SysTick 校验值被定为9000,将SysTick时钟设置为9MHz(最大为HCLK/8),就能够产生1ms的时间基值。

106

3.4.1.2 中断和异常向量

表3.27:向量表

位优先置 级 - -3 -2 -1 0 1 2 - 3 4 - 5 6 0 7 1 8 2 9 3 10 4 11 5 12 6 13 7 14 8 15 9 16 10 17 11 18 12 19 13 20 14 21 15 22 16 23 17 24 18 25 19

26

优先级异常类型 类型 - - 固定 复位 固定 不可屏蔽中断 固定 硬故障 可调整 存储器管理 可调整 总线故障 可调整 使用故障

- - 可调整 SVCall 可调整 调试监控

- - 可调整 PendSV 可调整 Systick 可调整 WWDG 可调整 PVD 可调整 TAMPER 可调整 RTC 可调整 闪存 可调整 RCC 可调整 EXTI0 可调整 EXTI1 可调整 EXTI2 可调整 EXTI3 可调整 EXTI4 可调整 DMAChannel1 可调整 DMAChannel2 可调整 DMAChannel3 可调整 DMAChannel4 可调整 DMAChannel5 可调整 DMAChannel6 可调整 DMAChannel7

可调整 ADC

可调整

USB_HP_CAN

TX

描述 保留

复位

RCC时钟安全系统(CSS)连接到不可屏蔽向量

所有类型的故障

存储器管理

预取故障,存储器访问故障

未定义的指令或者不合法的状

保留

利用SVC指令调用系统服务

调试监控

保留

可挂起的系统服务请求

系统滴答时钟

窗口看门狗中断

PVD 中断(通过EXTI线)

干扰中断

RTC全局中断

闪存全局中断

RCC全局中断

EXTI线0中断

EXTI线1中断

EXTI线2中断

EXTI线3中断

EXTI线4中断

DMA通道1全局中断

DMA通道2全局中断

DMA通道3全局中断

DMA通道4全局中断

DMA通道5全局中断

DMA通道6全局中断

DMA通道7全局中断

ADC全局中断

USB高优先级或者CAN TX中断

地址

0x0000_0000 0x0000_0004 0x0000_0008

0x0000_000C 0x0000_0010 0x0000_0014 0x0000_0018 0x0000_001C -0x0000_002B 0x0000_002C 0x0000_0030 0x0000_0034 0x0000_0038 0x0000_003C 0x0000_0040 0x0000_0044 0x0000_0048 0x0000_004C 0x0000_0050 0x0000_0054 0x0000_0058 0x0000_005C 0x0000_0060 0x0000_0064 0x0000_0068 0x0000_006C 0x0000_0070 0x0000_0074 0x0000_0078 0x0000_007C 0x0000_0080 0x0000_0084 0x0000_0088 0x0000_008C

107

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整 可调整

USB_LP_CAN_ USB低优先级或者CAN RX0

RX0 中断 CAN_RX1 CAN_RX1中断 CAN_SCE CAN SCE中断 EXTI9_5 EXTI线9:5中断 TIM1_BRK TIM1打断中断 TIM1_UP TIM1更新中断 TIM1_TRG_COM TIM1触发和通信中断

TIM1_CC TIM1捕获和比较中断 TIM2 TIM2全局中断 TIM3 TIM3全局中断 TIM4 TIM4全局中断 I2C1_EV I2C1事件中断 I2C1_ER I2C1错误中断 I2C2_EV I2C2事件中断 I2C2_ER I2C2错误中断 SPI1 SPI1全局中断 SPI2 SPI2全局中断 USART1 USART1全局中断 USART2 USART2全局中断 USART3 USART3全局中断 EXTI15_10 EXTI线15:10中断 RTCAlarm RTC闹钟中断(通过EXTI线) USBWakeUp USB从挂起唤醒中断(通过

EXTI线)

0x0000_0090 0x0000_0094 0x0000_0098 0x0000_009C 0x0000_00A0 0x0000_00A4 0x0000_00A8 0x0000_00AC 0x0000_00B0 0x0000_00B4 0x0000_00B8 0x0000_00BC 0x0000_00C0 0x0000_00C4 0x0000_00C8 0x0000_00CC 0x0000_00D0 0x0000_00D4 0x0000_00D8 0x0000_00DC 0x0000_00E0 0x0000_00E4 0x0000_00E8

3.4.2 外部中断/事件控制器(EXTI)

外部中断/事件控制器有用于产生事件/中断请求的19个边沿检测器组成。每根输入线可以被单独配置以选择类型(脉冲或者挂起)和相关的触发事件(上升沿触发或者下降沿触发或者双边沿触发)。每根线也可以被单独屏蔽,一个挂起寄存器保存了中断请求的状态线。

3.4.2.1 主要特性

EXTI控制器主要特性如下:

? 每根中断/事件线上有独立的触发和屏蔽 ? 每根中断线有专门的状态位

? 可以产生高达19个软件事件/中断请求 ? 可以探测脉宽低于APB2时钟外部信号。关于这个参数的更详细的信息请参照数据手册

的电子特性部分。

108

3.4.2.2 结构图

图3.15中显示了结构图。

图3.15:外部中断/事件控制器结构图

3.4.2.3 唤醒事件管理

Cortex-M3能够处理外部事件或者内部事件以唤醒内核(WFE)。通过配置外部线路,任意的I/O端口,RTC闹钟和USB唤醒等事件可以用于唤醒CPU(从WFE退出)。

为了使用一条外部线路作为一个唤醒事件,请参阅3.5.2.4节:功能描述

3.4.2.4 功能描述

为了产生中断,中断线应该被配置并且使能,这需要把2个触发寄存器编程为需要的边沿检测并且把中断屏蔽寄存器中相关的位写入‘1’使能中断请求来。当被选择的边沿在外部中断线上发生时,将产生一个中断请求。该中断线相关的挂起位也被置位,通过向挂起寄

109

存器写入1能够将该请求复位。

为了产生事件,事件线应该被配置并且使能,这需要把2个触发寄存器编程为需要的边沿检测并且把事件屏蔽寄存器中相关的位写入‘1’使能事件请求。当被选择的边沿在事件线上发生时,将产生一个事件脉冲。该事件线相关的挂起位不会被置位。

中断/事件请求也可以通过软件向中断/事件寄存器写入‘1’来产生。 硬件中断选择

为了将19根线配置为中断源,使用下面的步骤: ? 配置19根中断线的屏蔽位(EXTI_IMR)

? 配置中断线的触发选择位 (EXTI_RTSR 和 EXTI_FTSR)

? 配置那些控制NVIC IRQ通道映射到外部中断控制器(EXTI)的使能和屏蔽位以使得

来自19根中断线上的某个中断能够被正确的应答。 硬件事件选择

为了将19根线配置为事件源,使用下面的步骤: ? 配置19根事件线的屏蔽位(EXTI_EMR)

? 配置事件线的触发选择位 (EXTI_RTSR 和 EXTI_FTSR) 软件中断/事件选择

19根线可以被配置为软件中断/事件线,下面是产生一个软件中断步骤: ? 配置19根中断线的屏蔽位(EXTI_IMR ,EXTI_EMR) ? 将软件中断寄存器的请求位置位(EXTI_SWIER)

3.4.2.5 外部中断/事件线映射

80个GPIOs 以下面的方式连接到16个外部中断/事件线:

110

图3.16:外部中断/事件GPIO映射

另外3根EXTI线按照以下的方式连接: ? EXTI线16 连接到PVD输出 ? EXTI线17 连接到RTC闹钟事件

EXTI线18 连接到USB唤醒事件

3.4.3 EXTI寄存器

中断屏蔽寄存器(EXTI_IMR) 偏移地址:00h

复位值: 0000 0000h

111

位31:19 位18:0

保留,必须保持在复位值0 MRx:线x上的中断屏蔽 0: x线上的中断请求被屏蔽 1: x线上的中断请求未被屏蔽

事件屏蔽寄存器 (EXTI_EMR) 地址偏移:04h

复位值: 0000 0000h

位31:19 位18:0

保留,必须保持在复位值0 MRx:线x上的事件屏蔽 0: x线上的事件请求被屏蔽 1: x线上的事件请求未被屏蔽

上升沿触发选择寄存器 (EXTI_RTSR) 地址偏移: 08h

复位值: 0000 0000h

位31:19 位18:0

保留,必须保持在复位值0

TRx:线x上的上升沿触发事件配置位

0: 输入线上的上升沿触发禁用(为事件和中断) 1: 输入线上的上升沿触发使能 (为事件和中断)

注意:外部唤醒线是边沿触发的,这些线上不允许出现毛刺信号。

112

如果外部中断线上的一个上升沿发生在写EXTI_RTSR寄存器期间,挂起位将不会被置位。同一根中断线可以设置为升沿和下降沿都触发,在这种设置中,上升沿和下降沿都产生一个触发条件。

下降沿触发选择寄存器 (EXTI_FTSR) 地址偏移:0Ch

复位值: 0000 0000h

位31:19 位18:0

保留,必须保持在复位值0

TRx:线x上的上升沿触发事件配置位

0: 输入线上的下降沿触发禁用(为事件和中断) 1: 输入线上的下降沿触发使能 (为事件和中断)

注意:外部唤醒线是边沿触发的,这些线上不允许出现毛刺信号。

如果外部中断线上的一个下降沿发生在写EXTI_RTSR寄存器期间,挂起位将不会被置位。同一根中断线可以设置为升沿和下降沿都触发,在这种设置中,上升沿和下降沿都产生一个触发条件。

软件中断事件寄存器(EXTI_SWIER) 地址偏移:10h

复位值: 0000 0000h

位31:19 位18:0

保留,必须保持在复位值0 SWIERx:x线上的软件中断

当它在0的时候写入1将使得EXTI_PR中相关的挂起位置位。如果该线上的中断在EXTI_IMR和EXTI_EMR中被使能,将产生一个中断请求。该位通过清零EXTI_PR中的相关位(通过向该位写入1)清零。

挂起寄存器(EXTI_PR) 偏移地址: 14h

复位值: xxxx xxxxh

113

位32:19 保留,必须保持在复位值0 位18:0 PRx: 挂起位

0: 无触发请求发生

1: 被选择的触发请求发生

当被选择的边沿事件出现在外部中断线上的时候,该位被置位。 通过向该位写入1或者改变边沿检测器的极性能够将其清零, 注意:如果一个中断请求发生在进入停止模式的前一个周期,EXTI_PR寄存器仅在退出停止模式后才被更新,并且如果EXTI_IMR寄存器中的相关位被置位的话,将会产生一个中断请求。 3.4.3.1 EXTI寄存器映射

表3.28:外部中断/事件控制器寄存器映射和复位值

114

本文来源:https://www.bwwdw.com/article/2zrg.html

Top