STM32学习笔记(关于时钟)_第1页
STM32学习笔记(关于时钟)_第2页
STM32学习笔记(关于时钟)_第3页
STM32学习笔记(关于时钟)_第4页
STM32学习笔记(关于时钟)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、STM32学习-时钟(转载)在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。、HSI是高速内部时钟,RC振荡器,频率为8MHz。、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz16MHz。HSE/LSE时钟源、LSI是低速内部时钟,RC振荡器,频率为40kHz。、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为216倍,但是其输出频率最大不得超过72MHz。其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟R

2、TC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。RTC的时钟源通过RTCSEL1:0来选择。STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI或

3、者HSE。系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用:、送给AHB总线、内核、内存和DMA使用的HCLK时钟。、通过8分频后送给Cortex的系统定时器时钟。、直接送给Cortex的空闲运行时钟FCLK。、送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。、送给A

4、PB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。在以上的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。当需要使用某模块时,记得一定要先使能对应的时钟。需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。连接在APB1(低

5、速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。USB模块工作的时钟应该是由APB1提供的。连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PAPE)、第二功能IO口。下图为STM32芯片的时钟结构图。从图中可以直观的看出STM32的时钟封装。 STM32芯片时钟配置2009-12-26

6、 11:44 对STM32进行软件开发时,最基本的就是对STM32芯片进行时钟和端口配置,然后是对项目所用到的片上资源进行配置并驱动,下面给出时钟和端口配置代码,该代码几乎涵盖了片上所有时钟和端口配置项目,可根据自己需要进行删除不必要的配置项: /* Function Name : RCC_Configuration 复位时钟控制配置* Description : Configures the different system clocks.* Input : None* Output : None* Return : None*/void RCC_Configuration(void)/*

7、system clocks configuration -系统时钟配置-*/* RCC system reset(for debug purpose) */RCC_DeInit(); /将外设RCC寄存器重设为缺省值/* Enable HSE */RCC_HSEConfig(RCC_HSE_ON); /开启外部高速晶振(HSE)/* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /等待HSE起振if(HSEStartUpStatus = SUCCESS) /若成功起振,(下面为系统总线时钟设置) /*

8、 Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /使能FLASH预取指缓存 /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); /设置FLASH存储器延时时钟周期数(根据不同的系统时钟选取不同的值) /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /设置AHB时钟=72 MHz /* PCLK2 = HCLK/2 */ RCC_PCLK2Config(RCC

9、_HCLK_Div2); /设置APB1时钟=36 MHz(APB1时钟最大值) /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div1); /设置APB2时钟=72 MHz /* Configure ADCCLK such as ADCCLK = PCLK2/2 */ RCC_ADCCLKConfig(RCC_PCLK2_Div2); /RCC_PCLK2_Div2,4,6,8 /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

10、 /PLL必须在其激活前完成配置(设置PLL时钟源及倍频系数) /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET) /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCL

11、KSource() != 0x08) /* Enable peripheral clocks -外设时钟使能-*/ /* Enable AHB peripheral clocks -AHB外设时钟使能-*/* Enable DMA clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/使能DMA时钟/* Enable SRAM clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SRAM, ENABLE);/使能SRAM时钟/* Enable FLITF clock */ RCC_AHBPe

12、riphClockCmd(RCC_AHBPeriph_FLITF, ENABLE);/使能FLITF时钟/* Enable APB1 peripheral clocks -APB1外设时钟使能-*/* TIM2,3,4 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);/使能TIM2时钟 if (APB1 prescaler=1) x1/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);/使能TIM3时钟 else x2/ RCC_APB1PeriphC

13、lockCmd(RCC_APB1Periph_TIM4, ENABLE);/使能TIM4时钟/* WWDG clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);/使能WWDG时钟/* Enable SPI2 clocks */ RCC_APB1PeriphClockCmd(RCC_APB2Periph_SPI2, ENABLE);/使能SPI2时钟/* USART2,3 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);/

14、使能USART2时钟(对应万利开发板上的USART1)/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);/使能USART3时钟(万利开发板上未接该串口)/* I2C1,2 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);/使能I2C1时钟/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);/使能I2C2时钟/* USB clock enable / PLL clock divided by

15、1.5 used as USB clock source */ / RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); /根据不同PLLCLK选择分频比,必须确保USBCLK始终是48MHz / RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);/使能USB时钟/* CAN clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);/使能CAN时钟/* BKP clock enable */ RCC_APB1PeriphC

16、lockCmd(RCC_APB1Periph_BKP, ENABLE);/使能BKP时钟/* PWR clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);/使能PWR时钟/* APB1Periph_ALL clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL, ENABLE);/使能APB1Periph_ALL时钟 /* Enable APB2 peripheral clocks -APB2外设时钟使能-*/* Enable GPIOA,B,C,D,E

17、 clocks */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/使能GPIOA时钟/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);/使能GPIOB时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);/使能GPIOC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);/使能GPIOD时钟/ RCC_APB2PeriphClockCmd(RCC_APB2Per

18、iph_GPIOE, ENABLE);/使能GPIOE时钟/* AFIO clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);/使能AFIO时钟/* Enable ADC1,2clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);/使能ADC1时钟/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);/使能ADC2时钟/* TIM1 clock enable */ RCC_APB2Periph

19、ClockCmd(RCC_APB2Periph_TIM1, ENABLE);/使能TIM1时钟/* Enable SPI1 clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);/使能SPI1时钟/* USART1 clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);/使能USART1时钟(对应万利开发板上的USART0)/* APB1Periph_ALL clock enable */ RCC_APB2PeriphClockCmd(RCC

20、_APB2Periph_ALL, ENABLE);/使能APB2Periph_ALL时钟/* Enable no peripheral clocks -非总线上外设时钟配置-*/* Enable Internal High Speed oscillator */ /RCC_HSICmd(ENABLE); /* Enable the Internal Low Speed oscillator */ /RCC_LSICmd(ENABLE); /给IWDG提供时钟信号(如果IWDG运行的话,LSI不能被失能) /* Configure RTCCLK such as ADCCLK = PCLK2/2

21、*/ / RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);/* Select the LSE as RTC clock source */ / RCC_RTCCLKCmd(ENABLE);/* Enable the RTC clock */ /* Enable the Clock Security System */ /RCC_ClockSecuritySystemCmd(ENABLE); /* Output PLL clock divided by 2 on MCO pin */ /RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);/ 警告:

22、当选中系统时钟作为MCO管脚的输出时,注意它的时钟频率不超过50MHz(最大I/O速率)。 在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。2)对于少于100脚的产品,有2种接法: 2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。 2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出0。此方法可以减小功耗并(相对上面2.1)节省2个外部电阻。使用HSE时钟,

23、程序设置时钟参数流程:1、将RCC寄存器重新设置为默认值 RCC_DeInit;2、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);3、等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp();4、设置AHB时钟 RCC_HCLKConfig;5、设置高速AHB时钟 RCC_PCLK2Config;6、设置低速速AHB时钟 RCC_PCLK1Config;7、设置PLL RCC_PLLConfig;8、打开PLL RCC_PLLCmd(ENABLE);9、等待PLL工作 while(RCC_GetFlagSt

24、atus(RCC_FLAG_PLLRDY) = RESET) 10、设置系统时钟 RCC_SYSCLKConfig;11、判断是否PLL是系统时钟 while(RCC_GetSYSCLKSource() != 0x08)12、打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()下面是TM32软件固件库的程序中对RCC的配置函数(使用外部8MHz晶振)/* Function Name: RCC_Configuration * Description :RCC配置(使用外部8MHz晶振)* Input : 无* Output :

25、无* Return : 无*/void RCC_Configuration(void)/*将外设RCC寄存器重设为缺省值 */RCC_DeInit();/*设置外部高速晶振(HSE)*/RCC_HSEConfig(RCC_HSE_ON); /RCC_HSE_ONHSE晶振打开(ON)/*等待HSE起振*/HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus = SUCCESS) /SUCCESS:HSE晶振稳定且就绪 /*设置AHB时钟(HCLK)*/ RCC_HCLKConfig(RCC_SYSCLK_Div1);/RC

