STM32F10xx系列单片机是意法半导体推出的ARM核心32bit单片机。性价比非常高,真正做到了高性能、低价格并且极易使用,因此受到了工程师和应用厂商的共同青睐。 4 p9 c2 J; ?$ X) y+ J( o 1. ST和ARM6 K8 {4 c( V+ c2 M7 @& P ST是半导体设计、制造公司,它设计并生产芯片。5 w \+ f1 I) D* n ARM是知识产权(IP intellectual property)供应商,它的产品是ARM内核(只做设计)。+ w* h/ ~' R1 B( s: I" T- J* U$ m 对于STM32F10XX,其中CPU是ARM公司设计的,其他部分是ST公司设计的,整个芯片是ST公司制造的。 9 A& d' g% f7 E. V0 \3 ^# A 2. STM32F10X$ m# E! T: ^8 h( G5 D 对于一个MCU(microcontroller unit),就像它的名字一样,其主要角色就是一个控制器(controller)而且是一个微(micro)控制器,并且它自成一个单元(unit),因此它是一系列组件的结合。 这些组件包括CPU(中央处理器)、ROM、RAM、总线、各种被控制设备(外设)等等。。。! a! Z7 _8 l- T! @. F6 M 2.1 STM32F10X系统架构 简单一点,所谓的系统架构就是:MCU里面有哪些东西?这些东西是怎么布置(连接)的?7 x7 e$ |9 S: U 通过这幅框图(来自野火的资料),理解它的架构就足够了:( P- \( b( @6 }& K 7 A8 V" h# E! K( [$ ]7 }* R $ u4 A- y$ G3 s; b. F 通过上面框图可以看到MCU的组成: ICode总线; 驱动单元;, S5 M$ [6 i. W5 s4 B) R) M 被动单元;3 D$ Z$ L! h3 l, ` 总线矩阵; 其中:3 q' f! K9 m4 a! |4 N 1.ICode总线:该总线将Cortex™-M3内核的指令总线与闪存指令接口相连接。指令预取在此总线上完成。/ u4 E5 \5 a0 z2 W5 @) u ! U, L/ @. M3 [* \0 b9 r 2.驱动单元 DCode总线:该总线将Cortex™-M3内核的DCode总线与闪存存储器的数据接口相连接(常量加载和调试访问)。5 T# v% N) c, J* [4 V5 r+ H/ m7 K DCode 中的 D 表示 Data,即数据,那说明这条总线是用来取数的。 我们在写程序的时: s6 `; {0 w; j0 _ 候,数据有常量和变量两种,常量就是固定不变的,用 C 语言中的 const关键字修饰,是放 到内部的 FLASH 当中的,变量是可变的,不管是全局变量还是局部变量都放在内部的 SRAM。 因为数据可以被 Dcode 总线和 DMA 总线访问,所以为了避免访问冲突,在取数的 时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。/ }7 B) ~( p( ~- ?7 a7 C + s( i4 z" T& _- W8 u 系统总线:此总线连接Cortex™-M3内核的系统总线(外设总线)到总线矩阵,总线矩阵协调着内核和DMA间的访问。! w6 ?- W% g1 E( n 系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通* _/ m, Y! k9 K& [- j 过这根系统总线来完成的。 DMA 总线:DMA 总线也主要是用来传输数据,这个数据可以是在某个外设的数据寄存器,可以在# v5 n% q2 K. {# @ SRAM,可以在内部的 FLASH。因为数据可以被 Dcode 总线和 DMA 总线访问,所以为了6 _' t x* t9 s/ y% W8 F 避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。 3.被动单元 内部的Flash:用于存放指令和只读数据,也包括未加载的程序的存储以及用户自由存储的数据;% D6 d( r R* S8 i3 m 内部SRAM:用于全局变量和堆栈的开销;/ N. U* S% d8 _ / s' X! B/ o4 v5 i+ C8 H FSMC:flexible static memory controller,可用于扩展设备。$ M8 K- X1 U- ^8 Y7 o 0 _2 @# b6 t# S. _5 ^ AHB到APB的桥:APB1和APB2上挂载者各种外设,它们速度相对较低,因此使用AHB到APB的桥来衔接。/ d; F* Q/ s0 D2 q" T 4.总线矩阵:总线矩阵协调各个总线之间的访问仲裁,仲裁利用轮换算法。* S! m6 M! s; Y8 W / r' T6 D$ } Y; B2 d/ h. o 来个更详细的: 4 ^3 u" u0 D. I8 ]7 F {. u( g ' Z0 D2 T X, W* Z 小结:+ V8 T" d1 ~4 L* U" `0 M6 ^- G 芯片内各个组件都连接到各自总线->各个总线都连接到总线矩阵->总线矩阵协调各个总线之间的访问仲裁。 2.2 存储器映射 为使CPU能控制芯片中的每个被动单元,这些被动单元的每个组件就必须要有一个确切的地址。 各个组件和4GB地址空间的对应关系就是储器映射。% X( E- e H# t# ^ 程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。可访问的存储器空间被分成8个主要块,每个块为512MB。 ) Y# {2 u& r; Z 数据字节以小端格式存放在存储器中。其他所有没有分配给片上存储器和外设的存储器空间都是保留的地址空间。(没有分配的不要用,是系统保留的,用了会出问题。) ; b3 J- m3 c/ p6 F 知识点: - 小端:低尾端,即字节序的尾端存储在低地址的存储单元。 - 大端:反过来即是。/ K3 N% {8 F. q 0 X' N- P0 A7 J4 _ 存储器映射图: + ?7 ^& s; K8 L2 |( g0 B% v6 N ! T& [2 |$ S2 @1 A; W$ M 其实,上面的具体分配是ST做的,但是ARM提供了一个框架,ST具体了每个组件的地址。下面是ARM的存储器映射框架: 2.3 寄存器映射 在block2地址块中编排的是外设寄存器的地址。 外设寄存器是用来控制外设或缓存外设数据的数字电路结构。在本质上,它们和存储器(如FLASH或SRAM)没什么区别,都是不同功能的数字电路。只是在应用上主要用于外设的访问和控制。 2 Q# j; ^7 h ]8 r: T 映射的定义没有改变,就是对应关系。* H" V2 p; x: Y, K/ E& Y- v 寄存器映射是指:一个(寄存器的)地址与一个(我们取的)名字的对应关系。有了这样的映射关系,在写程序时就可以用一个符号来代指一个寄存器,而不要通过一个个地址来代指,大大地方便了程序的编写(特别是C语言程序)。. X, N) f5 v$ g# Q, c/ v 3. Cortex系列处理器 前面简单地看了看STM32的功能结构,在单片机中最重要的一部分便是CPU,往往,我们在做应用时与它打交道是最少的,但对于整个单片机来讲,它是最重要的,也是最复杂的。# T9 z# R8 T i* O5 _5 @ ARM公司设计的处理器自从ARM11(指令集版本为ARMv6)之后,命名为Cortex。 Cortex分为三个系列,如下图(指令集版本分别为ARMv7-A、ARMv7-R、ARMv7-M):2 \0 J. o& o! I: H0 i ; |0 N) ^9 R, Y/ {3 U" y Cortex-A:Application,面向尖端的基于虚拟内存的操作系统和用户应用。 Cortex-R:Realtime,面向实时应用。 Cortex-M:Mircocontroller,面向微控制器。 ARM指令集架构历史回顾: 3.1 Cortex-M家族:% l# C7 ` e( b4 k2 j; T1 e ; O; m+ V2 c" ~7 b 3.2 Cortex-M结构 和其他哈佛结构的精简指令集CPU一样,Cortex-M3的指令总线和数据总线是分开的,这样的设计大大提高了执行效率。 D; }- G; U: \5 v8 _: b9 Y0 L 这货比较底层,也没什么好说的,不是太简单而是太复杂,不懂,所以不敢乱说。 ! m. r1 e7 W o9 H6 ?& C 看图:" i& M1 M" ~' d+ X ! i0 M; [4 D% B " V; H6 G {. S2 v5 f0 T ; K! u' V% ^. N( n1 N; b; Z 内核的详细知识请看一本书: Cortex-M3 权威指南 Joseph Yiu 著1 F" K5 c0 u2 L5 o' d( T 宋岩 译. d$ f* y8 k2 y" n 4. 小结$ ?- Q9 S# S* x) l0 J | 主要描述了基于ARMv7架构的Cortex-M3内核的STM32F10XX芯片的架构。它包括:4 i6 G2 n$ f% Q2 C % H8 G; \6 E6 k8 E% G, ] 哈佛结构的Cortex-M3内核(单片机的核心)。7 Y8 n8 P& U& Q9 C' I+ _: y 驱动设备:数据总线、系统总线、DMA1、DMA2.% h& J5 E* c8 `; j( n& f- P 被驱动设备:嵌入式片上Flash、片上SRAM、FSMC、总线桥以及各种外设。0 a! i8 v' A. L$ _ 连接各个总线的总线矩阵。 还描述了存储器的映射关系。 意思意思了一下Cortex-M3内核。+ {1 ?9 g0 k+ q/ n8 b7 D " }0 }: {* {, n( ^0 d9 w |
【经验分享】STM32F1 GPIO工作原理
【经验分享】STM32F0xx_DMA收发USART数据配置详细过程
【经验分享】STM32F1和STM32F4 区别
【经验分享】STM32F1系列之常用外设说明
【经验分享】STM32介绍
【经验分享】STM32F1x系列——Flash 模拟 EEPROM
【经验分享】STM32F1在MDK下新建标准库函数工程
【经验分享】stm32f1的存储器与复位
【经验分享】stm32F1 us延时函数
【经验分享】STM32F1之定时器