存储器和总线结构
系统架构
小容量产品
四个驱动单元
- Cortex-M3内核DCode总线(D-bus),和系统总线.
- 通用DMA1和通用DMA2
四个被动单元
- 内部SRAM
- 内部闪存寄存器
- FSMC
- AHB到APB的桥(AHB2APBx),它连接所有的APB设备
互联型产品
五个驱动单元
- Cortex-M3内核和DCode总线(D-bus),和系统总线(S-bus)
- 通用DMA1和通用DMA2
- 以太网DMA
三个被动单元
- 内部SRAM
- 内部闪存寄存器
- AHB到APB的桥(AHB2APx),它连接所有的APB设备
存储器组织
程序存储器,数据存储器,寄存器和输入输出端口被组织在同一个4GB的线性地址空间内.
数据字节以小端格式存放在存储器中。一个字节里的最低字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。
可访问的存储器空间被分成8个主模块,每个块为512MB
其他所有没有分配给片上的存储器和外设的存储器空间都是保留的地址空间。
存储器映像
AHB
USB OTG,以太网,CRC,闪存存储器接口,复位和时钟控制(RCC)
DMA2,DMA1,SDIO
APB2
ADC3,USART1,TIM8定时器,SPI1,TIM1定时器
ADC2,ADC1,GPIO端口G,GPIO端口F,GPIO端口E,GOIO端口D,GPIO端口C
GPIO端口B,GPIO端口A,EXTI,AFIO
APB1
DAC,电源控制(PWR),后备寄存器(BKP),bxCAN2,BxCAN1,USB/CAN共享的512字节SRAM,USB全速设备寄存器,I2C2,I2C1,UART5,
UART4,USART3,USART2,SPI3/I2S3,SPI2/I2S3,独立看门狗(WDG)
窗口看门狗(WWDG),RTC,TIM7定时器,TIM6定时器,TIM5定时器,TIM4定时器
TIM4定时器,TIM3定时器,TIM2定时器
嵌入式SRAM
STM32F10xxx内置64K字节的静态SRAM,它可以以字节,半字(16位)或全字(32位)访问.
位段
Cortex-M3存储器映像包括两个位段(bit-band)区。这两个位段区将别名存储器中每个字映射到位段存储器的一个位,在别名存储区写入一个字具有对应段区的目标位执行读-改-写操作的相同效果。
在STM32F10XXX里,外设寄存器和SRAM都被映射到一个位段区里,这允许执行单一的位段的写和读操作。
bit_word_addr = bit_band_base + (byte_offsetx32)+(bit_numberx4)
其中:
bit_word_addr是别名存储器中字的地址,它映射到某个目标位。
bit_band_base是别名区的起始地址
byte_offset是包含目标位的字节在位段的序号
bit__number是目标所在的位置(0-31)
如: 映射别名区中SRAM地址为0x20000300的字节中的位2:
0x22006008 = 0x22000000 + (0x300x32)+(2x4)
嵌入式闪存
高性能的闪存模块有以下的主要特性:
- 高达512K字节闪存存储器的结构,闪存存储器有主存储器和信息快组成:
主存储块容量
小容量产品主存储快最大为4K x 64位,每个存储快划分为32个1k字节的页
中容量产品主存储块最大为16K x 64位,每个存储快划分为128个1K字节的页
大容量产品主存储模块最大为64K x 64位,每个存储快划分为256个2K字节的页
互联型产品主存储模块最大为32K x 64位,每个存储快划分为128个2K字节的页
信息快容量
互联型产品有2360 x 64位
其它产品有256 x 64位
闪存存储器接口特性
带预取缓存器的读接口(每字节2x64位)
选择字节加载器
闪存编程/擦除操作
访问/写保护
闪存读取
闪存的指令和数据访问是通过AHB总线完成的。预取模块是用于通过ICode总线读取指令的。仲裁是作用在闪存接口,并在DCode总线上的数据访问优先。
等待时间:可以随时更改的用于读取操作的等待状态的数量
预取缓存区: 在每一次复位以后被自动打开,由于每个缓存区的大小(64位)
与闪存的宽带相同,因此只通过需一次读闪存的操作即可更新整个缓存区的内容。由于预取缓存
区的存在,CPU可以工作在更高的主频。 CPU每次取指最多为32位的字,取一条指令时,下一条指令已经在缓存区中等待。
半周期: 用户功耗优化
-
等待周期
0等待周期,当 0 < SYSCLK < 24MHz
1等待周期,当 24MHz < SYSCLK < 48MHz
2等待周期,当 48MHz < SYSCLK < 72MHz -
半周期配置不能与使用了预分配器的AHB一起使用,时钟系统应该等于HCLK时钟。该特性只能用于
在时钟频率为8MHz或低于8MHz时,可以直接使用的内部RC振荡器(HSI),或者是主振荡器(HSE),但不能用PLL。 -
当AHB预分配系数不为1时,必须置预取缓冲区处于开启状态。
-
只有在系统时钟(SYSCLK)小于24MHz并且没有打开AHB的预分频器(即HCLK必须等于SYSHCLK)时,才能
执行预取缓存器的打开和关闭操作。一般而言,在初始化过程中执行预取缓冲器的打开和关闭操作,这时微控制器的时钟由8MHz的内部RC振荡器(HSI)提供。 -
使用DMA: DMA在DCode总线上访问闪存存储器,它的优先级比ICode上的取指高。DMA在每次传送完成后具有一个空余的周期。这些指令可以和DMA传输一起执行.
编程和擦除闪存
闪存和编程一次可以写入16位(半字)。
闪存擦除操作可以按页面擦除或完全擦除(全擦除)。全擦除不影响信息快。
为了确保不完全过度编程,闪存编程和擦除控制器块是由一个固定的时钟控制的。
写操作(编程或擦除)结束时可以出发中断。仅当闪存控制器接口时钟开启时,此中断可以用来从WFI模式退出
启动配置
启动模式选择引脚 启动模式 说明
BOOT1 x BOOT0 0 主闪存存储器 主闪存存储器被选为启动区域
BOOT1 0 BOOT0 1 系统存储器 系统存储器被选为启动区域
BOOT1 1 BOOT0 1 内置SRAM 内置SRAM被选为启动区域
在系统复位后,SYSCLK的第四个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式
在从待机模式退出时,BOOT引脚的值将被重新锁存:因此,在待机模式下BOOT引脚应保持为需要的启动配置。在启动延迟之后,CPU从地址0x0000 0000获取堆栈顶的地址,并从启动存储器的0x000 004指示的地址开始执行代码。
因为固定的存储器映像,代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区(SRAM)始终从地址0x2000 0000开始(通过系统总线访问)。Cortex-M3的CPU始终从ICode总线获取复位变量,即启动仅适合于从代码区开始(典型地从flash启动).STM32F103xxx微控制器实现了一个特殊的机制,系统可以不仅仅从Flash存储器或系统存储器启动,还可以从内置SRAM启动。
-
从主闪存储器启动:主闪存存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的地址(0x8000 0000)访问它,即闪存存储器的内容可以在两个地址区域访问,0x0000 0000或0x0800 0000
-
从系统存储器启动: 系统存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的地址(互联型产品原有地址为0xFFF B000,其它产品原有地址为0x1FFF F000)访问它.
-
从内置SRAM启动: 只能在0x2000 0000开始的地址区访问SRAM
注意: 当从内置的SRAM启动,在应用程序的初始化代码中,必须使用NVIC的异常表和偏移寄存器,重新映射向量表至SRAM中。
内嵌的自举程序
内嵌的自举程序存放在系统存储区,由ST在生产线上写入,用于通过可用的串行接口对闪存存储器进行重新编程
对于小容量,中容量和大容量的产产品而言,可以通过USART1接口启用自举程序
对于互联型产品而言,可以通过以下某个接口启用自举程序:USART1,USART2(重映像的),CAN2(重映像的)或USB OTG全速接口的设备模式(通过设备固件更新DFU协议)。USART接口依靠内部8MHz振荡器(HSI)运行。只有在外部使用8MHz,14.7456MHz或25MHz时钟(HSE)时,才能使用CAN或USB OTG接口。
CRC计算单元
小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx,STM32F102xx和STM32F103xx微控制器
中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx,STM32F102xx和STM32F103xx微控制器
互联型产品是指STM32F105xx和STM32F107xx微控制器
CRC简介
循环冗余校验码(CRC)计算单元是根据固定的生成多项式得到任一32位全字的CRC计算结果。
在其他应用中,CRC技术主要应用核实数据传输或者数据存储的正确性。标准EN/IEC 60335-1即提供了一种核实
闪存存储器完整性的方法,CRC计算单元可以在程序运行时计算出软件的标识,之后与在连接时生成的参考标识做比较,然后存放在指定的存储器空间。
CRC主要特性
使用CRC-32(以太网)多项式:0x4C11DB7
- X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X2 + X + 1
一个32位数据寄存器用于输入/输出
CRC计算时间:4个AHB时钟周期(HCLK)
通用8位寄存器(可用于存放临时数据)
CRC功能描述
CRC计算单元含有1个32位数据寄存器
对该寄存器进行写操作,作为输入寄存器,可以输入要进行的CRC计算的新数据
对该寄存器进行读操作,返回上一次CRC计算结果
每一次写入数据寄存器,其计算结果是前一次CRC计算结果和新计算结果的组合(对整个32位字节进行CRC计算,而不是逐字节的计算),CRC计算单元(CRC)在CRC计算期间会暂停CPU操作,
因此可以对寄存器CRC_DR进行背靠背写入或者连续地写-读操作
可以通过设置寄存器CRC_CR的RESET位来重置寄存器CRC_DR为0xFFFF FFFF。该操作不影响寄存器CRC_IDR内的数据
CRC寄存器
CRC计算单元包括两个数据寄存器和1个控制寄存器
数据寄存器
地址偏移:0x00
复位值: 0xffff ffff
位31:0 数据寄存器,写入CRC计算器的新数据时,作为输入寄存器
读取时返回CRC计算结果
独立数据寄存器(CRC_IDR)
地址偏移: 0x04
复位值: 0x0000 0000
位31:8
位7:0
通用8位数据寄存器
可用于临时存放1字节的数据
寄存器CRC_CR的RESET位生产的CRC复位对本寄存器没有影响
此寄存器不参与CRC计算,可以存放任何数据
控制寄存器
地址偏移: 0x08
复位值: 0x0000 0000
位31:1 保留
位0 RESET位
复位CRC计算单元,设置数据寄存器为0XFFFF FFFF。
只能对该位写'1',它由硬件自动清'0'
CRC寄存器映像
偏移 寄存器 复位值
0x00 CRC_DR 0XFFFF FFFF 31:0~31:31 数据寄存器
0x04 CRC_IDR 0x00 31:0~31:7 独立数据寄存器 31:8~31:31 保留
0x08 CRC_CR 0 31:0 RESET 31:1~31:2 保留 31:3~31:31 保留