码迷,mamicode.com
首页 > 其他好文 > 详细

STM32的复位和时钟控制(RCC)

时间:2015-02-06 11:05:26      阅读:679      评论:0      收藏:0      [点我收藏+]

标签:

1.1          复位

参考<STM32参考手册>

1.2          stm32的时钟系统

stm32时钟树:

 技术分享

当HSI被用于作为PLL时钟的输入时,SYSCLK的最大频率不得超过64MHz

stm32有以下四种时钟源(内部时钟源起振较快,刚上电时默认使用内部时钟源,外部时钟源叫稳定精确):

高速外部时钟(HSE):外部晶振产生8MHz的时钟,为系统提供更为精确的时钟.

高速内部时钟(HSI):由内部RC振荡器产生,频率为8MHz.

低速外部时钟(LSE):外部晶振产生32.768kHz的时钟,主要为实时时钟(RTC)模块提供低功耗且准确的时钟源.

低速内部时钟(LSI):有内部RC产生,主要供给RTC模块,频率约为40kHz.

1.2.1       以最常见的HSE为例分析

a,左端的OSC_OUT和OSC_IN两个引脚接外部晶振的两端,从这里开始

b,8MHz的时钟进入分频器PLLXTPRE,通过寄存器配置选择对输入的时钟二分频或不分频,这里选择不分频

c,8MHz的时钟遇到开关PLLSRC,可以选择器输出为HSE或HSI,这里选择为HSE.紧接着进入锁相环PLL,这里我们选择倍频因子PULLMUL为9. 经过PLL的时钟称为PLLCLK,此时其频率为72MHz.

d,PLLCLK经过一个SW开关就是STM32的系统时钟(SYSCLK)了. 通过这个开关可以切换SYSCLK的时钟源为HIS,HSE,PLLCLK,我们选择PLLCLK

e,PLLCLK同时还流向了USB预分频,这个分频器输出为USB外设时钟(USBCLK)

f,SYSCLK经过AHB预分频器后,流向FCLK,HCLK,SDIOCLK(SDIO外设的时钟),FSMCCLK(存储器控制器FSMC的时钟)以及APB1和APB2预分频器的输入端,这里设置AHB分频器不分频.

g,GPIO外设挂载在APB2总线上,APB2的时钟是APB2预分频器的输出. 设置APB2预分频器不分频.

由上面的时钟树:

AHB和APB2域的最大频率是72MHz,APB1域的最大频率为36MHz,SDIO接口的时钟频率固定为HCLK/2

AHB时钟经8分频后供给Cortex系统定时器(SysTick)的外部时钟

ADC时钟由高速APB2时钟经2,4,6,8分频后得到

1.2.2       HSE/LSE时钟

HSE和LSE可由以下两种时钟源产生(外部晶体/陶瓷谐振器和外部时钟),V5开发板采用的外部晶体/陶瓷谐振器

 技术分享

外部时钟源(HSE/LSE旁路)

在这个模式里必须提供外部时钟,外部时钟信号连接到OSC_IN,同时OSC_OUT悬空

HSE旁路,其最高频率可达25MHz.通过设置RCC_CR寄存器里的HSEBYP和HSEON位来选择这一模式.

外部晶体/陶瓷谐振器(HSE/LSE晶体)

HSE晶体可产生4-16MHz的时钟,在启动阶段当RCC_CR中的HSERDY位被硬件置1时,HSE时钟信号才被释放出来.可以通过设置RCC_CR中的HSEON来启动和关闭HSE晶体.如果在RCC_CIR中允许产生中断,将会产生相应的中断.

LSE晶体产生32.768kHz的时钟,在启动阶段当RCC_BDCR中的LSERDY被硬件置1时,LSE时钟信号才被释放出来.可以通过设置RCC_BDCR中的LSEON来启动和关闭LSE晶体.如果在RCC_CIR中允许产生中断,将会产生相应的中断.

1.3          RCC寄存器描述

这里只是做简单概括,详细情况请参考<STM32参考手册>

 技术分享

1.3.1       时钟控制寄存器(RCC_CR)

PLLRDY:PLL时钟就绪标志,PLL锁定后由硬件置1(PLL锁定)