26、C_SYSCLK_Div1AHB时钟 = 系统时钟 /* 设置高速AHB时钟(PCLK2)*/ RCC_PCLK2Config(RCC_HCLK_Div1); /RCC_HCLK_Div1APB2时钟 = HCLK /*设置低速AHB时钟(PCLK1)*/ RCC_PCLK1Config(RCC_HCLK_Div2); /RCC_HCLK_Div2APB1时钟 = HCLK / 2 /*设置FLASH存储器延时时钟周期数*/ FLASH_SetLatency(FLASH_Latency_2); /FLASH_Latency_22延时周期 /*选择FLASH预取指缓存的模式*/ FLASH_Pr

27、efetchBufferCmd(FLASH_PrefetchBuffer_Enable); / 预取指缓存使能 /*设置PLL时钟源及倍频系数*/ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); / PLL的输入时钟 = HSE时钟频率;RCC_PLLMul_9PLL输入时钟x 9/*使能PLL */ RCC_PLLCmd(ENABLE); /*检查指定的RCC标志位(PLL准备好标志)设置与否*/ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET) /*设置系统时钟(SYSCLK) */

28、 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /RCC_SYSCLKSource_PLLCLK选择PLL作为系统时钟 /* PLL返回用作系统时钟的时钟源*/ while(RCC_GetSYSCLKSource() != 0x08) /0x08:PLL作为系统时钟 /*使能或者失能APB2外设时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC , ENABLE); /RCC_APB2Periph_GPIOA GPIO

29、A时钟/RCC_APB2Periph_GPIOB GPIOB时钟/RCC_APB2Periph_GPIOC GPIOC时钟/RCC_APB2Periph_GPIOD GPIOD时钟系统时钟函数,要设置系统使用哪个晶振工作。*/voidRCC_Configuration(void)RCC_DeInit();/将外设RCC寄存器重设为缺省值RCC_HSEConfig(RCC_HSE_ON);/*设置外部高速晶振(HSE)这里是设置高速晶振打开,其实一共有三种设置RCC_HSE_OFFHSE晶振OFFRCC_HSE_ONHSE晶振ONRCC_HSE_BypassHSE晶振使用外部时钟源。*/HSES

