1、第2章 存储器与总线构架一、系统构架1、STM32系统包含的基本单元l四个驱动单元:Cortex-M3内核ICode总线(I-bus)、DCode 总线(D-bus)和系统总线(S-bus),GP-DMA(通用DMA)l三个被动单元:内部SRAM,内部闪存FLASH存储器,AHB到APB的桥(AHB2APBx),它连接所有的APB设备2、系统结构如下图所示lICode总线:该总线将Cortex-M3内核的指令总线与Flash指令接口相连接,指令预取在此总线上完成。lDCode总线:该总线将Cortex-M3内核的DCode总线与闪存存储器的数据接口相连接(常量加载和调试访问)。l系统总线:此总
2、线连接Cortex-M3内核的系统总线(外设总线)到总线矩阵,总线矩阵协调着内核和DMA间的访问。lDMA总线:此总线将DMA的AHB主控接口与总线矩阵相联,总线矩阵协调着CPU的DCode和DMA到SRAM、闪存和外设的访问。l总线矩阵:此总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁。此总线矩阵由3个驱动部件(CPU的DCode、系统总线和DMA总线)和3个被动部件(闪存存储器接口、SRAM和AHB2APB桥)构成。AHB外设通过总线矩阵与系统总线相连,允许DMA访问。lAHB/APB桥(APB):两个AHB/APB 桥在AHB和2个APB总线间提供同步连接。APB1操作速度限于3
3、6MHz,APB2工作在全速状态(最高72MHz)。二、存储器组织1、存储器的组织方法l程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。l数据字节以小端格式存放在存储器中。一个字中最低地址字节被认为是该字的最低位字节,而最高地址字节是最高位字节。l可访问的存储器空间被分成8个512MB的主要块,其他所有没有分配给片上存储器和外设的存储器空间都是保留的地址空间2、存储器映像(续图)3、外设存储器映像 起始地址外设总线寄存器映像0 x4002 2400-0 x4002 3FFF 保留0 x4002 2000-0 x4002 23FF 闪存存储器接口0 x4002
4、1400-0 x4002 1FFF 保留AHB 0 x4002 1000-0 x4002 13FF 复位和时钟控制0 x4002 0400-0 x4002 0FFF 保留0 x4002 0000-0 x4002 03FF DMA 0 x4001 3C00-0 x4001 3FFF 保留0 x4001 3800-0 x4001 3BFF USART1 0 x4001 3400-0 x4001 37FF 保留0 x4001 3000-0 x4001 33FF SPI1 0 x4001 2C00-0 x4001 2FFF TIM1时钟0 x4001 2800-0 x4001 2BFF ADC2 AP
5、B10 x4001 2400-0 x4001 27FF ADC1 0 x4001 2000-0 x4001 1FFF 保留0 x4001 1800-0 x4001 1BFF GPIO端口E 0 x4001 1400-0 x4001 17FF GPIO端口D 0 x4001 1000-0 x4001 13FF GPIO端口C 0X4001 0C00-0 x4001 0FFF GPIO端口B 0 x4001 0800-0 x4001 0BFF GPIO端口A 0 x4001 0400-0 x4001 07FF EXTI 0 x4001 0000-0 x4001 03FF AFIO 0 x4000
6、8000-0 x4000 77FF 保留0 x4000 7000-0 x4000 73FF 电源控制0 x4000 6C00-0 x4000 6FFF 后备寄存器(BKP)APB10 x4000 6800-0 x4000 6BFF 保留0 x4000 6400-0 x4000 67FF bxCAN 0 x4000 6000-0 x4000 63FF USB的SRAM 256x16 位0 x4000 5C00-0 x4000 5FFF USB寄存器0 x4000 5800-0 x4000 5BFF I2C2 0 x4000 5400-0 x4000 57FF I2C1 0 x4000 5000-
7、0 x4000 4FFF 保留0 x4000 4800-0 x4000 4BFF USART3 0 x4000 4400-0 x4000 47FF USART2 0 x4000 4000-0 x4000 3FFF 保留0 x4000 3800-0 x4000 3BFF SPI2 0 x4000 3400-0 x4000 37FF 保留APB10 x4000 3000-0 x4000 33FF 独立看门狗(IWDG)0 x4000 2C00-0 x4000 2FFF 窗口看门狗(WWDG)0 x4000 2800-0 x4000 2BFF RTC 0 x4000 2400-0 x4000 0FF
8、F 保留0 x4000 0800-0 x4000 0BFF TIM4定时器0 x4000 0400-0 x4000 07FF TIM3定时器0 x4000 0000-0 x4000 03FF TIM2定时器4、STM32F10X中各接口部件中的寄存器 STM32F103系列微控制器嵌入的各种接口部件都有三大类寄存器:控制寄存器、数据寄存器和状态寄存器,每一类寄存器都包含了多个寄存器,它们在相同的基地址下具有不同的偏移地址。例:TIM2定时器的基地址是:0 x4000 0000 控制寄存器1的偏移地址是:00H 控制寄存器2的偏移地址是:04H 从模式控制寄存器的偏移地址是:08H DMA/中断
9、使能寄存器的偏移地址是:0CH等由上表述可得到它们的物理地址是:控制寄存器1的物理地址是:0 x4000 0000 控制寄存器2的物理地址是:0 x4000 0004 从模式控制寄存器的物理地址是:0 x4000 0008 DMA/中断使能寄存器的物理地址是:0 x4000 000C等因此对这些寄存器的操作实际上就是对其物理地址中内容的操作5、嵌入式SRAM STM32F10 x内置20K字节的静态SRAM,它可以以字节、半字(16位)或全字(32位)访问,SRAM的起始地址是0 x2000 00006、嵌入式闪存高性能的闪存模块有以下的主要特性:l128K字节闪存l擦写次数:100万次存储器
10、结构:闪存存储器有主存储块和信息块组成(1)主存储块为16Kx64位,每个主存储块又划分为128个1K字节的页。(2)信息块为320 x64位,每个信息块又划分为一个2K字节和一个0.5K字节的页三、启动配置 启动模式选择管脚启动模式说明BOOT1BOOT0 x0用户Flash用户闪存被选为启动区域01系统存储器系统存储器被选为启动区域11内嵌SRAM内嵌 SRAM被选为启动区域 在STM32F10 x里,可以通过BOOT1:0引脚选择三种不同启动模式四、STM32F10X提供的固件库 固件库包括了程序、数据结构和覆盖所有外部特性的宏单元,还包括设备驱动的描述以及每个外围模块的实例。为了方便用
11、户的编程,STM32F10X对接口部件中寄存器的操作转变成了对固件库的操作。即只要调用固件库中的相关函数,就可以完成对接口寄存器的操作。STM32F10X中固件库中的函数是以接口部件来分类的。1、STM32固件库的定义规则STM32固件库中使用的缩写词:缩写外围模块/单元缩写外围模块/单元ADC模/数转换PWR电源控制BKP备份寄存器RCC复位和时钟控制CAN控制器区域网络RTC实时时钟DMA直接存储器存取控制SPI串行外围接口EXTI外部中断控制器SysTick 系统tick定时器FLASHFlash存储器TIM通用定时器GPIO通用I/OTIM1先进的控制定时器I2CI2C接口USART通
12、用同步异步接收传送器IWDG独立看门狗WWDG窗口看门狗NVIC嵌套向量中断控制器(1)固件库的命名规则l PPP表示外围模块的缩写l 系统文件名和源/头文件名以“stm32f10 x_”的形式表示,例如stm32f10 x_conf.h。l 在单一文件中使用的常量在该文件中定义,在多个文件中使用的常量定义在头文件中,所有的常量以大写字母表示。l 寄存器当作常量看待。同样以大写字母表示。l 外围模块功能函数的名字需要有相应的外围模块缩写加下划线这样的前缀。每个单词的首写字符需要大写。例SPI_SendDatal 使用PPP_InitTypeDef中指定的参数初始化PPP外围模块的函数,被命名为
13、PPP_Init。l 复位PPP外围模块寄存器为默认值的函数,命名为PPP_DeInit。l 将PPP_InitTypeDef结构体中的每个成员设置为复位值的函数,命名为PPP_StructInit。l 用来使能或禁止指定的PPP外围模块的函数,命名为PPP_Cmd l 用来使能或禁止指定的PPP外围模块的某个中断资源的函数,命名为PPP_ITConfigl 用来使能或禁止指定的PPP外围模块的DMA接口的函数,被命名为PPP_DMAConfig。l 用来设置某个外围模块的函数,总是以“Config”结尾。l 用来检测指定PPP的标志是否被置位或清0的函数,命名为PPP_GetFlagStat
14、us。l 用来清除某个PPP的标志的函数,命名为PPP_ClearFlagl 用来检验指定PPP的中断是否发生的函数,命名为PPP_GetITPendingBitl 用来清除某个PPP中断挂起位的函数,命名为PPP_ClearITPendingBit(2)代码标准l 变量定义了18个变量类型,在头文件stm32f10 x_type.h中Typedef signed long s32;Typedef signed short s16;Typedef signed char s8;Typedef volatile signed long v32;Typedef volatile signed sh
15、ort v16;Typedef volatile signed char v8;Typedef unsigned long u32;Typedef unsigned short u16;Typedef unsigned char u8;Typedef unsigned long const uc32;Typedef unsigned short const uc16;Typedef unsigned char const uc8;Typedef volatile unsigned long vu32;Typedef volatile unsigned short vu16;Typedef vo
16、latile unsigned char vu8;Typedef volatile unsigned long const vuc32;Typedef volatile unsigned short const vuc16;Typedef volatile unsigned char const vuc8;l 布尔(bool)类型布尔类型在头文件stm32f10 x_type.h中定义Typedef enumFALSE=0,TRUE=!FALSEbool;l 标志状态(FunctionlState)类型标志状态类型在头文件stm32f10 x_type.h中定义Typedef enumRESE
17、T=0,SET=!RESETFlagStatus;l 功能状态(FunctionlState)类型功能状态类型在头文件stm32f10 x_type.h中定义Typedef enumDISABLE=0,ENABLE=!DISABLEFunctionlState;l 错误状态(FunctionlState)类型错误状态类型在头文件stm32f10 x_type.h中定义Typedef enumERROR=0,SUCCESS=!ERRORErrorStatus;(3)外围模块指向外围模块的指针,用来访问外围模块控制寄存器。l 外围模块控制寄存器结构stm32f10 x_map.h包含了所有外围模块
18、结构的定义。下面是一个SPI寄存器结构的声明Typedef structvu16CR1/*SPI 控制寄存器1*/u16RESERVED0 /*保留0*/vu16CR2/*SPI 控制寄存器2*/u16RESERVED1 /*保留1*/vu16SR/*SPI 状态寄存器*/u16RESERVED2/*保留2*/vu16DR/*SPI 数据寄存器*/u16RESERVED3/*保留3*/vu16CRCPR/*SPI CRC多项式寄存器 */u16RESERVED4/*保留4*/vu16RXCRCR/*SPI Rx CRC 寄存器*/u16RESERVED5/*保留5*/vu16TXCRCR/*S
19、PI Tx CRC 寄存器*/u16RESERVED6/*保留6*/SPI_TypeDef 每个外围模块的寄存器名是该寄存器的缩写,用大写表示。RESERVEDi(i是正数,作为保留域的下标)表示保留域。l 外围模块声明所有外围模块在stm32f10 x_map.h中声明。下面给出了SPI外围模块的声明#ifndef EXT#Define EXT extern#endif#define PERIPH_BASE(u32)0 x40000000)#define APB1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE(PERIPH_BASE+0 x100
20、00)/*SPI2 基地址的定义*/#define SPI2_BASE(APB1PERIPH_BASE+0 x3800)/*SPI2 外围声明*/#ifndef DEBUG#ifdef _SPI2#define SPI2(SPI_TypeDef*)SPI2_BASE)#endif/*_SPI2*/#else/*DEBUG*/#ifdef _SPI2 EXT SPI_TypeDef *SPI2#endif/*_SPI2*/#endif/*DEBUG*/说明:(1)定义标签_SPI,用来在应用程序中引入SPI外围模块库(_SPI标签定义在stm32f10 x_conf.h中)。(2)定义label
21、_SPIn,用来访问SPIn的外围寄存器(_SPIn标签定义在stm32f10 x_conf.h中)。(3)为了进入调试模式,用户必须在头文件stm32f10 x_conf.h中定义标签DEBUG。这样就构成了一个指向SRAM中外围模块结构体的指针,从而使调试变的简单,并且所有寄存器的设置可以通过转储一个外围变量来实现。2、STM32固件库的层次结构(1)示例(Examples)文件夹Examples包含每个外设模块的子文件夹,每个子文件夹提供了运行该外设所需要的最小文件集。l readme.txt:描述示例如何工作。l stm32f10 x_conf.h:头文件,配置所使用的外围模块,并且包
22、括各种DEFINE语句。l stm32f10 x_it.c:中断处理函数的源文件。l stm32f10 x_it.h:中断处理函数的原型。l main.c:示例代码。(2)库(Library)文件夹Inc子文件夹包含固件库的头文件,不需用户修改。l stm32f10 x_type.h:所有其它文件中使用的普通数据类型和枚举。l stm32f10 x_map.h:外围模块内存映射和寄存器数据结构。l stm32f10 x_lib.h:主头文件,引入所有其它头文件。l stm32f10 x_ppp.h(每个外围模块对应一个头文件)函数原型,数据结构和枚举。l cortexm3_macro.h:co
23、rtexm3_macro.s(专用的Cortex-M3指令的封装)的头文件。src子文件夹包含固件库的源文件,不需用户修改。l stm32f10 x_lib.c:所有外围模块指针初始化。l stm32f10 x_ppp.c(每个外围模块对应一个源文件):每个外围模块的函数体。(3)工程(Project)文件夹 它包含了一个标准的模板工程,用户可以在此基础上建立新的用户工程。l stm32f10 x_conf.h:配置文件,包括所有外围模块的默认定义。l stm32f10 x_it.c:源文件,包括中断处理函数。l stm32f10 x_it.h:头文件,包含所有中断处理的原型。l main.c:主函数体。l EWARM,RVMDK:由工具链使用。3、STM32固件库的使用使用固件库建立示例应用的过程如下:l 使用IAR建立一个工程l 添加一个新的源文件main.c,并添加其内容,其中主体实现在函数main中。l 引入固件库l 编译并运行