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

发布者:快乐飞翔最新更新时间:2020-03-01 来源: elecfans关键字:STM32  HSE  HSI  配置时钟 手机看文章 扫描二维码
随时随地手机看文章

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);

}

关键字:STM32  HSE  HSI  配置时钟 引用地址:STM32-嵌入式学习笔记1-使用HSE和HSI配置时钟

上一篇:STM32-EXTI中断的分析及应用
下一篇:【菜鸟入门】stm32 之 pwm

推荐阅读最新更新时间:2024-11-11 09:21

关于STM32串口使用DMA的教程
1 前言 直接存储器访问(Direct Memory Access),简称DMA。DMA是CPU一个用于数据从一个地址空间到另一地址空间“搬运”(拷贝)的组件,数据拷贝过程不需CPU干预,数据拷贝结束则通知CPU处理。 因此,大量数据拷贝时,使用DMA可以释放CPU资源。DMA数据拷贝过程,典型的有: 内存— 内存,内存间拷贝 外设— 内存,如uart、spi、i2c等总线接收数据过程 内存— 外设,如uart、spi、i2c等总线发送数据过程 2 串口有必要使用DMA吗 串口(uart)是一种低速的串行异步通信,适用于低速通信场景,通常使用的波特率小于或等于115200bps。 对于小于或者等于
[单片机]
关于<font color='red'>STM32</font>串口使用DMA的教程
基于STM32的嵌入式以太网门禁系统设计
  引言   当前,有很多的企业是采用佩戴工作证来完成门禁管理,而且还是采用传统的人工方式完成,不仅容易被人混入,且没有记录,存在各种人为的失误。同时,市场上门禁系统存在传输距离受限制、性能不佳等问题。   随着嵌入式技术日新月异的发展,以及以太网技术的普及,使得基于以太网的嵌入式产品越来越多,发展也越来越快。本文研究的就是采用以太网传输数据和射频芯片识别智能卡相结合的门禁系统,相对于传统的门禁系统,以太网解决了传输距离上的问题。其次,采用了基于80C51内核的射频芯片PN532,使得性能更加稳定。其工作的基本原理是先将智能卡放在门禁系统上,系统读取数据并传送给主芯片STM32进行处理,主芯片处理后再通过以太网协议LwIP将数
[单片机]
基于<font color='red'>STM32</font>的嵌入式以太网门禁系统设计
STM32-1-LED点亮与熄灭
led.c文件 #include led.h void LED_Init(void){ //¶¨ÒåÒ»¸öGPIO_InitTypeDefÀàÐ͵ĽṹÌå GPIO_InitTypeDef GPIO_InitStructure; //¿ªÆôPA¿ÚʱÖÓ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //Ñ¡ÔñÒª¿ØÖƵÄPA¿Ú GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //ÉèÖÃÒý½ÅģʽΪͨÓÃÍÆÍìÊä³ö
[单片机]
STM32 VBAT外围电路接法详解
给大家看几块开发板的VBAT外围电路的设计图: (1) (2) (3) (4) (5) stm32芯片手册要求:(大体上就这两个要求,具体要求看AN2586供电方案) (1)如果应用中没有使用外部电池,VBAT必须连接到VDD引脚上。 (2)如果没有外部电池,这个引脚必须和100nF的陶瓷电容一起连接到VDD电源上 (3)在VDD上升阶段(tRSTTEMPO)或者探测到PVD之后,VBAT和VDD之间的电源开关仍会保持连接在 VBAT。在VDD上升阶段,如果VDD在小于tRSTTEMPO的时间内达到稳定状态(关于tRSTTEMPO可参考数 据手册中的相关部分),且VDD VBAT + 0.6V时,电流
[单片机]
<font color='red'>STM32</font> VBAT外围电路接法详解
STM32定时器时间的计算方法
STM32中的定时器有很多用法: (一)系统时钟(SysTick) 设置非常简单,以下是产生1ms中断的设置,和产生10ms延时的函数: void RCC_Configuration(void) { RCC_ClocksTypeDef RCC_ClockFreq; SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置. RCC_GetClocksFreq(&RCC_ClockFreq); //SYSTICK分频--1ms的系统时钟中断 if (SysTick_Config(SystemFrequency / 1000)) { while (1); // Capt
[单片机]
STM32 DMA 学习笔记(二)
一、常用DMA库函数 1.DMA初始化(包括通道和参数配置) void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); 下面就是结构体参数 typedef struct { uint32_t DMA_PeripheralBaseAddr; //外设基地址 uint32_t DMA_MemoryBaseAddr; //存储器基地址 uint32_t DMA_DIR; //数据传输方向 uint32_t DMA_BufferSize; //通道传输数据量 uint32_t DMA_Peripheral
[单片机]
STM32精确延迟1us和1ms的函数
延迟1us: 1 /***************************************************** 2 * 函 数 名 : delay_us 3 * 函数功能 : 延时函数,延时us 4 * 输 入 : i 5 * 输 出 : 无 6 *******************************************************************************/ 7 void delay_us(u32 i) 8 { 9 u32 temp; 10 SysTick-LOAD=
[单片机]
STM32 LED跑马灯-位操作
一,什么是位操作   之前我们已经介绍了库函数和寄存器控制LED跑马灯,其实无论使用哪一种方法(包括操作BSRR,BRR寄存器的方式)最终都是通过操作GPIO_ODR寄存器(32位寄存器只使用低16位)响应的位为该IO口赋值     那么什么是位操作?我们知道GPIO_ODR寄存器的每一位对应一个IO口的电平操作,而每一位实际是一个IO口地址的映射,位操作就是跨越寄存器映射,直接为这个地址进行赋值      在LED跑马灯-位操作的实验中我们将使用位操作的方式控制IO口输出高低电平 二,位与别名映射关系 1,支持位操作的两个内存区范围: 0x2000_0000-0x200F_FFFF // SRAM区中的最低1M 0x
[单片机]
<font color='red'>STM32</font> LED跑马灯-位操作
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved