微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32的嵌套中断系统NVIC和RCC详细整理

STM32的嵌套中断系统NVIC和RCC详细整理

时间:11-26 来源:互联网 点击:

设置 AHB 时钟 (HCLK):RCC_HCLKConfig(RCC_SYSCLK_Div1);

设置APB 2时钟(APB2):RCC_PCLK2Config(RCC_HCLK_Div1);
设置APB1时钟(APB1):RCC_PCLK1Config(RCC_HCLK_Div2);

设置 PLL :RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

打开 PLL :RCC_PLLCmd(ENABLE);

等待 PLL 工作:while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET);

设置系统时钟:RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

判断 PLL 是否是系统时钟:while(RCC_GetSYSCLKSource()!= 0x08);

1、使用库函数进行时钟系统初始化配置
voidRCC_config()//如果外部晶振为8M,PLLCLK=SYSCLK=72M,HCLK=72M,//P2CLK=72M,P1CLK=36M,ADCCLK=36M,USBCLK=48M,TIMCLK=72M
{
ErrorStatus HSEStartUpStatus;//定义错误状态变量
RCC_DeInit();//将RCC寄存器重新设置为默认值
RCC_HSEConfig(RCC_HSE_ON);//打开外部高速时钟晶振
HSEStartUpStatus =RCC_WaitForHSEStartUp();//等待外部高速时钟晶振工作
if(HSEStartUpStatus == SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB不分频,HCLK=SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1);//设置APB2不分频,P2CLK=HCLK
RCC_PCLK1Config(RCC_HCLK_Div2);//设置APB1为2分频,P1CLK=HCLK/2
FLASH_SetLatency(FLASH_Latency_2);//设置FLASH代码延时
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能预取指缓存
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//设置PLL时钟源,

//外部时钟不分频,为HSE的9倍频8MHz * 9 =72MHz

RCC_PLLCmd(ENABLE);//使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET);//等待PLL准备就绪
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置PLL为系统时钟源
while(RCC_GetSYSCLKSource() != 0x08);//判断PLL是否是系统时钟
}

}

2、使用寄存器进行RCC时钟初始化配置

voidRCC_init(u8 PLL)//输入PLL的倍频值2—16倍频

//HCLK=PLLCLK=SYSCLK=P2CLK=P1CLK*2=ADCCLK*2=TIMCLK=USBCLK*2/3

{

unsigned char temp=0;

//RCC_DeInit();//将RCC寄存器重新设置为默认值

RCC->CR|=0x00010000;//外部高速时钟使能HSEON

while(!(RCC->CR>>17));//等待外部时钟就绪

RCC->CFGR=0X00000400;//APB1=div2;APB2=div1;AHB=div1;

PLL-=2;//抵消2个单位

RCC->CFGR|=PLL<18;//设置PLL倍频值 2~16

RCC->CFGR|=1<16;//PLL时钟源选择

FLASH->ACR|=0x32;//FLASH 2个延时周期

RCC->CR|=0x01000000;//PLLON

while(!(RCC->CR>>25));//等待PLL锁定

RCC->CFGR|=0x00000002;//PLL作为系统时钟

while(temp!=0x02)//等待PLL作为系统时钟设置成功

{

temp=RCC->CFGR>>2;

temp&=0x03;

}

}

四、相关库函数解析

1、库中所涉及到的结构体

typedef struct

{

uint32_t SYSCLK_Frequency;

uint32_t HCLK_Frequency;

uint32_t PCLK1_Frequency;

uint32_t PCLK2_Frequency;

uint32_t ADCCLK_Frequency;

}RCC_ClocksTypeDef;

2、库函数解析

void RCC_DeInit(void);//将外设RCC寄存器设为缺省值;(除RCC_BDCR和RCC_CSR)

voidRCC_HSEConfig(uint32_t RCC_HSE);//设置外部高速晶振(HSE);

//输入:RCC_HSE_OFF,RCC_HSE_ON,RCC_HSE_Bypass(HSE旁路)

ErrorStatusRCC_WaitForHSEStartUp(void);//等待HSE起振;

//返回值:SUCCESS,HSE晶振稳定且就绪;ERROR,HSE晶振未就绪

voidRCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);//调整内部高速晶振(HSI)校准值

//输入:校准补偿值(该参数取值必须在0到0x1F之间)

voidRCC_HSICmd(FunctionalState NewState);//使能或者失能内部高速晶振(HSI)

//输入:ENABLE或者DISABLE(如果HSI被用于系统时钟,或者FLASH编写操作进行中,那么它不能被停振)

void RCC_PLLConfig(uint32_tRCC_PLLSource, uint32_t RCC_PLLMul);//设置PLL时钟源及倍频系数

//输入:RCC_PLLSource_HSI_Div2,RCC_PLLSource_HSE_Div1,RCC_PLLSource_HSE_Div2

//输入:RCC_PLLMul_2到RCC_PLLMul_16

voidRCC_PLLCmd(FunctionalState NewState);// 使能或者失能PLL

//输入:ENABLE或者DISABLE

#if defined(STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) ||defined (STM32F10X_CL)

void RCC_PREdiv1Config(uint32_tRCC_PREdiv1_Source, uint32_t RCC_PREdiv1_Div);//

#endif

#ifdefSTM32F10X_CL

void RCC_PREdiv2Config(uint32_t RCC_PREdiv2_Div);//

void RCC_PLL2Config(uint32_t RCC_PLL2Mul);//

void RCC_PLL2Cmd(FunctionalState NewState);//

void RCC_PLL3Config(uint

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top