通过前面两篇文章的学习,我们已经对STM32有了一定的了解,知道了STM32单片机的基本分类和不同产品间的特点等知识,今天起围绕STM32F103xx继续深入浅出地学习单片机编程。
在拿到芯片资料后,第一点需要关注的就是芯片的系统架构。该架构主要由驱动单元和被动单元两部分组成。
Cortex®-M3 core的D总线和系统总线
通用DMA
内部SRAM
内部FLASH
FSMC(可连接大屏幕)
AHB 到 APB 的桥(AHB2APBx),它连接所有的 APB 外设。
如下图所示,可以从图中看到Cortex-M3 核心,该内核是ARM公司的数字电路流片的产品,数字电路也就是逻辑电路经过FPGA测试符合要求后流片产生IP(知识产权),这是ARM公司的业务。然后ARM公司通过授权把cortex内核卖给ST公司等芯片公司。芯片公司将内核通过 ICode,DCode,System三种总线,与外设进行连接(如图中的DMA、定时器、USART、I2C等)。
这里补充一下总线知识点:
总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。
AHB(Advanced High-performance Bus)是AMBA 总线的一部分,而AMBA是由ARM公司研发推出的一种高级微控制器总线架构(Advanced Microcontroller Bus Architecture)。其中AMBA包含了四种不同的总线标准,分别是:
其中AXI是在AMBA3.0的协议中增加的,熟悉xilinx FPGA的小伙伴们应该是比较熟悉的,可以用于ARM和FPGA的高速数据交互。
剩下的三种是在AMBA2.0协议中定义的总线标准:
APB1的最大时钟频率要低于APB2的最大时钟频率。
时钟频率是一个非常重要的知识点,和大家日常接触到的CPU主频一样,就可简单理解为频率越高数据传输和处理速度就越快。如下图所示,STM32单片机各个外设均工作在不同的时钟频率下,就是各个外设的工作节奏,如同大家的生活节奏。
STM32F103XX的单片机实物图如下图所示,芯片的丝印信息给出了芯片的型号,生产地址以及批次号等。型号具体含义参见《零基础入门STM32编程(一)》。
STM32F103XX的原理框图如下图所示。单片机芯片由3.6V外部电源供电,系统内核Cortex-M3连接I-bus(指令总线),将指令从存储器中取到Cortex-M3中。所以这条总线与内部的flash连着;cortex-M3通过D-bus(数据总线)从存储器中取数据,可以用于变量的载入或者debug;cortex-M3通过System总线用来加载外设或者SRAM的数据,这条总线的另一端连接着SRAM,AHB外设(包括APB1/APB2外设)。
这里提到了一个专业词汇:外设,是指STM32中除了内核Cortex-M3 CPU和总线之外的硬件电路,如下图中的普通IO、定时器(TIM)、串口(UART)、SPI等硬件电路。这里的外设进一步分为内部外设和外部外设两种。顾名思义,内部外设是ST公司已将一些常用的外部电路集成到了购买的STM32F103XX单片机电路中,方便用户直接使用;如果这些集成在单片机中的外设还不能满足用户的工作需求,那么就需要用户自己连接自己的硬件设备了,如连接摄像头和显示屏等。
从下图可以看出,一些常用外设分别挂在在APB1和APB2总线上。APB1的时钟频率限速于36MHz,主要挂载了普通TIM定时器、USART2、I2C、CAN、USB和SRAM等外设;APB2的时钟频率限速于72MHz,主要挂载了通用IO、TIM1定时器、SP1、USART1、温度传感器和ADC等外设。
STM32F103XX的内置外设的组成见下表,该系列的USART口仅有2个,CAN口1个,定时器TIM共3个,麻雀虽小五脏俱全,后面的学习将围绕这些外设展开。
STM32F103XX的最大主频为72MHz,从下图可知,系统时钟的来源分为内部8MHz时钟和外部16MHz时钟两种。此时可知不论是内部时钟还是外部时钟均没有达到72MHz,此时STM32单片机提供了一种叫做PLL(锁相环)的电路,帮助我们实现任务工作频率的愿望。
首先,讲解内部8MHz时钟电路,8MHz晶振的输出分两路,一路直接输出至SW(选择开关);另一路经分频后得到4MHz频率(8MHz除2)进入PLLMUL(锁相环)进行倍频(4MHz频率的整数倍,此时最大时钟4MHz*16=64MHz)后输出至SW(选择开关);由内核根据程序配置控制SW(选择开关)选择时钟来源,供芯片使用。
其次,分析外部时钟源电路。先看内部晶振的频率精度,见下表,从表中可知,精度为2%。
对于高精度ADC采集应用而言,内部晶振的精度远不能满足,因此STM32可接外部高精度晶振,主要可分为有源晶振和无源晶振。
常见的温补晶振如下图所示,精度有±0.25ppm、±0.6ppm、±1.0ppm、±2.0ppm等,ppm为百万分之一,可见远高于内部晶振精度。比如,12MHz晶振偏差为±20ppm,表示它的频率偏差为12×20Hz=±240Hz,即频率范围是(11999760~12000240Hz)。
无源晶振
无源晶振为2只引脚,频率精度低于温补精度。
外接晶振最大频率不超过16MHz,可分两路进入芯片,一路直接进入PLLXTPRE;另一路分频后进入芯片的PLLXTPRE,最后均输出至SRC与内部晶振汇合。