第七章复位和系统时钟.docx

上传人:李司机 文档编号:4367334 上传时间:2023-04-19 格式:DOCX 页数:11 大小:71.20KB
返回 下载 相关 举报
第七章复位和系统时钟.docx_第1页
第1页 / 共11页
第七章复位和系统时钟.docx_第2页
第2页 / 共11页
第七章复位和系统时钟.docx_第3页
第3页 / 共11页
第七章复位和系统时钟.docx_第4页
第4页 / 共11页
第七章复位和系统时钟.docx_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《第七章复位和系统时钟.docx》由会员分享,可在线阅读,更多相关《第七章复位和系统时钟.docx(11页珍藏版)》请在三一办公上搜索。

1、FCLK是Cortex-M3的自由运行时钟.7.2.1 HSE时钟(外部高速时钟)高速外部时钟信号(HSE)由以下两种时钟源产生:HSE外部晶体/陶瓷谐振器HSE用户外部时钟为了减少时钟输出的失真和缩短启动稳定时间,晶体/陶瓷谐振器和负载电容器必须尽可能地靠近振外部时钟源(HSE旁路)在这个模式里,必须提供外部时钟。它的频率最高可达25MHz。用户可通过设置在时钟控制寄存器中的HSEBYP和HSEoN位来选择这一模式。外部时钟信号(50%占空比的方波、正弦波或三角波)必须连到SoCN管脚,同时保证OSCLoUT管脚悬空。见图7-2-2。外部晶体/陶瓷谐振器(HSE晶体)4l6Mz外部振荡器可为

2、系统提供更为精确的主时钟。相关的硬件配置可参考图7-2-2.在时钟控制寄存器RCC-CR中的HSERDY位用来指示高速外部振荡器是否稳定。在启动时,直到这一位被硬件置时钟才被释放出来。如果在时钟中断寄存器RCC_CIR中允许产生中断,将会产生相应中断。HSE晶体可以通过设置时钟控制寄存器里RCC-CR中的HSEON位被启动和关闭。7.2.2 HSl时钟HSI时钟信号由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入。HSIRC振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比HSE晶体振荡器短。然而,即使在校准之后它的时钟频率精度仍较差。校准:制造工艺

3、决定了不同芯片的RC振荡器频率会不同,这就是为什么每个芯片的HSl时钟频率在出厂前已经被ST校准到1%(25。C)的原因。系统复位时,工厂校准值被装载到时钟控制寄存器的HSlCAL7:0位。如果用户的应用基于不同的电压或环境温度,这将会影响RC振荡器的精度。你可以通过利用在时钟控制寄存器里的HSrrRlMl4:0位来调整HSI频率。时钟控制寄存器中的HSIRDY位用来指示HSlRC振荡器是否稳定。在时钟启动过程中,直到这一位被硬件置1,HSlRC输出时钟才被释放。HSIRC可由时钟控制寄存器中的HSlON位来启动和关闭。如果HSE晶体振荡器失效,HSI时钟会被作为备用时钟源。7.2.3 PLL

4、内部PLL可以用来倍频HSlRC的输出时钟或HSE晶体输出时钟。参考图72-1时钟树和时钟控制寄存器。PLL的设置(选择HIS振荡器除2或HSE振荡器为PLL的输入时钟,和选择倍频因子)必须在其被激活前完成。一旦PLL被激活,这些参数就不能被改动。如果PLL中断在时钟中断寄存器里被允许,当PLL准备就绪时,可产生中断申请。如果需要在应用中使用USB接口,PLL必须被设置为输出48或72MHZ时钟,用于提供48MHZ的USBCLK时钟。7.2.4LSE时钟LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。它为实时时钟或者其他定时功能提供一个低功耗且精确的时钟源。LSE晶体通过在备份域

5、控制寄存器(RCC_BDCR)里的LSEON位启动和关闭。在备份域控制寄存器(RCC_BDCR)里的LSERDY指示LSE晶体振荡是否稳定。在启动阶段,直到这个位被硬件置T后,LSE时钟信号才被释放出来。如果在时钟中断寄存器里被允许,可产生中断申请。外部时钟源(LSE旁路)在这个模式里必须提供一个32.768kHz频率的外部时钟源。你可以通过设置在备份域控制寄存器(RCJBDCR)里的LSEBYP和LSEoN位来选择这个模式。具有50%占空比的外部时钟信号(方波、正弦波或三角波)必须连到OSC32JN管脚,同时保证OSC32_OUT管脚悬空。见图7-2-1。7.2.5 LSl时钟LSlRC担当

6、一个低功耗时钟源的角色,它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。LSl时钟频率大约40kHz(在30kHz和60kHz之间)。进一步信息请参考数据手册中有关电气特性部分。LSIRC可以通过控制/状态寄存器(RCC_CSR)里的LSION位来启动或关闭。在控制/状态寄存器(RCCLCSR)里的LSIRDY位指示低速内部振荡器是否稳定。在启动阶段,直到这个位被硬件设置为T后,此时钟才被释放。如果在时钟中断寄存器(RCC_CIR)里被允许,将产生LSl中断中请。注意:只有大容量产品可以进行LS胶准LSI校准:可以通过校准内部低速振荡器LSl来补偿其频率偏移,从而获得精度

7、可接受的RTC时间基数,以及独立看门狗(IWDG)的超时时间(当这些外设以LSI为时钟源)。校准可以通过使用TlM5的输入时钟CnM5JDLK)测量LSl时钟频率实现。测量以HSE的精度为保证,软件可以通过调整RTC的20位预分频器来获得精确的RTC时钟基数,以及通过计算得到精确的独立看门狗(IWDG)的超时时间。LSl校准步骤如下:1. 打开TlM5,设置通道4为输入捕获模式;2. 设置AFleLMAPR的TlM5_CH4_IREMAP位为1,在内部把LSl连接到TlM5的通道4;3. 通过TIM5的捕获/比较4事件或者中断来测量LSI时钟频率;4. 根据测量结果和期望的RTC时间基数和独立

8、看门狗的超时时间,设置20位预分频器。7.2.6 系统时钟(SYSCLK)选择系统复位后,HSl振荡器被选为系统时钟。当时钟源被直接或通过PLL间接作为系统时钟时,它将不能被停止。只有当目标时钟源准备就绪了(经过启动稳定阶段的延迟或PLL稳定),从一个时钟源到另一个时钟源的切换才会发生。在被选择时钟源没有就绪时,系统时钟的切换不会发生。直至目标时钟源就绪,才发生切换。在时钟控制寄存器(RCCLCR)里的状态位指示哪个时钟己经准备好了,哪个时钟目前被用作系统时钟。7.2.7 时钟安全系统(CSS)时钟安全系统可以通过软件被激活。一旦其被激活,时钟监测器将在HSE振荡器启动延迟后被使能,并在HSE

9、时钟关闭后关闭。如果HSE时钟发生故障,HSE振荡器被自动关闭,时钟失效事件将被送到高级定时器TlMl的刹车输入端,并产生时钟安全中断CSSL允许软件完成营救操作。此CSSl中断连接到CorteXTM-M3的NMl中断。注意:一旦CSS被激活,并且HSE时钟出现故障,CSSIl断就产生,并且MV也自动产生。NM胳被不断执行,直到CSS中断挂起位被清除。因此,在MVf/的处理程序中必须通过设置时钟中断寄存器但CCLC/可里的CSSC位来清除CSS中断。如果HSE振荡器被直间或间接地作为系统时钟,(间接的意思是:它被作为PLL输入时钟,并且PLL时钟被作为系统时钟),时钟故障将导致系统时钟自动切换

10、到HSl振荡器,同时外部HSE振荡器被关闭。在时钟失效时,如果HSE振荡器时钟(被分频或未被分频)是用作系统时钟的PLL的输入时钟,PLL也将被关闭。7.2.8 RTC时钟通过设置备份域控制寄存器(RCjBDCR)里的RTCSEL1:0位,RTCCLK时钟源可以由HSE/128、LSE或LSl时钟提供。除非备份域复位,此选择不能被改变。LSE时钟在备份域里,但HSE和LSl时钟不是。因此:如果LSE被选为RTC时钟:只要VBAT维持供电,尽管VDD供电被切断,RTe仍继续工作。如果LSl被选为自动唤醒单元(AWU)时钟:详见7.2.5节LSl时钟。如果VDD供电被切断,AWU状态不能被保证。如

11、果HSE时钟128分频后作为RTC时钟:如果VDD供电被切断或内部电压调压器被关闭(1.8V域的供电被切断),则RTC状态不确定。7.2.9 看门狗时钟如果独立看门狗已经由硬件选项或软件启动,LSl振荡器将被强制在打开状态,并且不能被关闭。在LSl振荡器稳定后,时钟供应给IWDG。7.2.10 时钟输出微控制器允许输出时钟信号到外部MCo管脚。相应的GPIO端口寄存器必须被配置为相应功能。以下四个时钟信号可被选作MCo时钟:SYSCLKHSIHSE除2的PLL时钟被调用函数无表7417RCC_PCLK2值RCC_PCLK2描述RCC_HCLK_Div1APB2时钟=HCLKRCC_HCLK_D

12、iv2APB2时钟=HCLK/2RCC_HCLK_Div4APB2时钟=HCLK/4RCC_HCLK_Div8APB2时钟=HCLK/8RCC_HCLK_Div16APB2时钟=HCLK/16例:/*设定PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Divl);7.4.11 函数RCJUSBCLKCOnfig表7-4-18描述了函数RCCJJSBCLKeonfig函数名RCC_USBCLKConfig函数原形voidRCC_USBCLKConfig(u32RCC_USBCLKSource)功能描述设置USB时钟(USBCLK)输入参数HCLK)RCC_USBCLKS

13、ource:定义USBCLK,该时钟源自PLL输出输出参数无返回值无先决条件无被调用函数无RCC_USBCLKSource:该参数设置了USB时钟(USBCLK),表7419给出了该参数可取的值表7-4-19RCCJjSBCLKSource值RCC_USBCLKSource描述RCC_USBCLKSource_PLLCLK_1Div5USB时钟=PLL时钟除以1.5RCC_USBCLKSource_PLLCLK_Div1USB时钟=PLL时钟例:*PLL时钟除以1.5作为USB时钟源*/RCjUSBCLKConfig(RCC_USBCLKSource_PLLCLK_lDiv5);7.4.12

14、函数RCC_ADCCLKConfig表7-4-20描述了函数RCC_ADCCLKConfig函数名RCC_ADCCLKConfig函数原形voidADC_ADCCLKConfig(u32RCC_ADCCLKSource)功能描述设置ADC时钟(ADCCLK)输入参数RCC,ADCCLKSource:定义ADCCLK,该时钟源自APB2时钟(PCLK2)输出参数无返回值无先决条件无被调用函数无RCC_ADCCLKSource:该参数设置了ADC时钟(ADCCLK),表7-4-21给出了该参数可取的值。表7-421RCC-ADCCLKSource值RCC_ADCCLKSource描述RCC_PCL

15、K2_Div2ADC时钟=PCLK/2RCC_PCLK2_Div4ADe时钟=PCLK/4RCC_PCLK2_Div6ADC时钟=PCLK/6RCC_PCLK2_Div8ADC时钟=PCLK/8例:/*设置ADC时钟为APB2时钟的1/2*/RCC.ADCCLKConfig(RCC_PCLK2_Div2);7.4.13 函数RCC_LSEConfig表7-4-22描述了函数ReJLSEeonfig函数名RCC_LSEConfig函数原形voidRCC_LSEConfig(u32RCC_HSE)功能描述设置外部低速晶振(LSE输入参数RCC_LSE:LSE的新状态输出参数无返回值无先决条件无被调

16、用函数无RCC_LSE:该参数设置了HSE的状态(见表7-4-23.)。表7-4-23RCC_LSE定义RCC_LSE描述RCC_LSE_OFFLSE晶振OFFRCC_LSE_ONLSE晶振ONRCC_LSE_BypassLSE晶振被外部时钟旁路例:/*使能外部低速晶振LSE/RCC.LSEConfig(RCC_LSE_0N);7.4.14 函数RCC-RTCCLKConfig表7424描述了函数RejRTCCLKConfig函数名RCC-RTCCLKConfig函数原形voidRCC_RTCCLKConfig(u32RCC_RTCCLKSource)功能描述设置RTC时钟(RTCCLK)输入

17、参数RCC_RTCCLKSource:定义RTCCLK输出参数无返回值无先决条件RTC时钟一经选定即不能更改,除非复位后备域被调用函数无RCC_RTCCLKSource:该参数设置了RTC时钟(RTCCLK),表7-4-25给出了该参数可取的值。表7425RCjRTCCLKSOUrCe值RCC_RTCCLKSource描述RCC_RTCCLKSource_LSE选择LSE作为RTC时钟RCC_RTCCLKSource_LSI选择LSl作为RTC时钟RCC_RTCCLKSource_HSE_Div128选择HSE时钟频率除以128作为RTC时钟例:/*选择LSE作为RTC时钟*/RCCRTCCL

18、KConfig(RCCRTCCLKSourceLSE);7.4.15 函数RCjRTCCLKCmd表7-4-26描述了函数RecLRTCCLKCmd函数名RCC_RTCCLKCmd函数原形voidRCC_RTCCLKCmd(FunctionalStateNewState)功能描述使能或者失能RTC时钟输入参数NewState:RTC时钟的新状态这个参数可以取:ENABLE或者DISABLE输出参数无返回值无先决条件该函数只有在通过函数RCjRTCCLKComig选择RTC时钟后,才能调用被调用函数无例:/*使能RTC时钟*/RCCRTCCLKCmd(ENABLE);7.4.16 函数RCC_A

19、HBPeriphClockCmd表7-4-27描述了函数RCeLAHBPeriPhClOCkCmd函数名RCC_AHBPeriphClockCmd函数原形voidRCC_AHBPeriphClockCmd(u32RCC_AHBPeriph,FunctionaIStateNewState)功能描述使能或者失能AHB外设时钟输入参数1RCC_AHBPeriph:门控AHB外设时钟输入参数2NewState:指定外设时钟的新状态,这个参数可以取:ENABLE或者DISABLE输出参数无返回值无先决条件无被调用函数无RCC_AHBPeriph:该参数被门控的AHB外设时钟,可以取表7-4-27的一个或

20、者多个取值的组合作为该参垢的值。表7428RCC_AHBPeriphffldRCC_AHBPeriph描述RCC_AHBPeriph_DMADMA时钟RCC_AHBPeriph_SRAMSRAM时钟RCC_AHBPeriph_FLITFFLITF时钟LSRAM和FlJTF时钟只能在睡眠(SLEEP)模式下被失能。例:/*使能DMA时钟*/RCCjHBPeriphClockCmd(RCJAHBPeripkDMA);7.4.17 函数RCJAPB2PeriphClockCmd表7-4-29描述了函数RCCLAPB2PeriphClockCmd函数名RCC_APB2PeriphClockCmd函数原

21、形voidRCC_APB2PeriphClockCmd(u32RCJAPB2Periph,FunctionaIStateNewState)功能描述RCeLAPB2Periph:门控APB2夕卜设时钟输入参数1HCLK)RCC_USBCLKSource:定义USBCLK,该时钟源自PLL输出输入参数2NewState:指定外设时钟的新状态,这个参数可以取:ENABLE或者DISABLE输出参数无返回值无先决条件无被调用函数无该参数被门控的APB2外设时钟,可以取表7-4-30中的一个或者多个取值的组合作为该参数的值。#7-4-30RCC_AHB2PeriphffiRCC_AHB2Periph描述

