根据ST的官方手册,STM32F10X的系统结构图如图4-3所示。ICodeFlashFlash接口DCodeCortex-M3SystemSRAMDMADMA1-FSMCSDIO通道1众桥接2AHB系统线通道2KAPB1桥接1LAPB2复位和时钟VC通道7控制(RCC)GPIOCIDACSPI3/12SGPIODPWRSP2/2SADCEBKPDMA请求GPIOEIWDGUSART1GPIOFbxCANWWDGSPAGPIOGUSBRTCTIM1EXTI12C2TIM7DMA2TIM8AFIO12C1TIM6GPIOATIM5UART5GPIOBTIM4UART4USART3TIM3通道1TIM2USART2通道2通道5DMA请求ai14800c图4-3STM32F10X的系统结构图为更加简明地理解STM32单片机的内部结构,对图4-3进行抽象简化后得到图4-4,这样对初学者的学习理解会更加方便些。Flash闪存接口Flash程序存储器CPUContex-M3内核SRAM存储器可变静态存储控制器(FSMC)总复位与时钟控制(RCC)线AHB系统总线矩SDIO阵高速APB2外设桥接低速APB1外设DMA请求DMAI(7通邀)DMA清求DMA2(5通道)DMA清求图4-4STM32F10X的系统结构简化图现结合图4-4对STM32的基本原理做一简单分析,主要包括以下内容。(1)程序存储器、静态数据存储器、所有的外设都统一编址,地址空间为4GB。但各自都有固定的存储空间区域,使用不同的总线进行访问。这一点跟51单片机完全不一样。11
11 根据ST的官方手册,STM32F10X的系统结构图如图4-3所示。 图4-3 STM32F10X的系统结构图 为更加简明地理解STM32单片机的内部结构,对图4-3进行抽象简化后得到图4- 4,这样对初学者的学习理解会更加方便些。 图4-4 STM32F10X的系统结构简化图 现结合图4-4对STM32的基本原理做一简单分析,主要包括以下内容。 (1)程序存储器、静态数据存储器、所有的外设都统一编址,地址空间为4GB。但各 自都有固定的存储空间区域,使用不同的总线进行访问。这一点跟51单片机完全不一样
具体的地址空间请参阅ST官方手册。如果采用固件库开发程序,则可以不必关注具体的地址问题。(2)可将Cortex-M3内核视为STM32的“CPU”,程序存储器、静态数据存储器、所有的外设均通过相应的总线再经总线矩阵与之相接。Cortex-M3内核控制程序存储器、静态数据存储器、所有外设的读写访问。(3)STM32的功能外设较多,分为高速外设、低速外设两类,各自通过桥接再通过AHB系统总线连接至总线矩阵,从而实现与Cortex-M3内核的接口。两类外设的时钟可各自配置,速度不一样。具体某个外设属于高速还是低速,已经被ST明确规定,可参阅图4-3标示的信息。所有外设均有两种访问操作方式:一是传统的方式,通过相应总线由CPU发出读写指令进行访问,这种方式适用于读写数据较小、速度相对较低的场合:二是DMA方式,即直接存储器存取,在这种方式下,外设可发出DMA请求,不再通过CPU而直接与指定的存储区发生数据交换,因此可大大提高数据访问操作的速度。(4)STM32的系统时钟均由复位与时钟控制器RCC产生,它有一整套的时钟管理设备:由它为系统和各种外设提供所需的时钟以确定各自的工作速度。3.STM32F103VCT微控制器外部引脚STM32F103VCT的外部引脚如图4-5所示。PE2VODOPE3vssNCPA13PEPA12VBATPA11PC13..PA1OPAOPC14.PC15.PABvssPCOVDDPC8STPC7OSC..OSo..PCNRSTPD15PD14PCOPD13PC1PC2PD12STM32F103VCTXPC3PD11VSSAPD10LQFP100VREF.PD9POBVRE.VDDAPB15PB14PA...PAIPB13PB12PA2图4-5STM32F103VCT外部引脚图12
12 具体的地址空间请参阅ST官方手册。如果采用固件库开发程序,则可以不必关注具体的地 址问题。 (2)可将CortexM3内核视为STM32的“CPU”,程序存储器、静态数据存储器、所有的外设均通过相应的总 线再经总线矩阵与之相接。CortexM3内核控制程序存储器、静态数据存储器、所有外设的读写访问。 (3)STM32的功能外设较多,分为高速外设、低速外设两类,各自通过桥接再通过AHB 系统总线连接至总线矩阵,从而实现与Cortex-M3内核的接口。两类外设的时钟可各自配 置,速度不一样。具体某个外设属于高速还是低速,已经被ST明确规定,可参阅图4-3标示 的信息。所有外设均有两种访问操作方式:一是传统的方式,通过相应总线由CPU 发出读 写指令进行访问,这种方式适用于读写数据较小、速度相对较低的场合;二是DMA方式,即 直接存储器存取,在这种方式下,外设可发出DMA请求,不再通过CPU而直接与指定的存储 区发生数据交换,因此可大大提高数据访问操作的速度。 (4)STM32的系统时钟均由复位与时钟控制器RCC产生,它有一整套的时钟管理设备, 由它为系统和各种外设提供所需的时钟以确定各自的工作速度。 3.STM32F103VCT微控制器外部引脚 STM32F103VCT的外部引脚如图4-5所示。 图4-5 STM32F103VCT外部引脚图
(1)5个16位的GPI0:PA、PB、PC、PD、PE:(8O)(2)VDD、VSS:主电源引脚,2.OV—3.6V。(3)VDDA、VSSA:模拟电源引脚,供给ADC和DAC。(4)VREF、+VREF-:参考电源引脚,ADC和DAC的参考电压。(5)VBAT:后备电池引脚。(6)OSCINOSCOUT:外部晶振引脚。(7)NRST:复位引脚。(8)BOOT1:(9)NC:空脚。STM32的时钟树4.2.3众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲,它往往由一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为目的,这种时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时钟树”。在一些传统的低端8位单片机,诸如51、AVR等单片机,它们也具备自身的一个时钟树系统,但它们中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在某种不可更改的状态。例如,51单片机使用典型的12MHz晶振作为时钟源,则其诸如I/0口、定时器、串口等外设的驱动时钟速率便被系统固定,用户将无法更改此时钟的速率,除非更换晶振。而STM32微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速率不再有固定的关系。图4-6是STM32微控制器的时钟树框图。STM32F10XX时钟系统框图及说明HmaaomaePm9#152.4.83UPREHCLKUPtOHSERC72N812PSKAUEOBC_OUTas随用定时滋叶轴OSCIN来PCIKRMESYSCLK-TIM1CLKuhHIKIOFNITIMIRHHSENSonPLtABCCIK中升孩、导的子OSC32JN共5种样:分第为RTCIKLOUTADC用升升新eUSBCLK48MHZ日不关月4速USRPH办246中置点果名部IWDGCEKROEORHELEERSN高生招庆器北青STM32释放您的创造力可美美用皮专器T81S图4-6STM32时钟树框图STM32的时钟系统比较复杂,但又十分重要。理解STM32的时钟树对理解STM32十分重要13
13 (1)5个16位的GPIO口:PA、PB、PC、PD、PE;(80) (2)VDD、VSS:主电源引脚,2.0V—3.6V。 (3)VDDA、VSSA:模拟电源引脚,供给ADC和DAC。 (4)VREF、+VREF-:参考电源引脚,ADC和DAC的参考电压。 (5)VBAT:后备电池引脚。 (6)OSC IN OSC OUT:外部晶振引脚。 (7)NRST:复位引脚。 (8)BOOT1: (9)NC:空脚。 4.2.3 STM32的时钟树 众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲,它往往由一个 外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为目的,这种 时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为 “时钟树'。 在一些传统的低端8位单片机,诸如51、AVR等单片机,它们也具备自身的一个时钟树 系统,但它们中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在某 种不可更改的状态。例如,51单片机使用典型的12MHz晶振作为时钟源,则其诸如I/O口、 定时器、串口等外设的驱动时钟速率便被系统固定,用户将无法更改此时钟的速率,除非 更换晶振。而STM32微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时 钟速率不再有固定的关系。图4-6是STM32微控制器的时钟树框图。 图4-6 STM32时钟树框图 STM32的时钟系统比较复杂,但又十分重要。理解STM32的时钟树对理解STM32十分重要
。下面分五个部分择要对其进行阐述。1.STM32内部RC振荡器与外部晶振的选择STM32微控制器可以选择内部时钟(内部RC振荡器),也可以选择外部时钟(外部晶振)。但如果使用内部RC振荡器而不使用外部晶振,必须清楚以下几点:(1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。(2)对于少于100脚的产品,有两种接法:方法1:OSCIN和OSC_OUT分别通过1Ok欧电阻接地。此方法可提高EMC性能。方法2:分别重映射OSCIN和OSC_OUT至PDO和PD1,再配置PDO和PD1为推挽输出并输出0。此方法相对于方法1,可以减小功耗并节省两个外部电阻。(3)内部8MHz的RC振荡器的误差在1%左右,内部RC振荡器的精度通常比用HSE(外部晶振)要低十倍以上。STM32的ISP就是利用了HSI(内部RC振荡器)。系统时钟的选择是在启动时进行的,复位时内部8MHz的RC振荡器被选为默认的CPU时钟,随后可以选择外部的、具有失效监控功能的4-16MHz时钟,当检测到外部时钟失效后,它将被隔离,系统将自动地切换到内部的RC振荡器。2.STM32时钟源在STM32中,有5个时钟源,分别为HSI、HSE、LSI、LSE、PLL。(1)HSI是高速内部时钟,RC振荡器,频率为8MHz。(2)HSE是高速外部时钟,可接石英谐振器、陶瓷谐振器,或者接外部时钟源,它的频率范围为4MHz16MHz。(3)LSI是低速内部时钟,RC振荡器,频率为4OkHz。它主要用于启动看门狗和通过程序选择启动RTC(RTC用于从停机/待机模式下自动唤醒系统)。(4)LSE是低速外部时钟,接频率为32.768kHz的石英晶体。也可以用来启动RTC。(5)PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择2~16倍,但是其输出频率最大不得超过72MHz。3.STM32时钟树的输入与输出STM32微控制器的时钟树是可配置的,其时钟输入源与最终达到外设处的时钟速率不再有固定的关系。要学会STM32,必须理解时钟树的输入和输出关系。现以图4-5中的圆框数字序号标示的部分所示,说明时钟输入与时钟输出之间的关系,输入至输出之间的路径一可表示为1-2-3-4-5-6-7,当然也可以选择路径二:1-5-6-7。此处以路径一为例,做以下具体兮析。14
14 。下面分五个部分择要对其进行阐述。 1.STM32内部RC振荡器与外部晶振的选择 STM32微控制器可以选择内部时钟(内部RC振荡器),也可以选择外部时钟(外部晶 振)。但如果使用内部RC振荡器而不使用外部晶振,必须清楚以下几点: (1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 (2)对于少于100脚的产品,有两种接法: 方法1: OSC_IN和OSC_OUT分别通过10k欧电阻接地。此方法可提高EMC性能。 方法2:分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽 输出并输出 0。此方法相对于方法1,可以减小功耗并节省两个外部电阻。 (3)内部8MHz的RC振荡器的误差在1%左右,内部RC振荡器的精度通常比用HSE (外部 晶振)要低十倍以上。STM32的ISP就是利用了HSI(内部RC振荡器)。 系统时钟的选择是在启动时进行的,复位时内部8MHz的RC振荡器被选为默认的CPU时 钟,随后可以选择外部的、具有失效监控功能的4-16MHz时钟,当检测到外部时钟失效后, 它将被隔离,系统将自动地切换到内部的RC振荡器。 2.STM32时钟源 在STM32中,有5个时钟源,分别为HSI、HSE、LSI、LSE、PLL。 (1)HSI是高速内部时钟,RC振荡器,频率为8MHz。 (2)HSE是高速外部时钟,可接石英谐振器、陶瓷谐振器,或者接外部时钟源,它的 频率范围为4MHz〜16MHz。 (3)LSI是低速内部时钟,RC振荡器,频率为40kHz。它主要用于启动看门狗和通过程 序选择启动RTC(RTC用于从停机/待机模式下自动唤醒系统)。 (4)LSE是低速外部时钟,接频率为32.768kHz的石英晶体。也可以用来启动RTC。 (5)PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选 择2〜16倍,但是其输出频率最大不得超过72MHz。 3.STM32时钟树的输入与输出 STM32微控制器的时钟树是可配置的,其时钟输入源与最终达到外设处的时钟速率不再 有固定的关系。要学会STM32,必须理解时钟树的输入和输出关系。现以图4-5中的圆框数字 序号标示的部分所示,说明时钟输入与时钟 输出之间的关系,输入至输出之间的路径一可 表示为1-2-3-4-5-6-7,当然也可以选择路径二:1-5-6-7。此处以路径一为例,做以下具 体兮析
USBCLKASRUSB48MHz★toUSBinterfacePrescaler/1,1.5HCLK72MHzmaOAHBbus,cmemoryandDOMAe(37stoCortexSystemtimecSw6SRCPLLMUL+FCLKCortex6free running clockAHBAPB1x16SYSCPCLK136MHzmaxPrescalerPrescalerX3.X472MH2PLLCLKtoAPB1PL/1,2.512/1,2,4,8,16perpheralsPeriphetal ClockHSE4Enable (13 bits)toTIM2.3TIM2.3.4TIMXCLKx1.2MultiplerPeripheral ClockEnable (3 bits)APB2PLLXTPRE72MHzmaxPCLK2PrescalerOAPBOSC_OUTT1.2.4.8.164-16MHzperipheralsPeripheralCliockHSEOSCEnable (11bits)OSC_IN2toTIM1TIMITimer1TIM1CLKx1.2MultiplierParialClock/12Enable (fbit)ADCtoADCOSC32INtoRTCLSEOSCPrescaleSADCCLK12.4.6.8RTCCLK32.768 kHzOS32OUTRTCSEL[1:0]toindepenent Watchdog (IWDGLSIRCIWDGCLKLegend:Main12PLLCLKClockOusnutHSE=HichSoeedExcemalciocksinnalMCOHSIHS=HighSpeedintermalclocksignalHSELS=LowSpeedintemalcioksignalLSE=LowSpeedExtemal clocksignalSYSCLKMCO图4-5STM32微控制器的时钟树1-输入,外部晶振(HSE),可选为4~16MHz。2-第-个分频器PLLXTPRE,可以选择1分频或2分频,3-时钟源选择,开关PLLSRC(PLLentryclocksource),我们可以选择其输出,输出为外部高速时钟(HSE)或是内部高速时钟(HSI)。这里选择输出为HSE。4-PLL(锁相环),具有倍频功能(输入倍频因矛PLLMUL,216倍),经过PLL的时钟称为PLLCLK。倍频因子设定为9倍频,也就是说,经过PLL之后,时钟从原来8MHz的HSE变为72MHz的PLLCLK。5-开关SW,经过这个开关之后就是STM32的系统时钟(SYSCLK)了。通过这个开关,可以切换SYSCLK的时钟源,可以选择为HSI、PLLCLK、HSE。我们选择为PLLCLK时钟,所以SYSCLK就为72MHz了。6-AHB预分频器(分频系数为1~512)。如果选为1,分频系数为1。7-APB2预分频器(分频系数为1,2,4,8,16)。如果选为1,则分频系数为1,所以高速外设APB2(PCLK2)为72MHz。4.STM32中几个与时钟相关的概念SYSCLK:系统时钟,STM32大部分器件的时钟来源。它由AHB预分频器分配到各个部15
15 图4-5 STM32微控制器的时钟树 1-输入,外部晶振(HSE),可选为4〜16MHz。 2-第-个分频器PLLXTPRE,可以选择1分频或2分频。 3-时钟源选择,开关PLLSRC(PLL entry clock source),我们可以选择其输出,输 出 为外部高速时钟(HSE)或是内部高速时钟(HSI)。这里选择输出为HSE。 4-PLL (锁相环),具有倍频功能(输入倍频因矛PLLMUL,2〜16倍),经过PLL的时钟 称为PLLCLK。倍频因子设定为9倍频,也就是说,经过PLL之后,时钟从原来8MHz的 HSE 变 为72MHz的PLLCLK。 5-开关SW,经过这个开关之后就是STM32的系统时钟(SYSCLK)了。通过这个开关,可以 切换SYSCLK的时钟源,可以选择为HSI、PLLCLK、HSE。我们选择为PLLCLK时钟,所以 SYSCLK就为72MHz了。 6-AHB预分频器(分频系数为1〜512)。如果选为1,分频系数为1。 7-APB2预分频器(分频系数为1,2,4,8,16)。如果选为1,则分频系数为1,所以高 速外设APB2(PCLK2)为72MHz。 4.STM32中几个与时钟相关的概念 SYSCLK:系统时钟,STM32大部分器件的时钟来源。它由AHB预分频器分配到各个部