PLLON:(1)PLL使能,由软件件置1或清零,当进入停止或待机模式时,由硬件清零

CSSON:(1)如果外部4-25MHz时钟就绪,时钟检测器开启

HSEBYP:(1)外部4-25MHz振荡器被旁路,即不使用外部晶振

HSERDY:(1)外部4-25MHz时钟就绪,由硬件置1.在HSEON位清零后,该位需要6个外部4-25MHz时钟周期清零

HSEON:(1)HSE高速振荡器开启,由软件置1或清零,当进入待机或停止模式时,由硬件清零,当HSE被用作系统时钟时,该位不能被清零

HSIRDY:(1)内部8MHz时钟就绪

HSION:(1)内部8MHz时钟开启,由软件置1或清零,当从待机和停止模式返回或用作系统时钟的HSE时钟发生故障时,硬件置1.

1.3.2       时钟配置寄存器(RCC_CFGR)

USBPRE(USB预分频):(0)PLL时钟1.5分频作为USB时钟,(1)PLL直接作为USB时钟,由软件置1或清零来产生48MHz的时钟,在RCC_APB1ENR寄存器中使能USB之前,需保证该位已经有效

PLLMUL:PLL倍频系数,只有在PLL关闭的情况下才能写入

PLLXTPRE:(1)HSE二分频后进入PLL,只有在PLL关闭时才能写入

PLLSRC:(1)HSE作为PLL输入时钟,(0)HSI时钟二分频后作为PLL输入时钟

ADCPRE(ADC预分频):配置PCLK2经过2,4,6,8,16分频后作为ADC时钟

PPRE2(高速APB预分频):配置HCLK经过1,2,4,8,16分频后作为APB2总线时钟(PCLK2)

PPRE1(低速APB预分频):配置HCLK经过1,2,4,8,16分频后作为APB1总线时钟(PCLK1)

HPRE(AHB预分频):配置SYSCLK经过1,2,4,8,16,64,128,256,512分频

SWS:指示哪个时钟源被作为系统时钟,由硬件置1清零   

SW:选择系统时钟源(HIS,HSE,PLL),当从待机或停止模式返回或直接或间接作为系统时钟的HSE出现故障时,由硬件强制选择HSI作为系统时钟(如果时钟安全系统已被启用)

1.3.3       时钟中断寄存器(RCC_CIR)

CSSC:(1)清除CSSF安全系统中断标志位CSSF (0)无效

PLLRDYC:(1)清除PLL就绪中断标志位PLLRDYF (0)无效

HSERDYC:(1)清除HSE就绪中断标志位HSERDYF (0)无效

HSIRDYC,LSERDYC,LSIRDYC:与上一个类似

PLLRDYIE:(1)PLL就绪中断使能  (0)PLL就绪中断关闭

HSERDYIE,HSIRDYIE,LSERDYIE.LSIRDYIE:与上一个类似

CSSF:外部4-25MHz振荡器时钟出现故障时,由硬件置1,由软件通过置1 CSSC位来清除

PLLRDYF:在PLL就绪且PLLRDYIE位被置1时,由硬件置1,由软件置1 PLLRDYC位来清除

HSERDYF,HSIRDYF,LSERDYF,LSIRDYF:与上一个类似

1.3.4       APB2外设复位寄存器(RCC_APB2RSTR)

AFIORST:(1)复位辅助功能  (0)无作用  软件置1清零

IOPARST,IOPBRST,IOPCRST,IOPDRST,IOPERST,IOPFRST,IOPGRST:(1)复位相应的端口,(0)无作用

TIM1RST,TIM8RST:复位TIMx定时器

USART1RST,SPI1RST,ADC1RST,ADC2RST,ADC3RST:(1)复位相应接口 (0)无作用

1.3.5       APB1外设复位寄存器(RCC_APB1RSTR)

TIM2RST,TIM3RST,TIM4RST,TIM5RST,TIM6RST,TIM7RST:(1)复位相应寄存器 (0)无作用

SPI2RST,SPI3RST,USART2RST,USART3RST,USART4RST,USART5RST,I2C2RST,I2C1RST,USBRST,CANRST

DACRST:(1)复位DAC接口

PWRRST:(1)复位电源接口

BKPRST:(1)复位备份接口