22、RCC_APB2Periph_AFIO功能复用Q时钟RCC_APB2Periph_GPIOAGPlOA时钟RCC_APB2Periph_GPIOBGPIOB时钟RCC_APB2Periph_GPIOCGPloC时钟RCC_APB2Periph_GPIODGPloD时钟RCC_APB2Periph_GPIOEGPIOE时钟RCC_APB2Periph_GPIOFGPIOF时钟RCC_APB2Periph_GPIOGGPIoG时钟RCC_APB2Periph_ADC1ADCl时钟RCC_APB2Periph_ADC2ADC2时钟RCC_APB2Periph_TIM1TlMl时钟RCC_APB2Pe

23、riph_SPI1SPll时钟RCC_APB2Periph_TIM8TIM8时钟RCC_APB2Periph_USART1USARTl时钟RCC_APB2Periph_ADC3ADC3时钟RCC_APB2Periph_ALL全部APB2外设时钟例:/*使能GPIOA,GPIOB和SPIl时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPI0A|RCC_APB2Periph_GPI0B|RCC_APB2Periph_SPIl,ENABLE);7.4.18 函数RCC_APB1PeriphCIockCmd表7-4-31描之&了函数RCJAPBlPeriphCI

24、ockCmd函数名RCC_APB1PeriphCIockCmd函数原形voidRCC_APBlPeriphClockCmd(u32RCC_APB1Periph,FunctionalStateNewState)功能描述使能或者失能APBI外设时钟输入参数1RCCLAPBlPeriPh:门控APBI夕卜设时钟输入参数2NewState:指定外设时钟的新状态这个参数可以取:ENABLE或者DISABLE输出参数无返回值无先决条件无被调用函数无RCC_APB1Periph:该参数被门控的APBl外设时钟,可以取表7-4-32中的一个或者多个取值的组合作有该参数的值。表7432ReJAHBlPeriPh

25、gRCC_AHB1Periph描述RCC_APB1Periph_TIM2TIM2时钟RCC_APB1Periph_TIM3TIM3时钟RCC_APB1Periph_TIM4TlM4时钟RCC_APB1Periph_TIM5TIM5时钟RCC_APB1Periph_TIM6TlM6时钟RCC_APB1Periph_TIM7TlM7时钟RCC_APB1Periph_WWDGWWDG时钟RCC_APB1Periph_SPI2SPI2时钟RCCLAPBlPeriph_SPI3SPI3时钟RCC_APB1Periph_USART2USART2时钟RCC_APB1Periph_USART3USART3时钟

26、RCC_APB1Periph_USART4USART4时钟RCC_APB1Periph_USART5USART5时钟RCC_APB1Periph_l2C112Cl时钟RCC_APB1Periph_l2C2I2C2时钟RCC_APB1Periph_USBUSB时钟RCC_APB1Periph_CANCAN时钟RCC_APB1Periph_BKPBKP时钟RCC_APB1Periph_PWRPWR时钟RCC_APB1Periph.DACDAC时钟RCC_APB1Periph_ALL全部APBl外设时钟例:/*使能BKP和PWR时钟/RCC_APBlPeriphClockCmd(RCC_APBlPe

27、riph_BKPRCC_APBlPeriph_PWR,ENABLE);7.4.19 函数RCC-GetFIagStatus表7-4-33.描述了函数RCC_GetFIagStatus函数名GetFIagStatus函数原形FIagStatusRCC_GetFlagStatus(u8RCC_FLAG)功能描述检查指定的RCC标志位设置与否输入参数1RCeLAPBlPeriPh:门控APBl外设时钟输入参数2NewState:指定外设时钟的新状态这个参数可以取:ENABLE或者DlSABLE输出参数无返回值RCjFLAG的新状态(SET或者RESET先决条件无被调用函数无表7434给出了所有可以被

28、函数RCJGetFIagStatLIS检查的标志位RCjFLAG的列表表7-4-34RCC_FLAG的值RCC_FLAG描述RCeLFLAG_HSIRDYHSl晶振就绪RCC_FLAG_HSERDYHSE晶振就绪RCC_FLAG_PLLRDYPLL就绪RCC_FLAG_LSERDYLSl晶振就绪RCC_FLAG_LSIRDYLSE晶振就绪RCC_FLAG_PINRST管脚复位RCC_FLAG_PORRSTPC)R/PDR复位RCC_FLAG_SFTRST软件复位RCC_FLAG_IWDGRSTIWDG复位RCC_FLAG_WWDGRSTWWDG复位RCC_FLAG_LPWRRST低功耗复位例:

29、/*检查PLL时钟是否准备就绪/FlagStatusStatus;Status=RCCGetFlagStatus(RCCFLAGPLLRDY);if(Status=RESET)else)7.5系统时钟的建立系统时钟建立,是系统运行的基础,系统所有的运行都是建立在时钟的正常运行上的。没有稳健的系统时钟,就不可能有一个稳定的系统。7.5.1 如何建立时钟系统复位后,首先使用内部的RC时钟源。由于内部时钟源的精确度不高和不能倍频到较高的频率,在实际的使用中,系统一般使用外部高速晶振作为系统时钟的来源。使用外部高速晶振,可以使系统得到一个非常精确地时钟源,并且可以通过倍频器使系统时钟达到更高的速度。在

30、系统中,复位后首要的任务是建立系统时钟,下面是建立系统时钟的步骤:1将所有的RCC外设寄存器重设为缺省值:2启用外部高速晶振;3等待,直到外部高速晶振稳定;4设置预取指缓存使能和代码延时值;5设置AHB时钟(HCLK)等于系统时钟;6设置高速APB2时钟(PCLK2)为系统时钟;7设置低速APBI时钟(PCLKl)为系统时钟的1/2。APB2时钟最高为36MHZ;8设置PLL时钟源及倍频系数,使能PLL。经过PLL倍频后最高时钟只能72MHz;9等待PLL初始化成功;10设置PLL为系统时钟源;11等待PLL成功作为系统时钟源。经过这些步骤后,系统时钟就建立起来了。7.5.2 实例代码系统时钟

31、的实例代码如下:ErrorStatusHSEStartUpStatus;将外设RCC寄存器重设为缺省值RCC-DeInitO;设置外部高速晶振(HSE)RCC-HSEConfig(RCC-HSE-ON);等待HSE起振HSEStartUpStatus=RCC.WaitForHSEStartUp();if(HSEStartUpStatus=SUCCESS)预取指缓存使能FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);设置代码延时值,FLASH_Latency_22延时周期FLASH_SetLatency(FLASH_Latency_2);

32、设置AHB时钟(HCLK)/RCC_SYSCLK_DivlAHB时钟=系统时钟RCC_HCLKConfig(RCC_SYSCLK_DivI);/设置高速AHB时钟(PCLK2)/RCC_HCLK_DivlAPB时钟=HCLKRCC_PCLK2Config(RCC_HCLK_Div1);设置低速AHB时钟(PCLKl)/RCC_HCLK_Div2APBl时钟=HCLK/2RCC_PCLK1Config(RCC_HCLK_Div2);/PLLCLK=8MHz*9=72MHz设置PLL时钟源及倍频系数RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);使能或者失能PLLRCC-PLLCmd(ENABLE);/等待指定的RCC标志位设置成功等待PLL初始化成功While(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)=RESET)/设置系统时钟(SYSCLK)设置PLL为系统时钟源RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);等待PLL成功用作于系统时钟的时钟源/0x00:HSI作为系统时钟/0x04:HSE作为系统时钟/0x08:PLL作为系统时钟while(RCC.GetSYSCLKSource()!=0x08)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号