您的位置 首页 传感器

STM32学习笔记——RCC体系时钟装备

学习RCC的配置方法,以后可以直接用includestm32f10x_libhdefineSYSCLK_HSEdefineSYSCLK_FREQ_20MHzdefineSYSCLK_FREQ_36MH

//学习RCC的装备办法,今后可以直接用

#include“stm32f10x_lib.h”

//#defineSYSCLK_HSE

//#defineSYSCLK_FREQ_20MHz

//#defineSYSCLK_FREQ_36MHz//36MH作业

//#defineSYSCLK_FREQ_48MHz//48MH作业经过宏界说改动体系时钟频率

#defineSYSCLK_FREQ_72MHz//作业72MH

#defineDELAY_COUNT0xFFFFF

GPIO_InitTypeDefGPIO_InitStructure;//界说GPIO装备的结构体变量,用于初始化设置GPIO

RCC_ClocksTypeDefRCC_ClockFreq;//界说RCC时钟频率装备的结构体变量,用于装备RCC。包含SYSCLK,HCLK,PCLK1,PCLK2,ADCCLK频率的设置

ErrorStatusHSEStartUpStatus;//界说枚举类型的过错变量

//设置体系时钟SYSCLK的函数

voidSetSysClock(void);

voidSetSysClockToHSE(void);

voidSetSysClockTo20(void);

voidSetSysClockTo36(void);

voidSetSysClockTo48(void);

voidSetSysClockTo72(void);

voidNVIC_Configuration(void);//装备嵌套向量中止控制器函数

voidDelay(vu32nCount);//推迟

intmain(void)

{

#ifdefDEBUG

debug();

#endif

SetSysClock();//设置体系时钟HCLKPCLK2PCLK1

RCC_GetClocksFreq(&RCC_ClockFreq);//取得不同片上时钟的频率,RCC_ClockFreq为前面界说的时钟频率结构体变量,该函数把当时

//不同片上时钟的频率存放在结构体RCC_ClockFreq中

RCC_ClockSecuritySystemCmd(ENABLE);//该函数使能或失能时钟安全体系在这里是使能

NVIC_Configuration();

//敞开GPIOAGPIOB模块时钟使能APB2时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//挑选6,7,8,9引脚

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//GPIO速度为50MHz

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置为推挽输出形式

GPIO_Init(GPIOB,&GPIO_InitStructure);//用刚刚装备好的结构体变量初始化PB口

GPIO_Write(GPIOB,GPIO_Pin_7|GPIO_Pin_9);//向GPIOB口写入数据

//MCO:微控制器时钟输出时钟可以输出到外部的MCO管脚,相关的GPIO管脚有必要被装备成备用功用形式即AF形式

//在STM32F103C8中PA8为MCO管脚

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//挑选第8脚

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出形式

GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA口

//在STM32F103C8中PA8为MCO管脚

RCC_MCOConfig(RCC_MCO_HSE);//挑选在MCO管脚上输出的时钟源参数设置指定输出的时钟源,可取值如下:

//RCC_MCO_NoClock:无时钟被选中,RCC_MCO_SYSCLK:选中体系时钟,RCC_MCO_HSI:选中HSI,RCC_MCO_HSE:选中HSE,RCC_MCO_PLLCLK_Div2:

//选中PLL时钟除以2

//正告:当选中体系时钟作为MCO管脚的输出时,留意它的时钟频率不超越50MHz(最大I/O速率)。

while(1)

{

GPIO_Write(GPIOB,(u16)~GPIO_ReadOutputData(GPIOB));//PB口的状况取反

Delay(DELAY_COUNT);

}

}

voidSetSysClock(void)//设定体系时钟频率函数

{

#ifdefinedSYSCLK_HSE

SetSysClockToHSE();//体系时钟频率设为HSE

#elifdefinedSYSCLK_FREQ_20MHz

SetSysClockTo20();//体系时钟频率设为20MHz

#elifdefinedSYSCLK_FREQ_36MHz

SetSysClockTo36();//体系时钟频率设为36MHz

#elifdefinedSYSCLK_FREQ_48MHz

SetSysClockTo48();//体系时钟频率设为48MHz

#elifdefinedSYSCLK_FREQ_72MHz

SetSysClockTo72();//体系时钟频率设为72MHz

#endif

}

voidSetSysClockToHSE(void)//设置体系时钟频率为HSE的函数

{

//复位RCC外部设备存放器到默认值

RCC_DeInit();//将外设RCC存放器重设为缺省值

RCC_HSEConfig(RCC_HSE_ON);//翻开外部高速晶振HSE

HSEStartUpStatus=RCC_WaitForHSEStartUp();//等候外部高速时钟准备好

if(HSEStartUpStatus==SUCCESS)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能flash的预取功用

FLASH_SetLatency(FLASH_Latency_0);//设置flash代码延时时钟周期数为0

RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟等于体系时钟

RCC_PCLK2Config(RCC_HCLK_Div1);//设置APB2时钟频率等于AHB时钟

RCC_PCLK1Config(RCC_HCLK_Div1);//设置APB1时钟频率等于AHB时钟

RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);//设置体系时钟为HSE

while(RCC_GetSYSCLKSource()!=0x04)//查看体系时钟是否为HSE0x04:HSE作为体系时钟

{

}

}

else

{

while(1)

{

}

}

}

voidSetSysClockTo20(void)//设置体系时钟频率为20MHz

{

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus=RCC_WaitForHSEStartUp();

if(HSEStartUpStatus==SUCCESS)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_0);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div1);

RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_5);//HSE为8MHz设置PLL输出频率为20MHz

RCC_PLLCmd(ENABLE);//使能PLL

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//等候PLL安排妥当

{

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/256337.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部