WWDGRST:(1)复位窗口看门狗

1.3.6       AHB外设时钟使能寄存器(RCC_AHBENR)

SDIOEN:(1)SDIO时钟开启,由软件置1清零

FSMCEN:(1)FSMC时钟开启

CRCEN:(1)CRC时钟开启

FLITFEN:(1)睡眠模式时闪存接口电路时钟开启

SRAMEN:睡眠模式时SRAM时钟开启

DMA2EN,DMA1EN:(1)DMAx时钟开启

1.3.7       APB2外设时钟使能寄存器(RCC_APB2ENR)

AFIOEN:(1)辅助功能IO时钟开启

IOPAEN,IOPBEN,IOPCEN,IOPDEN,IOPEEN,IOPFEN,IOPGEN,ADC1EN,ADC2EN,ADC3EN,TIM1EN,TIM8EN,

USART1EN,SPI1EN:相应的接口时钟开启,由软件置1清零

1.3.8       APB1外设时钟使能寄存器(RCC_APB1ENR)

DACEN,PWREN,BKPEN,CANEN,USBEN,I2C2EN,I2C1EN,UART5EN,UART4EN,USART3EN,USART2EN,SPI3EN,

SPI2EN,WWDGEN,TIM7EN-TIM2EN:相应接口时钟开启,由软件置1清零

1.3.9       备份域控制寄存器(RCC_BDCR)

只能由备份域复位有效复位为0x0000 0000

注意:(1)一旦连续对该寄存器访问,等待状态将被插入

(2)该寄存器中的LSEON,LSEBYP,RTCSEL,RTCEN处于备份域,因此这些位在复位后被写保护,只有在电源控制寄存器(PWR_CR)中的DBP位置1后才能对这些位改动,只能由备份域复位或VBAT上电复位.

BDRST:(1)复位整个备份域,软件置1清零

RTCEN:(1)RTC时钟使能  RTCSEL[1:0]:RTC时钟源选择

LSEBYP:(1)LSE时钟被旁路    LSEON  LSERDY:硬件置1

1.3.10    控制/状态寄存器(RCC_CSR)

复位标志位由电源复位清除,其他标志位由系统复位清除;一旦连续对该寄存器进行访问,等待状态将被插入

LPWRRSTF(低功耗复位标志):在低功耗管理复位发生时由硬件置1;由软件通过写RMVF位清除

WWDGRSTF:在窗看门狗复位发生时由硬件置1;由软件写RMVF位清除

IWDGRSTF:独立看门狗复位发生在VDD区域时由硬件置1;由软件写RMVF位清除

SFTRSTF(软件复位标志)  PORRSTF(上电/掉电复位标志)  PINRSTF(NRST管脚复位标志)

RMVF:(1)清除复位标志  (0)无作用

LSION(内部低速振荡器使能)  LSIRDY 硬件置1清零

1.4          开启外设时钟

在开启外设时钟前先配置系统时钟,由SystemInit()函数配置系统时钟

启动文件中,在进入main函数之前调用了SystemInit()函数:

IMPORY SystemInit

LDR R0,=SystemInit

BLX R0

SystemInit()函数在对相应的寄存器进行复位后调用SetSysClock(),然后根据定义了的宏SYSCLK_FREQ_72MHz调用函数SetSysClockTo72()将SYSCLK设置为72MHz(前提是外部时钟源HSE的振荡频率为8MHz)

通过调用RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_CPIOB, ENABLE)来开启GPIOB和GPIOD的外设时钟.

1.5          外设基地址

Cortex-M3有32根地址线,寻址空间为4GB.ARM公司设计时将从0x40000000到0x5fffffff(512MB)的地址分配给片上外设,将片上外设的寄存器映射到这个地址上.称0x40000000为外设基地址

stm32芯片有AHB,APB,APB2总线,挂载在这些总线上的设备有特定的地址范围,在stm32f10x.h中有如下定义:

#define PERIPH_BASE ((uint32_t)0x400000000)

#define APB1PERIPH_BASE       PERIPH_BASE

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)

#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)

STM32的复位和时钟控制(RCC)

标签:

原文地址:http://www.cnblogs.com/zhoutian220/p/4276414.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!