一,STM32的存储器映像
STM32的相关认识:
STM32是32位CPU,数据总线是32位的。STM32的地址总线是32位的(地址总线是32位不是由数据总线是32位决定的),所以
STM32可以访问的地址容量是:4GB(2的32次方Byte)。STM32肯定用不完4GB的空间的,所以就有了:逻辑上的地址、实际上的地址。
存储器映像就是告诉我们STM32设计时是如何使用这4GB的逻辑地址的。还有一点需要知道,ARM是内存与IO统一编址的,也就是说STM32的寄存器是可以像访问内存一样直接访问 的。
STM32的局部存储映像如下:
STM32的实际地址安排:
地址范围 | 对应存储类型 |
---|---|
0x00000000 - 0x07FFFFFF | 128MB 映射区 |
0x08000000 - 0x0801FFFF | 128KB Flash |
0x1FFFF000 - 0x1FFFF800 | 2KB System Memory |
0x1FFFF800 - 0x1FFFF9FF | 512B option bytes |
二,STM32的位带操作
字的概念:
计算机进行数据处理时,一次存取、加工和传送的数据长度称为字(word)。一个字通常由一个或多个(一般是字节的整数位)字节(固定为8个bit位)构成。例如286微机的字由2个字节组成,它的字长为16;486微机的字由4个字节组成,它的字长为32位。计算机的字长决定了其CPU一次操作处理实际位数的多少,由此可见计算机的字长越大,其性能越优越。
位带操作:
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 + (0x30032) + (24).
对0x22006008地址的写操作和对SRAM中地址0x20000300字节的位2执行读-改-写操作有着相同的效果。
读0x22006008地址返回SRAM中地址0x20000300字节的位2的值(0x01 or 0x00)
为什么要有位带操作?
因为STM32本身只支持8、16、32位的操作,而不支持位操作。
但是我们实际编程中有对1位单独操作的需求。一般是这么做的:因为STM32不支持位操作,所以我们需要对32位进行整体操作。我们一般是读出整个的32位,然后对其中一位做操作后再整体32位写回去。这么做是可以的,但是效率低。
如何改进效率?答案肯定是想一个办法能够直接一次性修改那一位同时还不影响其他位。如果硬件不支持是没办法的,除非硬件给你支持位操作。而ARM又不支持位操作,所以发明了位带操作来替代。位带操作的思路是不让你直接单独操作这一位,而是把这一位给你映射到别的某个地方的32位,然后你在别的地方操作那个32位就相当于是操作这里的这1位。
别名存储器区大小等于位段存储器区大小的32倍。
位带操作的核心问题就是:如何由位段存储器区地址,计算出别名存储器区的地址
三,STM32的启动模式
三种启动模式
(1)启动模式,是研究STM32上电复位后从哪里去执行程序的问题
(2)用户闪存存储器区是给我们设计来放置用户写的代码的,我们程序员写的代码烧录时就被烧录到这里了,正常工作状态下就要把STM32设置为从这里启动。
(3)系统存储器区在非常规情况下用,用来实现ISP功能的。
(4)内嵌SRAM区,这种也是非常规的,用来实现调试器调试功能的。
如下:
ISP和IAP
(1)ISP就是in-system programming(在系统烧录,在系统编程)。以前要烧录代码bin文件到单片机内部的flash中是需要借助专用的烧录器的,比较麻烦。后来我们就需要一种不用烧录器也不用把单片机从板子上卸下来的烧录方法,这种方法就是ISP。一般ISP都是PC机通过串口把bin/hex文件直接isp到单片机内部flash中。
(2)IAP就是in-application programming(在应用编程,在应用烧录,在线升级),IAP的核心是用户需要在自己的应用程序中去操作单片机内部flash的控制器的寄存器,实现对内部flash的烧录功能。然后IAP的时候用户程序通过串口(usb、ethernet)来接收PC发送过来的bin/hex文件,然后将之烧录到内部flash中去完成IAP。完成后再次启动后就会从用户存储器区执行,更新就会起效果。一般实现iAP需要人为的将用户存储器区分为2部分:bootloader+app。
四,STM32的时钟框图
(1)时钟源:纯内部、内外部(晶振)、纯外部
(2)PLL(锁相环电路),功能就是倍频,2个可选PLL源(PLLSRC控制),倍频可设置(PLLMUL控制)
(3)时钟通道与流向、分频
(4)完全独立的多个时钟
用户可通过多个预分频器配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。 AHB和APB2域的最大频率是72MHZ。 APB1域的最大允许频率是36MHZ。
(1)注意时钟节点名称:
HSI、HSE、LSI、LSE、
PLLCLK、SYSCLK、
USBCLK、HCLK、FCLK、PCLK1、PCLK2、ADCCLK、RTCCLK、IWDGCLK、
时钟相关的寄存器
基地址,查memory map图得到,然后配合偏移量得到寄存器地址。
(1)RCC_CR 0x40021000 重要
(2)RCC_CFGR 0x40021004 重要
(3)RCC_CIR
(4)RCC_APB2RSTR 复位外设时钟的
(5)RCC_APB1RSTR
(6)RCC_AHBENR 外设时钟开关 重要
(7)RCC_APB2ENR 重要
(8)RCC_APB1ENR 重要
(9)RCC_BDCR
(10)RCC_CSR
寄存器位一般有三种:状态位、开关位、设置值位