第二节 最小系统时钟.ppt
第二节 最小系统,最小系统,最小系统指ARM能够运行所需要的最基本的条件包括:电源,时钟源,复位电路,调试接口,ARM处理器(自带128k闪存,20kSRAM),STM32F103VBT6,电源,时钟源,复位电路,调试,电源,芯片要求2.03.6V的操作电压(VDD)当主电源VDD关闭时,实时时钟(RTC)和备用寄存器可以从VBAT供电为提高转换精度,ADC可以有一个独立的电源供应,以不受PCB噪音的干扰,电源方案,电路由稳定的电源VDD供电 如果使用ADC,VDD的范围必须在2.4V到3.6V之间,否则为2V到3.6V VDD引脚必须连接到带外部稳定电容的VDD电源。(5个100nF的陶瓷电容和一个钽电容(最小值4.7F,典型值10F)VBAT引脚必须被连接到外部电池(1.8V VBAT 3.6V)。如果没有外部电池,这个引脚必须和100nF的陶瓷电容一起连接到VDD电源上 VDDA引脚必须连接到两个外部稳定电容(10nF陶瓷电容+1F钽电容)。VREF+引脚可以连接到VDDA外部电源。如果在VREF+上使用单独的外部参考电压,必须在这个引脚上连接一个10nF 和一个1F的电容。在所有情况下,VREF+必须在2.4V和VDDA之间。,电源方案,齐纳二极管微型集成模块,用于帮助保护敏感电器因感应式尖峰电压、瞬间电压、错误供电和反向偏压导致的危害,EMI滤波器,抑制工频干扰,电源选择跳线,电压模块,3.3V,1.5A,电源方案,数字电源与模拟电源分离,采用电感或磁珠构成无源滤波,抑制数字电路中的高频,数字电源,一般来说:VCC=模拟电源,VDD=数字电源,VSS=数字地VEE=负电源,ADC用模拟电源,每个电源引脚应该并联去耦合的滤波陶瓷电容C(100nF)和钽电容C(10F)。这些电容应该尽可能的靠近电源/地引脚,电源方案,复位,复位目的:将系统强制定位在一个可知状态要求:准确,可靠STM32集成了一个上电复位(POR)和掉电复位(PDR)电路,当供电电压达到2V时系统就能正常工作。只要VDD低于特定的阈值VPOR/PDR,不需要外部复位电路,STM32就一直处于复位模式,复位,当下列事件有一个发生都将产生系统复位:1.NRST引脚上出现低电平(外部复位)2.看门狗计数终止3.软件复位4.低功耗管理复位,复位,低电平复位按键,软件复位,启动配置,启动模式选择 在STM32F10 xxx中,由BOOT1:0引脚决定了三种不同的启动模式,BOOT0,BOOT1,启动配置,STM32F有三种启动方式,当BOOT1:BOOT0=X0(X表示任意)时从User Flash启动;当BOOT1:BOOT0=01时从System Flash启动;BOOT1:BOOT0=11时从SRAM启动,启动配置,通过设置选择管脚,对应到各种启动模式的不同物理地址将被映像到第0块,在经过启动延迟后,CPU从位于0000_0000h开始的启动存储区执行代码,时钟,AMBA总线,片上总线标准种类繁多,而由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。AMBA规范主要包括了AHB(Advanced High performance Bus)系统总线和APB(Advanced Peripheral Bus)外围总线。二者分别适用于高速与相对低速设备的连接。,时钟,主系统由以下部分构成:四个驱动单元:Cortex-M3内核ICode总线(I-bus),DCode总线(D-bus),和系统总线(S-bus)GP-DMA(通用DMA)三个被动单元 内部SRAM 内部闪存存储器 AHB到APB的桥(AHB2APBx),它连接所有的APB设备,时钟,ICode总线该总线将Cortex-M3内核的指令总线与Flash指令接口相连接。指令预取在此总线上完成,DCode总线该总线将Cortex-M3内核的DCode总线与闪存存储器的数据接口相连接(常量加载和调试访问)。,系统总线连接内核的系统总线(外设总线)到总线矩阵,总线矩阵协调着内核和DMA间的访问。,总线矩阵此总线矩阵由三个驱动部件(CPU的DCode、系统总线和DMA总线)和三个被动部件(闪存存储器接口、SRAM和AHB2APB桥)构成。,AHB外设通过总线矩阵与系统总线相连,允许DMA访问,时钟,各总线在不同时钟信号下工作,具有不同速度,两个AHB/APB桥在AHB和2个APB总线间提供同步连接。APB1操作速度限于36MHz,APB2操作于全速(最高72MHz)。,时钟信号来自何处?,时钟,在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。HSI是高速内部时钟,RC振荡器,频率为8MHz。HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟 源,频率范围为4MHz16MHz。,LSI是低速内部时钟,RC振荡器,频率为40kHz。LSE是低速外部时钟,接频率为32.768kHz的石英晶体。PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者 HSE/2。倍频可选择为216倍,但是其输出频率最大不得超过72MHz。,时钟,三种不同的时钟源可被用来驱动系统时钟(SYSCLK):HSI 振荡器时钟 HSE 振荡器时钟 PLL 时钟,时钟,2种二级时钟源:约40kHz 低速内部RC,可以用于驱动独立看门狗和RTC。RTC 用于从停机/待机模式下自动唤醒系统。32.768kHz 低速外部晶体也可用来驱动RTC(RTCCLK)。当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗,时钟,用户可通过多个预分频器配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。AHB和APB2域的最大频率是72MHZ。APB1域的最大允许频率是36MHZ,时钟,ADC时钟由高速APB2时钟经2、4、6或8分频后获得,时钟,定时器时钟频率是其所在APB总线频率的两倍。然而,如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致,HSE 时钟高速外部时钟信号(HSE)由以下两种时钟源产生:HSE 外部晶体/陶瓷谐振器 HSE 用户外部时钟,为了减少时钟输出的失真和缩短启动稳定时间,晶体/陶瓷谐振器和负载电容器必须尽可能地靠近振荡器管脚。,HSE 时钟,外部时钟源(HSE旁路)在这个模式里,必须提供外部时钟。它的频率最高可达25MHz。用户可通过设置在时钟控制寄存器中的HSEBYP和HSEON位来选择这一模式。外部时钟信号(50%占空比的方波、正弦波或三角波)必须连到SOC_IN管脚,同时保证OSC_OUT管脚悬空。,HSE 时钟,外部晶体/陶瓷谐振器(HSE晶体)4-16Mz外部振荡器可为系统提供更为精确的主时钟。(典型值8M)在时钟控制寄存器RCC_CR中的HSERDY位用来指示高速外部振荡器是否稳定。在启动时,直到这一位被硬件置1,时钟才被释放出来。HSE晶体可以通过设置时钟控制寄存器里RCC_CR中的HSEON位被启动和关闭。,HSI 时钟HSI时钟信号由内部8MHZ的RC振荡器产生,它可以直接作为系统时钟或者在2分频后作为PLL输入。HSI RC振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比HSE晶体振荡器短。缺点:即使在校准之后它的时钟频率精度仍较差。如果HSE晶体振荡器失效,HSI时钟会被作为备用时钟源,系统复位后,HSI振荡器被选为系统时钟。,PLL时钟,内部PLL可以用来倍频HSI RC的输出时钟或HSE晶体输出时钟PLL的设置(选择HSI振荡器除2或HSE振荡器为PLL的输入时钟,以及选择倍频因子)必须在其被激活前完成。一旦PLL被激活,这些参数就不能被改动。,PLL时钟,如果需要在应用中使用USB接口,PLL必须被设置为输出48或72MHZ时钟,用于提供48MHz的USBCLK时钟。,LSE 时钟,LSE晶体外部时钟源(LSE旁路),LSE 时钟,LSE晶体一个32.768kHz的低速外部晶体或陶瓷谐振器。它为实时时钟或者其他定时功能提供一个低功耗且精确的时钟源。LSE晶体通过在备份域控制寄存器(RCC_BDCR)启动和关闭。,LSE 时钟,外部时钟源(LSE旁路)在这个模式里必须提供一个32.768kHz频率的外部时钟源。你可以通过设置在备份域控制寄存器(RCC_BDCR)里的LSEBYP和LSEON位来选择这个模式。具有50%占空比的外部时钟信号(方波,正弦波或三角波)必须连到OSC32_IN管脚,同时保证OSC32_OUT管脚悬空。,LSI 时钟,LSI 担当一个低功耗时钟源的角色,它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。LSI时钟频率大约32kHz。LSI 可以通过控制/状态寄存器(RCC_CSR)启动或关闭。,系统时钟(SYSCLK)选择,系统复位后,HSI振荡器被选为系统时钟。当该时钟源被直接或通过PLL间接作为系统时钟时,它将不能被停止。只有当目标时钟源准备就绪了(经过启动稳定阶段的延迟或PLL稳定),从一个时钟源到另一个时钟源的切换才会发生。在被选择时钟源没有就绪时,系统时钟的切换不会发生。直至目标时钟源就绪,才发生切换。在时钟控制寄存器(RCC_CR)里的状态位指示哪个时钟已经准备好了,哪个时钟目前被用作系统时钟。,如果HSE振荡器被直间或间接地作为系统时钟来用的话,(间接的意思是:它被作为PLL输入时钟,并且PLL时钟被作为系统时钟),时钟故障将导致系统时钟自动切换到HSI振荡器,同时外部HSE振荡器被关闭。在时钟失效时,如果HSE振荡器时钟(被分频或未被分频)是用作系统时钟的PLL的输入时钟,PLL也将被关闭,RTC 时钟RTCCLK时钟源可以由HSE/128、LSE或LSI时钟提供。,RTC 时钟,如果LSE 被选为RTC 时钟:只要VBAT 维持供电,尽管VDD 供电被切断,RTC 仍继续工作。如果LSI 被选为自动唤醒单元(AWU)时钟:如果VDD 供电被切断,AWU 状态不能被保证 如果HSE 时钟128 分频后作为RTC 时钟:如果VDD 供电被切断或内部电压调压器被关闭(1.8V 域的供电被切断),RTC 状态不能被保证。,看门狗时钟如果独立看门狗已经由硬件或软件启动,LSI振荡器将被强制在打开状态,并且不能被关闭。在LSI振荡器稳定后,时钟供应给IWDG。,时钟输出,微控制器允许输出时钟信号到外部MCO管脚。以下四个时钟信号可被选作MCO时钟:SYSCLKHSIHSE除2 的PLL 时钟时钟的选择由时钟配置寄存器(RCC_CFGR)中的MCO2:0位控制。,时钟寄存器,1个时钟控制寄存器(RCC_CR):主要用于选择及监测时钟源1个时钟配置寄存器(RCC_CFGR):用于配置时钟的具体参数,如速度,分频等时钟中断寄存器(RCC_CIR):主要用于控制中断使能和监测中断状态APB2 外设复位寄存器(RCC_APB2RSTR)APB1 外设复位寄存器(RCC_APB1RSTR)AHB 外设时钟使能寄存器(RCC_AHBENR)APB2 外设时钟使能寄存器(RCC_APB2ENR)APB1 外设时钟使能寄存器(RCC_APB1ENR)备份域控制寄存器(RCC_BDCR):后备电源供电区的控制控制/状态寄存器(RCC_CSR),时钟控制寄存器(RCC_CR)偏移地址:00h复位值:0000 0083h主要用来使能及监测各种时钟源,typedef struct vu32 CR;vu32 CFGR;vu32 CIR;vu32 APB2RSTR;vu32 APB1RSTR;vu32 AHBENR;vu32 APB2ENR;vu32 APB1ENR;vu32 BDCR;vu32 CSR;RCC_TypeDef;,时钟配置寄存器(RCC_CFGR)偏移地址:04h复位值:0000 0000h访问:0到2个等待周期,字,半字 和字节访问作用:用来配置各种分频设置及选择系统时钟源,例:选择不同的时钟源作为系统时钟源1、设置外部高速晶振时钟源 RCC-CR|=0 x00010000;使能while(!RCC-CR.HSERDY);等待RCC-CFGR=0 x01;选择2、设置外部晶振提供PLL作为系统时钟RCC-CR|=0 x00010000;使能HSEwhile(!RCC-CR.HSERDY);等待RCC-CR|=0 x01000000;使能PLLwhile(!RCC-CR.PLLRDY);等待RCC-CFGR=0 x10;选择PLL,例:设置PLL的时钟为48MHz分析:外部时钟为8M,因此,需要PLL倍频6倍输出RCC-CFGR|=0 x0010 0000,时钟中断寄存器(RCC_CIR)偏移地址:08h复位值:0000 0000h,APB2 外设复位寄存器(RCC_APB2RSTR)偏移地址:0Ch复位值:0000 0000hAPB1 外设复位寄存器(RCC_APB1RSTR)偏移地址:10h复位值:0000 0000hAHB 外设时钟使能寄存器(RCC_AHBENR)偏移地址:14h复位值:0000 0014h,AHB 外设时钟使能寄存器(RCC_AHBENR)偏移地址:14h复位值:0000 0014hAPB2 外设时钟使能寄存器(RCC_APB2ENR)偏移地址:18h复位值:0000 0000h访问:字,半字和字节访问APB1 外设时钟使能寄存器(RCC_APB1ENR)偏移地址:1Ch复位值:0000 0000h,APB2 外设时钟使能寄存器(RCC_APB2ENR),例:使能USART1的时钟RCC-APB2ENR|=0 x4000;同时使能USART1,sp1,TIM1和ADC2的时钟RCC-APB2ENR|=0 x5B00;,备份域控制寄存器(RCC_BDCR)偏移地址:20h复位值:0000 0000h,只能由备份域复位有效复位,控制/状态寄存器(RCC_CSR)偏移地址:24h复位值:0C00 0000h复位标志及低速时钟就绪使能控制,时钟安全系统(CSS)时钟安全系统可以通过软件被激活。一旦其被激活,时钟监测器将在HSE振荡器启动延迟后被使能,并在HSE时钟关闭后关闭。作用:如果HSE时钟发生故障,此振荡器自动地被关闭,时钟失效事件将被送到高级定时器TIM1的断路输入端,并产生时钟安全中断CSSI,允许软件完成营救操作。此CSSI中断被连接到Cortex-M3 NMI的中断。,注意:一旦CSS被激活,并且HSE时钟出现故障,CSS中断就产生,并且NMI也自动产生。NMI将被不断执行,直到CSS中断挂起位被清除。因此,在NMI的处理程序中必须通过设置时钟中断寄存器(RCC_CIR)里的CSSC位来清除CSS中断。如果HSE振荡器被直间或间接地作为系统时钟来用的话,(间接的意思是:它被作为PLL输入时钟,并且PLL时钟被作为系统时钟),时钟故障将导致系统时钟自动切换到HSI振荡器,同时外部HSE振荡器被关闭。在时钟失效时,如果HSE振荡器时钟(被分频或未被分频)是用作系统时钟的PLL的输入时钟,PLL也将被关闭。,RCC库函数,RCC寄存器结构,RCC_TypeDeff,在文件“stm32f10 x_map.h”中定义如下:typedef struct vu32 CR;vu32 CFGR;vu32 CIR;vu32 APB2RSTR;vu32 APB1RSTR;vu32 AHBENR;vu32 APB2ENR;vu32 APB1ENR;vu32 BDCR;vu32 CSR;RCC_TypeDef;,RCC外设声明于文件“stm32f10 x_map.h”:#define PERIPH_BASE(u32)0 x40000000)#define APB1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE(PERIPH_BASE+0 x10000)#define AHBPERIPH_BASE(PERIPH_BASE+0 x20000)#define RCC_BASE(AHBPERIPH_BASE+0 x1000).#ifdef _RCC#define RCC(RCC_TypeDef*)RCC_BASE)#endif/*_RCC*/,RCC库函数,RCC库函数,使用HSE时钟,程序设置时钟参数流程:,1、将RCC寄存器重新设置为默认值 RCC_DeInit;2、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);3、等待外部高速时钟晶振工作 HSEStartUpStatus=RCC_WaitForHSEStartUp();4、设置AHB时钟 RCC_HCLKConfig;5、设置高速APB时钟 RCC_PCLK2Config;6、设置低速APB时钟 RCC_PCLK1Config;7、设置PLL RCC_PLLConfig;8、打开PLL RCC_PLLCmd(ENABLE);9、等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)=RESET)10、设置系统时钟 RCC_SYSCLKConfig;11、判断,直到PLL是系统时钟 while(RCC_GetSYSCLKSource()!=0 x08)12、打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd(),实验三 RCC时钟,主程序:int main(void)#ifdef DEBUG debug();#endif/*Configure the System clock frequency,HCLK,PCLK2 and PCLK1 prescalers*/SetSysClock();,实验三 RCC时钟,void SetSysClock(void)#if defined SYSCLK_HSE SetSysClockToHSE();#elif defined SYSCLK_FREQ_20MHz SetSysClockTo20();#elif defined SYSCLK_FREQ_36MHz SetSysClockTo36();#elif defined SYSCLK_FREQ_48MHz SetSysClockTo48();#elif defined SYSCLK_FREQ_72MHz SetSysClockTo72();#endif/*If none of the define above is enabled,the HSI is used as System clock source(default after reset)*/,/#define SYSCLK_HSE/#define SYSCLK_FREQ_20MHz/#define SYSCLK_FREQ_36MHz/#define SYSCLK_FREQ_48MHz#define SYSCLK_FREQ_72MHz,RCC-CFGR|=0 x001c 0000,实验三 RCC时钟,void SetSysClockTo72(void)/*SYSCLK,HCLK,PCLK2 and PCLK1 configuration-*/*RCC system reset(for debug purpose)*/RCC_DeInit();/*Enable HSE*/RCC_HSEConfig(RCC_HSE_ON);/*Wait till HSE is ready*/HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus=SUCCESS)/*Enable Prefetch Buffer*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*Flash 2 wait state*/FLASH_SetLatency(FLASH_Latency_2);/*HCLK=SYSCLK*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Div1);,void RCC_DeInit(void)/*Set HSION bit*/RCC-CR|=(u32)0 x00000001;/*Reset SW1:0,HPRE3:0,PPRE12:0,PPRE22:0,ADCPRE1:0 and MCO2:0 bits*/RCC-CFGR,实验三 RCC时钟,void SetSysClockTo72(void)/*SYSCLK,HCLK,PCLK2 and PCLK1 configuration-*/*RCC system reset(for debug purpose)*/RCC_DeInit();/*Enable HSE*/RCC_HSEConfig(RCC_HSE_ON);/*Wait till HSE is ready*/HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus=SUCCESS)/*Enable Prefetch Buffer*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*Flash 2 wait state*/FLASH_SetLatency(FLASH_Latency_2);/*HCLK=SYSCLK*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Div1);,void RCC_HSEConfig(u32 RCC_HSE)/*Reset HSEON bit*/RCC-CR,实验三 RCC时钟,实验内容:建立IAR工程,调试RCC配置程序分析程序,理解RCC配置过程更改程序,实现不同时钟尝试不用库函数编写RCC配置程序完成实验报告,