STM32-嵌入式学习笔记01-使用HSE和HSI配置时钟

简介: STM32-嵌入式学习笔记01-使用HSE和HSI配置时钟

RCC主要作用:时钟

设置SYSCLK   设置AHB分频因子····配置好这些因子就能对时钟进行完整的配置。

20180918211136607.png时钟树如图:

系统时钟的选择是在启动时进行,复位时内部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"voidHSE_SetSysClk(uint32_tRCC_PLLMul_x) //设置HSE为系统时钟{
//把RCC外设初始化成复位状态ErrorStatusHSEStatus;
//把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 ≤ 72MHzRCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div2);
//配置PLLCLK = HSE *RCC_PLLMul_xRCC_PLLConfig( RCC_PLLSource_HSE_Div1,RCC_PLLMul_x);
//使能PLLRCC_PLLCmd(ENABLE);
//等待PLL时钟稳定while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET )
        {
//选择系统时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() !=0x08);
        }
    }
else    {
    }
}
voidMCO_GPIO_Config()
{
//定义一个GPIO_InitTypeDef类型的结构体GPIO_InitTypeDefGPIO_InitStructure;
//开启LED相关GPIO的外设时钟RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOA, ENABLE);
//选择控制的引脚GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;   
//选择输出方式为推挽输出GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;   
//设置引脚速率为50MHZGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
//调用库函数,初始化GPIOGPIO_Init(GPIOA, &GPIO_InitStructure);  
}

使用HSI作为系统时钟


#include"stm32f10x.h"#include"bsp_rccclkconfig.h"voidHSI_SetSysClk(uint32_tRCC_PLLMul_x) //设置HSE为系统时钟{
//把RCC外设初始化成复位状态__IOuint32_tHSIStatus=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或者1RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div2);
//配置PLLCLK = HSE *RCC_PLLMul_xRCC_PLLConfig( RCC_PLLSource_HSI_Div2,RCC_PLLMul_x);
//使能PLLRCC_PLLCmd(ENABLE);
//等待PLL时钟稳定while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET )
        {
//选择系统时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() !=0x08);
        }
    }
else    {
    }
}
voidMCO_GPIO_Config()
{
//定义一个GPIO_InitTypeDef类型的结构体GPIO_InitTypeDefGPIO_InitStructure;
//开启LED相关GPIO的外设时钟RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOA, ENABLE);
//选择控制的引脚GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;   
//选择输出方式为推挽输出GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;   
//设置引脚速率为50MHZGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
//调用库函数,初始化GPIOGPIO_Init(GPIOA, &GPIO_InitStructure);  
}
目录
相关文章
|
6月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
877 0
|
7月前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
838 2
|
7月前
|
开发者
【经典案例】使用HAL库配置STM32F407的SPI外设
在嵌入式系统开发中,STM32F407是一款广泛应用的微控制器,而SPI(Serial Peripheral Interface)是一种常用的通信接口。本文将详细介绍如何使用STM32的硬件抽象层(HAL)库配置STM32F407的SPI外设,并提供完整的代码示例。
694 1
|
6月前
|
前端开发 安全
stm32f407探索者开发板(十一)——SystemInit时钟系统初始化剖析
stm32f407探索者开发板(十一)——SystemInit时钟系统初始化剖析
232 0
|
6月前
stm32f407探索者开发板(十)——时钟系统精讲
stm32f407探索者开发板(十)——时钟系统精讲
245 0
|
7月前
|
Web App开发 传感器 Linux
【嵌入式软件工程师面经】STM32单片机
【嵌入式软件工程师面经】STM32单片机
176 1
|
6月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
229 0
|
6月前
|
数据安全/隐私保护
STM32F103C8T6实现简易密码锁(CubeMax配置)(一),Oled显示。
项目功能:实现设置密码,登陆密码,后期还可以通过E2PROM实现掉电不丢失数据。通过Oled的显示去判断我们是否设置或者登陆成功。
126 0
|
7月前
|
移动开发
技术好文:stm32寄存器版学习笔记06输入捕获(ETR脉冲计数)
技术好文:stm32寄存器版学习笔记06输入捕获(ETR脉冲计数)
306 0
|
7月前
|
存储 数据安全/隐私保护 芯片
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
【STM32】详解嵌入式中FLASH闪存的特性和代码示例