历史上的今天
今天是:2025年01月13日(星期一)
2020年01月13日 | STM32-嵌入式学习笔记1-使用HSE和HSI配置时钟
2020-01-13 来源:eefocus
RCC主要作用:时钟
设置SYSCLK 设置AHB分频因子····配置好这些因子就能对时钟进行完整的配置。

时钟树如图:
系统时钟的选择是在启动时进行,复位时内部8MHz的RC振荡器被选为默认的CPU时钟,随后可以选择外部的、具失效监控的4~16MHz时钟;当检测到外部时钟失效时,它将被隔离,系统自动地切换到内部的RC振荡器,如果使能了中断,软件可以接收到相应的中断。同样,在需要时可以采取对PLL时钟完全的中断管理(如当一个间接使用的外部振荡器失效时)。
多个预分频器用于配置AHB的频率、高速APB(APB2)和低速APB(APB1)区域。AHB和APB的最高频率是36MHz。
编程要领:
1)开启HSE/HSI 等待HSE/HSI 稳定
2)设置AHB,APB2,APB1的预分频因子
3)设置PLL的时钟来源和PLL的倍频因子,各个频率主要在这里设置
4)开启PLL 等待PLL稳定
5)把PLLCK切换为系统时钟SYSCLK
6)读取时钟切换状态位,确保PLLCLK被选中为系统时钟
HSE配置系统时钟
#include "stm32f10x.h"
#include "bsp_rccclkconfig.h"
void HSE_SetSysClk(uint32_t RCC_PLLMul_x) //设置HSE为系统时钟
{
//把RCC外设初始化成复位状态
ErrorStatus HSEStatus;
//把RCC寄存器复位
RCC_DeInit();
//使能HSE,开启外部晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待HSE启动
HSEStatus=RCC_WaitForHSEStartUp();
//当HSE稳定之后继续往下执行
if(HSEStatus== SUCCESS )
{
//使能预取指
FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
//LATENCY:时延
//这些位表示SYSCLK(系统时钟)周期与闪存访问时间的比例
//000:零等待状态,当 0 < SYSCLK ≤ 24MHz
//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz
//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div2);
//配置PLLCLK = HSE *RCC_PLLMul_x
RCC_PLLConfig( RCC_PLLSource_HSE_Div1,RCC_PLLMul_x);
//使能PLL
RCC_PLLCmd(ENABLE);
//等待PLL时钟稳定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET )
{
//选择系统时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() !=0x08);
}
}
else
{
}
}
void MCO_GPIO_Config()
{
//定义一个GPIO_InitTypeDef类型的结构体
GPIO_InitTypeDef GPIO_InitStructure;
//开启LED相关GPIO的外设时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
//选择控制的引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//选择输出方式为推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//设置引脚速率为50MHZ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//调用库函数,初始化GPIO
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
使用HSI作为系统时钟
#include "stm32f10x.h"
#include "bsp_rccclkconfig.h"
void HSI_SetSysClk(uint32_t RCC_PLLMul_x) //设置HSE为系统时钟
{
//把RCC外设初始化成复位状态
__IO uint32_t HSIStatus=0;
//把RCC寄存器复位
RCC_DeInit();
//使能HSI,开启外部晶振
RCC_HSICmd(ENABLE);
//等待HSE启动
HSIStatus =RCC->CR & RCC_CR_HSIRDY;
//当HSE稳定之后继续往下执行
if(HSIStatus== SUCCESS )
{
//使能预取指
FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
//设置SYSCLK周期与flash的访问时间比例,这里为2
//设置成2的时候,SYSCLK低于48MHz也可以工作,设置成0或者1
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div2);
//配置PLLCLK = HSE *RCC_PLLMul_x
RCC_PLLConfig( RCC_PLLSource_HSI_Div2,RCC_PLLMul_x);
//使能PLL
RCC_PLLCmd(ENABLE);
//等待PLL时钟稳定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET )
{
//选择系统时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() !=0x08);
}
}
else
{
}
}
void MCO_GPIO_Config()
{
//定义一个GPIO_InitTypeDef类型的结构体
GPIO_InitTypeDef GPIO_InitStructure;
//开启LED相关GPIO的外设时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
//选择控制的引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//选择输出方式为推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//设置引脚速率为50MHZ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//调用库函数,初始化GPIO
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
史海拾趣
|
跪求高手指点: 在安装凌华采集卡驱动时,系统提示:If your drivers DO NOT perform DMA and INTERUPT Operation , & ...… 查看全部问答> |
|
本人新做一个有关数据采集的项目,问些比较菜的问题~!! 见笑啊 数据采集卡是12位的,用256k的频率进行数据采集,fifo缓冲区是8k*16bit。 我想知道这个缓冲区能存多少个数,缓冲区存满需要多 ...… 查看全部问答> |
|
就拿我们现实中普通的计数器来说吧,当我按下1键后,在它内部会产生什么情况?难道会产生一股电流?这股电流如何把1这个信息存储在内部某个元件上啊?这个元件是如何存储它的啊?我需要详细的了解最最底层的原理啊,硬件是如何识别0和1的?如何存储 ...… 查看全部问答> |
|
各位大师们好 我现在在三星Armv4-2410ep教学开发板上做串口通信的开发。我是在Windows Ce 4.2的平台下作的。台子上的Serial 0,我可以轻松搞定,可是Serial 2我怎么调也调不成功?这是为什么? 答案正确,一定给分 ...… 查看全部问答> |