30、tartUpStatus=RCC_WaitForHSEStartUp();/等待HSE起振if(HSEStartUpStatus=SUCCESS)/等主晶振起振成功起振后执行操作FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*预取指缓存使能FLASH_PrefetchBuffer用来选择FLASH预取指缓存的模式。如果需关闭则使用FLASH_PrefetchBuffer_Disable*/FLASH_SetLatency(FLASH_Latency_2);/*设置代码延时值FLASH_Latency用来设置FLASH存储器延时时钟周

31、期数。FLASH_Latency_22为延时周期可以使用以下参数FLASH_Latency_00延时周期FLASH_Latency_11延时周期FLASH_Latency_22延时周期*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*设置AHB时钟(HCLK)RCC_SYSCLK_Div1AHB时钟=系统时钟RCC_SYSCLK_Div2AHB时钟=系统时钟/2RCC_SYSCLK_Div4AHB时钟=系统时钟/4RCC_SYSCLK_Div8AHB时钟=系统时钟/8RCC_SYSCLK_Div16AHB时钟=系统时钟/16RCC_SYSCLK_Div64AHB时钟=系统

32、时钟/64RCC_SYSCLK_Div128AHB时钟=系统时钟/128RCC_SYSCLK_Div256AHB时钟=系统时钟/256RCC_SYSCLK_Div512AHB时钟=系统时钟/512*/RCC_PCLK2Config(RCC_HCLK_Div2);/*设置高速AHB时钟(PCLK2)RCC_HCLK_Div2APB1时钟=HCLK/2RCC_HCLK_Div1APB2时钟=HCLKRCC_HCLK_Div2APB2时钟=HCLK/2RCC_HCLK_Div4APB2时钟=HCLK/4RCC_HCLK_Div8APB2时钟=HCLK/8RCC_HCLK_Div16APB2时钟=HC

33、LK/16*/RCC_PCLK1Config(RCC_HCLK_Div2);/*设置低速AHB时钟(PCLK1)RCC_HCLK_Div2APB1时钟=HCLK/2RCC_HCLK_Div1APB1时钟=HCLKRCC_HCLK_Div2APB1时钟=HCLK/2RCC_HCLK_Div4APB1时钟=HCLK/4RCC_HCLK_Div8APB1时钟=HCLK/8RCC_HCLK_Div16APB1时钟=HCLK/16用户可通过多个预分频器配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。AHB和APB2域的最大频率是72MHZ?PB1域的最大允许频率是36MHZ。SDIO

34、接口的时钟频率固定为HCLK/2。RCC通过AHB时钟8分频后供给Cortex系统定时器的(SysTick)外部时钟。通过对SysTick控制与状态寄存器的设置,可选择上述时钟或CortexAHB时钟作为SysTick时钟。ADC时钟由高速APB2时钟经2、4、6或8分频后获得。*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);/*PLLCLK=8MHz*9=72MHz设置PLL时钟源及倍频系数RCC_PLLSource描述RCC_PLLSource_HSI_Div2PLL的输入时钟=HSI时钟频率除以2RCC_PLLSource_HSE

35、_Div1PLL的输入时钟=HSE时钟频率RCC_PLLSource_HSE_Div2PLL的输入时钟=HSE时钟频率除以2RCC_PLLMul描述RCC_PLLMul_2PLL输入时钟x2RCC_PLLMul_3PLL输入时钟x3RCC_PLLMul_4PLL输入时钟x4RCC_PLLMul_5PLL输入时钟x5RCC_PLLMul_6PLL输入时钟x6RCC_PLLMul_7PLL输入时钟x7RCC_PLLMul_8PLL输入时钟x8RCC_PLLMul_9PLL输入时钟x9RCC_PLLMul_10PLL输入时钟x10RCC_PLLMul_11PLL输入时钟x11RCC_PLLMul_1

36、2PLL输入时钟x12RCC_PLLMul_13PLL输入时钟x13RCC_PLLMul_14PLL输入时钟x14RCC_PLLMul_15PLL输入时钟x15RCC_PLLMul_16PLL输入时钟x16警告:必须正确设置软件,使PLL输出时钟频率不超过72MHz当HSI被用于作为PLL时钟的输入时,系统时钟的最大频率不得超过64MHz。*/RCC_PLLCmd(ENABLE);/使能或者失能PLL,关闭使用DISABLEwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)=RESET)/等待指定的RCC标志位设置成功等待PLL初始化成功/*RCC_FLAG值RC

37、C_FLAG描述RCC_FLAG_HSIRDYHSI晶振就绪RCC_FLAG_HSERDYHSE晶振就绪RCC_FLAG_PLLRDYPLL就绪RCC_FLAG_LSERDYLSI晶振就绪RCC_FLAG_LSIRDYLSE晶振就绪RCC_FLAG_PINRST管脚复位RCC_FLAG_PORRSTPOR/PDR复位RCC_FLAG_SFTRST软件复位RCC_FLAG_IWDGRSTIWDG复位RCC_FLAG_WWDGRSTWWDG复位*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*设置系统时钟(SYSCLK)设置PLL为系统时钟?RCC_SYSCLKSource描述RCC_SYSCLKSource_HSI选择HSI作为系统时钟RCC_SYSCLKSource_HSE选择HSE作为系统时钟RCC_SYSCLKSource_PLLCLK选择PLL作为系统时钟?*/?while(RCC_GetSYSCLKSource()!=0x08)/*等待PLL成功用作于系统时钟的时钟源返回用作系统时钟的时钟源

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论