1 文中的缩写
1.1 寄存器描述表中使用的缩写列表
在对寄存器的描述中使用了下列缩写:
read / write (rw) 软件能读写此位。
read-only (r) 软件只能读此位。
write-only (w) 软件只能写此位,读此位将返回复位值。
read/clear (rc_w1) 软件可以读此位,也可以通过写’1’清除此位,写’0’对此位无影响。
read / clear (rc_w0) 软件可以读此位,也可以通过写’0’清除此位,写’1’对此位无影响。
read / clear by read (rc_r) 软件可以读此位;读此位将自动地清除它为’0’,写’0’对此位无影响。
read / set (rs) 软件可以读也可以设置此位,写’0’对此位无影响。
read-only write trigger (rt_w) 软件可以读此位;写’0’或’1’触发一个事件但对此位数值没有影响。
toggle (t) 软件只能通过写’1’来翻转此位,写’0’对此位无影响。
Reserved(Res.) 保留位,必须保持默认值不变
1.2 术语表
● 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和
STM32F103xx微控制器。
● 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx
和STM32F103xx微控制器。
● 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx
微控制器。
● 互联型产品是STM32F105xx和STM32F107xx微控制器。
1.3 可用的外设
有关STM32微控制器系列全部型号中,某外设存在与否及其数目,请查阅相应的小容量、中容量或者大容量STM32F101xx和STM32F103xx以及小容量和中容量STM32F102xx的数据手册,以及STM32F105xx/STM32F107xx数据手册。
2 存储器和总线构架
2.1 系统构架
在小容量、中容量和大容量产品中,主系统由以下部分构成:
● 四个驱动单元:
─ Cortex?-M3内核DCode总线(D-bus),和系统总线(S-bus)
─通用DMA1和通用DMA2
● 四个被动单元
─内部SRAM
─内部闪存存储器
─ FSMC
─ AHB到APB的桥(AHB2APBx),它连接所有的APB设备
这些都是通过一个多级的AHB总线构架相互连接的,如下图图1所示:
图1系统结构
在互联型产品中,主系统由以下部分构成:
● 五个驱动单元:
─ Cortex?-M3内核DCode总线(D-bus),和系统总线(S-bus)
─通用DMA1和通用DMA2
─以太网DMA
● 三个被动单元
─内部SRAM
─内部闪存存储器
─ AHB到APB的桥(AHB2APBx),它连接所有的APB设备
这些都是通过一个多级的AHB总线构架相互连接的,如图2所示:
图2互联型产品的系统结构
ICode总线
该总线将Cortex?-M3内核的指令总线与闪存指令接口相连接。指令预取在此总线上完成。
DCode总线
该总线将Cortex?-M3内核的DCode总线与闪存存储器的数据接口相连接(常量加载和调试访问)。
系统总线
此总线连接Cortex?-M3内核的系统总线(外设总线)到总线矩阵,总线矩阵协调着内核和DMA间的访问。
DMA总线
此总线将DMA的AHB主控接口与总线矩阵相联,总线矩阵协调着CPU的DCode和DMA到SRAM、闪存和外设的访问。
总线矩阵
总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁,仲裁利用轮换算法。在互联型产品中,总线矩阵包含5个驱动部件(CPU的DCode、系统总线、以太网DMA、DMA1总线和DMA2总线)和3个从部件(闪存存储器接口(FLITF)、SRAM和AHB2APB桥)。在其它产品中总线矩阵包含4个驱动部件(CPU的DCode、系统总线、DMA1总线和DMA2总线)和4个被动部件(闪存存储器接口(FLITF)、SRAM、FSMC和AHB2APB桥)。
AHB外设通过总线矩阵与系统总线相连,允许DMA访问。
AHB/APB桥(APB)
两个AHB/APB桥在AHB和2个APB总线间提供同步连接。APB1操作速度限于36MHz,APB2操作于全速(最高72MHz)。
有关连接到每个桥的不同外设的地址映射请参考。在每一次复位以后,所有除SRAM和
表1
FLITF以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟。
注意:当对APB寄存器进行8位或者16位访问时,该访问会被自动转换成32位的访问:桥会自动将8位或者32位的数据扩展以配合32位的向量。
2.2 存储器组织
程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。
数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。
外设寄存器的映像请参考相关章节。
可访问的存储器空间被分成8个主要块,每个块为512MB。
其他所有没有分配给片上存储器和外设的存储器空间都是保留的地址空间,请参考相应器件的数据手册中的存储器映像图。
2.3 存储器映像
请参考相应器件的数据手册中的存储器映像图。列出了所用STM32F10xxx中内置外设的起
表1
始地址。
表1寄存器组起始地址
起始地址外设总线寄存器映像
0x5000 0000 – 0x5003 FFFF USB OTG 全速参见26.14.6节
0x4003 0000 – 0x4FFF FFFF 保留AHB
0x4002 8000 – 0x4002 9FFF 以太网参见27.8.5节
0x4002 3400 - 0x4002 3FFF保留
0x4002 3000 - 0x4002 33FF CRC 参见3.4.4节
0x4002 2000 - 0x4002 23FF闪存存储器接口
0x4002 1400 - 0x4002 1FFF保留
0x4002 1000 - 0x4002 13FF复位和时钟控制(RCC) 参见6.3.11节
AHB
0x4002 0800 - 0x4002 0FFF保留
0x4002 0400 - 0x4002 07FF DMA2 参见10.4.7节
0x4002 0000 - 0x4002 03FF DMA1 参见10.4.7节
0x4001 8400 - 0x4001 7FFF 保留
0x4001 8000 - 0x4001 83FF SDIO 参见20.9.16节
0x4001 4000 - 0x4001 7FFF 保留
0x4001 3C00 - 0x4001 3FFF ADC3 参见11.12.15节
0x4001 3800 - 0x4001 3BFF USART1 参见25.6.8节
0x4001 3400 - 0x4001 37FF TIM8定时器参见13.4.21节
0x4001 3000 - 0x4001 33FF SPI1 参见23.5节
0x4001 2C00 - 0x4001 2FFF TIM1定时器参见13.4.21节
0x4001 2800 - 0x4001 2BFF ADC2 参见11.12.15节
0x4001 2400 - 0x4001 27FF ADC1 参见11.12.15节
0x4001 2000 - 0x4001 23FF GPIO端口G 参见8.5节
APB2
0x4001 2000 - 0x4001 23FF GPIO端口F 参见8.5节
0x4001 1800 - 0x4001 1BFF GPIO端口E 参见8.5节
0x4001 1400 - 0x4001 17FF GPIO端口D 参见8.5节
0x4001 1000 - 0x4001 13FF GPIO端口C 参见8.5节
0X4001 0C00 - 0x4001 0FFF GPIO端口B 参见8.5节
0x4001 0800 - 0x4001 0BFF GPIO端口A 参见8.5节
0x4001 0400 - 0x4001 07FF EXTI 参见9.3.7节
0x4001 0000 - 0x4001 03FF AFIO 参见8.5节
0x4000 7800 - 0x4000FFFF保留APB1
0x4000 7400 - 0x4000 77FF DAC 参见12.5.14节
0x4000 7000 - 0x4000 73FF电源控制(PWR) 参见4.4.3节
0x4000 6C00 - 0x4000 6FFF后备寄存器(BKP) 参见5.4.5节
0x4000 6800 - 0x4000 6BFF bxCAN2 参见22.9.5节
0x4000 6400 - 0x4000 67FF bxCAN1 参见22.9.5节
0x4000 6000(1) - 0x4000 63FF USB/CAN共享的512字节SRAM
0x4000 5C00 - 0x4000 5FFF USB全速设备寄存器参见21.5.4节
0x4000 5800 - 0x4000 5BFF I2C2 参见24.6.10节
0x4000 5400 - 0x4000 57FF I2C1 参见24.6.10节
0x4000 5000 - 0x4000 53FF UART5 参见25.6.8节
0x4000 4C00 - 0x4000 4FFF UART4 参见25.6.8节
0x4000 4800 - 0x4000 4BFF USART3 参见25.6.8节
0x4000 4400 - 0x4000 47FF USART2 参见25.6.8节
0x4000 4000 - 0x4000 3FFF保留
0x4000 3C00 - 0x4000 3FFF SPI3/I2S3 参见23.5节
0x4000 3800 - 0x4000 3BFF SPI2/I2S3 参见23.5节
0x4000 3400 - 0x4000 37FF 保留
0x4000 3000 - 0x4000 33FF独立看门狗(IWDG) 参见17.4.5节
0x4000 2C00 - 0x4000 2FFF窗口看门狗(WWDG) 参见18.6.4节
0x4000 2800 - 0x4000 2BFF RTC 参见16.4.7节
0x4000 1800 - 0x4000 27FF保留
0x4000 1400 - 0x4000 17FF TIM7定时器参见15.4.9节
0x4000 1000 - 0x4000 13FF TIM6定时器参见15.4.9节
0x4000 0C00 - 0x4000 0FFF TIM5定时器参见14.4.19节
0x4000 0800 - 0x4000 0BFF TIM4定时器参见14.4.19节
0x4000 0400 - 0x4000 07FF TIM3定时器参见14.4.19节
0x4000 0000 - 0x4000 03FF TIM2定时器参见14.4.19节
1.只在小容量、中容量和大容量的产品中才有这个共享的SRAM区域,互联型产品中没有这个区域。
2.3.1 嵌入式SRAM
STM32F10xxx内置64K字节的静态SRAM。它可以以字节、半字(16位)或全字(32位)访问。
SRAM的起始地址是0x2000 0000。
2.3.2 位段
Cortex?-M3存储器映像包括两个位段(bit-band)区。这两个位段区将别名存储器区中的每个字映射到位段存储器区的一个位,在别名存储区写入一个字具有对位段区的目标位执行读-改-写操作的相同效果。
在STM32F10xxx里,外设寄存器和SRAM都被映射到一个位段区里,这允许执行单一的位段的写和读操作。
下面的映射公式给出了别名区中的每个字是如何对应位带区的相应位的:
bit_word_addr = bit_band_base + (byte_offset×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 或 0x00)。
请参考《Cortex?-M3技术参考手册》以了解更多有关位段的信息。
2.3.3 嵌入式闪存
高性能的闪存模块有以下的主要特性:
● 高达512K字节闪存存储器结构:闪存存储器有主存储块和信息块组成:
─主存储块容量:
小容量产品主存储块最大为4K×64位,每个存储块划分为32个1K字节的页(见表2)。
中容量产品主存储块最大为16K×64位,每个存储块划分为128个1K字节的页(见表3)。
大容量产品主存储块最大为64K×64位,每个存储块划分为256个2K字节的页(见表4)。
互联型产品主存储块最大为32K×64位,每个存储块划分为128个2K字节的页(见表5)。
─信息块容量:
互联型产品有2360×64位(见表5)。
其它产品有258×64位(见表2、表3表4)。
、
闪存存储器接口的特性为:
● 带预取缓冲器的读接口(每字为2×64位)
● 选择字节加载器
● 闪存编程/擦除操作
● 访问/写保护
表2闪存模块的组织(小容量产品)
模块名称地址大小(字节)
0x0800 0000 - 0x0800 03FF
页0 1K
页1 1K
0x0800 0400 - 0x0800 07FF
页2 1K
0x0800 0800 - 0x0800 0BFF
页3 1K
0x0800 0C00 - 0x0800 0FFF
主存储块
页4 0x0800 1000 - 0x0800 13FF1K
… … …
… … …
页31 1K
0x0800 7C00 - 0x0800 7FFF
系统存储器2K
0x1FFF F000 - 0x1FFF F7FF
信息块
选择字节
0x1FFF F800 - 0x1FFF F80F16
FLASH_ACR 4
0x4002 2000 - 0x4002 2003
FALSH_KEYR 4
0x4002 2004 - 0x4002 2007
FLASH_OPTKEYR 4
0x4002 2008 - 0x4002 200B
FLASH_SR 4
0x4002 200C - 0x4002 200F
闪存存储器
FLASH_CR 0x4002 2010 - 0x4002 2013 4
接口寄存器
FLASH_AR 0x4002 2014 - 0x4002 2017 4
0x4002 2018 - 0x4002 201B 4
保留
FLASH_OBR 4
0x4002 201C - 0x4002 201F
FLASH_WRPR 4
0x4002 2020 - 0x4002 2023
0x0800 0000 - 0x0800 03FF
页0 1K
页1 1K
0x0800 0400 - 0x0800 07FF
页2 1K
0x0800 0800 - 0x0800 0BFF
0x0800 0C00 - 0x0800 0FFF
页3 1K
主存储块
页4 0x0800 1000 - 0x0800 13FF1K
… … …
… … …
页127 1K
0x0801 FC00 - 0x0801 FFFF
系统存储器2K
0x1FFF F000 - 0x1FFF F7FF
信息块
选择字节
0x1FFF F800 - 0x1FFF F80F16
0x4002 2000 - 0x4002 2003
FLASH_ACR 4
FALSH_KEYR 4
0x4002 2004 - 0x4002 2007
FLASH_OPTKEYR 4
0x4002 2008 - 0x4002 200B
FLASH_SR 4
0x4002 200C - 0x4002 200F
闪存存储器
FLASH_CR 0x4002 2010 - 0x4002 2013 4
接口寄存器
FLASH_AR 0x4002 2014 - 0x4002 2017 4
0x4002 2018 - 0x4002 201B 4
保留
FLASH_OBR 4
0x4002 201C - 0x4002 201F
FLASH_WRPR 4
0x4002 2020 - 0x4002 2023
表4闪存模块的组织(大容量产品)
模块名称地址大小(字节) 页0 2K
0x0800 0000 - 0x0800 07FF
页1 2K
0x0800 0800 - 0x0800 0FFF
页2 2K
0x0800 1000 - 0x0800 17FF
主存储块
页3 0x0800 1800 - 0x0800 1FFF2K
… … …
… … …
页255 2K
0x0807 F800 - 0x0807 FFFF
系统存储器2K
0x1FFF F000 - 0x1FFF F7FF
信息块
选择字节
0x1FFF F800 - 0x1FFF F80F16
0x4002 2000 - 0x4002 2003
FLASH_ACR 4
FALSH_KEYR 4
0x4002 2004 - 0x4002 2007
FLASH_OPTKEYR 4
0x4002 2008 - 0x4002 200B
0x4002 200C - 0x4002 200F
FLASH_SR 4
闪存存储器
FLASH_CR 0x4002 2010 - 0x4002 2013 4
接口寄存器
FLASH_AR 0x4002 2014 - 0x4002 2017 4
0x4002 2018 - 0x4002 201B 4
保留
0x4002 201C - 0x4002 201F
FLASH_OBR 4
FLASH_WRPR 4
0x4002 2020 - 0x4002 2023
0x0800 0000 - 0x0800 07FF
页0 2K
页1 2K
0x0800 0800 - 0x0800 0FFF
页2 2K
0x0800 1000 - 0x0800 17FF
主存储块
页3 0x0800 1800 - 0x0800 1FFF2K
… … …
… … …
页127 2K
0x0803 F800 - 0x0803 FFFF
系统存储器18K
0x1FFF B000 - 0x1FFF F7FF
信息块
选择字节
0x1FFF F800 - 0x1FFF F80F16
FLASH_ACR 4
0x4002 2000 - 0x4002 2003
FALSH_KEYR 4
0x4002 2004 - 0x4002 2007
FLASH_OPTKEYR 4
0x4002 2008 - 0x4002 200B
FLASH_SR 4
0x4002 200C - 0x4002 200F
闪存存储器
FLASH_CR 0x4002 2010 - 0x4002 2013 4
接口寄存器
FLASH_AR 0x4002 2014 - 0x4002 2017 4
0x4002 2018 - 0x4002 201B 4
保留
FLASH_OBR 4
0x4002 201C - 0x4002 201F
FLASH_WRPR 4
0x4002 2020 - 0x4002 2023
注:有关闪存寄存器的详细信息,请参考《STM32F10xxx闪存编程手册》
闪存读取
闪存的指令和数据访问是通过AHB总线完成的。预取模块是用于通过ICode总线读取指令的。仲裁是作用在闪存接口,并且DCode总线上的数据访问优先。
读访问可以有以下配置选项:
● 等待时间:可以随时更改的用于读取操作的等待状态的数量。
● 预取缓冲区(2个64位):在每一次复位以后被自动打开,由于每个缓冲区的大小(64位)与闪
存的带宽相同,因此只通过需一次读闪存的操作即可更新整个缓冲区的内容。由于预取缓
冲区的存在,CPU可以工作在更高的主频。CPU每次取指最多为32位的字,取一条指令
时,下一条指令已经在缓冲区中等待。
● 半周期:用于功耗优化。
这些选项应与闪存存储器的访问时间一起使用。等待周期体现了系统时钟(SYSCLK)频率与闪注: 1.
存访问时间的关系:
0等待周期,当 0 < SYSCLK < 24MHz
1等待周期,当 24MHz < SYSCLK ≤ 48MHz
2等待周期,当 48MHz < SYSCLK ≤ 72MHz
半周期配置不能与使用了预分频器的AHB一起使用,时钟系统应该等于HCLK时钟。该特性
.
2
只能用在时钟频率为8MHz或低于8MHz时,可以直接使用的内部RC振荡器(HSI),或者是主振
荡器(HSE),但不能用PLL。
当AHB预分频系数不为1时,必须置预取缓冲区处于开启状态。
3.
只有在系统时钟(SYSCLK)小于24MHz并且没有打开AHB的预分频器(即HCLK必须等于
4.
SYSHCLK)时,才能执行预取缓冲器的打开和关闭操作。一般而言,在初始化过程中执行预取
缓冲器的打开和关闭操作,这时微控制器的时钟由8MHz的内部RC振荡器(HSI)提供。
使用DMA:DMA在DCode总线上访问闪存存储器,它的优先级比ICode上的取指高。DMA在 5.
每次传送完成后具有一个空余的周期。有些指令可以和DMA传输一起执行。
编程和擦除闪存
闪存编程一次可以写入16位(半字)。
闪存擦除操作可以按页面擦除或完全擦除(全擦除)。全擦除不影响信息块。
为了确保不发生过度编程,闪存编程和擦除控制器块是由一个固定的时钟控制的。
写操作(编程或擦除)结束时可以触发中断。仅当闪存控制器接口时钟开启时,此中断可以用来从WFI模式退出。
注:有关闪存存储器的操作和寄存器配置,请参考STM32F10xxx闪存编程手册。
2.4 启动配置
在STM32F10xxx里,可以通过BOOT[1:0]引脚选择三种不同启动模式。
表6启动模式
启动模式选择引脚
启动模式说明
BOOT1 BOOT0
X 0
主闪存存储器主闪存存储器被选为启动区域
系统存储器系统存储器被选为启动区域
0 1
内置SRAM 内置SRAM被选为启动区域
1 1
在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。
在从待机模式退出时,BOOT引脚的值将被被重新锁存;因此,在待机模式下BOOT引脚应保持为需要的启动配置。在启动延迟之后,CPU从地址0x0000 0000获取堆栈顶的地址,并从启动存储器的0x0000 0004指示的地址开始执行代码。
因为固定的存储器映像,代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区(SRAM)始终从地址0x2000 0000开始(通过系统总线访问)。Cortex-M3的CPU始终从ICode总线获取复位向量,即启动仅适合于从代码区开始(典型地从Flash启动)。STM32F10xxx 微控制器实现了一个特殊的机制,系统可以不仅仅从Flash存储器或系统存储器启动,还可以从内置SRAM启动。
根据选定的启动模式,主闪存存储器、系统存储器或SRAM可以按照以下方式访问:
● 从主闪存存储器启动:主闪存存储器被映射到启动空间(0x0000 0000),但仍然能够在它原
有的地址(0x0800 0000)访问它,即闪存存储器的内容可以在两个地址区域访问,0x0000
0000或0x0800 0000。
● 从系统存储器启动:系统存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的
地址(互联型产品原有地址为0x1FFF B000,其它产品原有地址为0x1FFF F000)访问它。
● 从内置SRAM启动:只能在0x2000 0000开始的地址区访问SRAM。
注意: 当从内置SRAM启动,在应用程序的初始化代码中,必须使用NVIC的异常表和偏移寄存器,从新映射向量表之SRAM中。
内嵌的自举程序
内嵌的自举程序存放在系统存储区,由ST在生产线上写入,用于通过可用的串行接口对闪存存储器进行重新编程:
● 对于小容量、中容量和大容量的产品而言,可以通过USART1接口启用自举程序。进一步的
细节请查询AN2606。
● 对于互联型产品而言,可以通过以下某个接口启用自举程序:USART1、USART2(重映像
的)、CAN2(重映像的)或USB OTG全速接口的设备模式(通过设备固件更新DFU协议)。
USART接口依靠内部8MHz振荡器(HSI)运行。CAN和USB OTG接口只能当外部有一个
8MHz、14.7456MHz或25MHz时钟(HSE)时运行。进一步的细节请查询AN2606。