STM32f407系列之时钟体系

目录

1.时钟源

2.附图说明

3.倍频公式

4.切换时钟源

5.代码验证


1.时钟源

(1)可以使用三种不同的时钟源来驱动系统时钟 (SYSCLK),CPU 运行的频率为 168MHz:

● HSI 振荡器时钟(16MHz),也就是高速内部时钟,一般来说很少用,因为精度没有外部高速时钟那么高。

● HSE 振荡器时钟,也就是高速外部时钟, 本开发板 8MHz。

● 主 PLL (PLL) 时钟

(2)器件具有以下两个次级时钟源:

● 32 kHz 低速内部 RC (LSI RC),该 RC 用于驱动独立看门狗,也可选择提供给 RTC 用于停机/待机模式下的自动唤醒。

● 32.768 kHz 低速外部晶振(LSE 晶振),用于驱动 RTC 时钟 (RTCCLK),对于每个时钟源来说,在未使用时都可单独打开或者关闭,以降低功耗。

2.附图说明

        STM32f407的时钟体系十分的复杂,时钟树也非常庞大,对于初学者来说容易看的眼花缭乱,所以,用图形的形式能更好地帮助理解,弄清楚时钟体系的结构,时钟体系也是后面内容的基础。

3.倍频公式

        如果不修改PLLM与HSE的值的话,代入倍频公式后会发现PLL输出频率不是168MHz。所以,一开始就要把PLLM与HSE的值都修改为8MHz,这样才不会影响后面定时器等内容的学习(比如定时器定时时间不准)。

        注意:不同的芯片倍频公式是不一样的,需要查询对应的官方手册才能确定!

4.切换时钟源

        在特殊的应用场景,为了达到最高的能效比,没有必要使用到PLL,可将HSE、HSI作为系统时钟源。例如,在智能手表锁屏的情况下,如果使用PLL配置过后输出的频率会造成过多的功耗,降低自身的续航能力;同时要维持计步与测量心率功能。因此,PLL在锁屏下的应用场景并不合适,在保证功能实现的前提下,尽可能降低功耗,可以切换频率更低的时钟源提供给系统时钟。

1.选择PLL作为系统时钟源

RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= RCC_CFGR_SW_PLL;

2.选择HSI作为系统时钟源

RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= RCC_CFGR_SW_HSI;

3.选择HSE作为系统时钟源

RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= RCC_CFGR_SW_HSE;

5.代码验证

以上一篇文章的思考题流水灯的代码为例,加入切换时钟源的代码,观察LED灯闪烁的频率变化。

#include "stm32f4xx.h"
static GPIO_InitTypeDef GPIO_InitStruct;
void delay(void)//粗延时函数,后面学到定时器后,会用定时器进行精确延时
{
	uint32_t i=0xA00000;
	while(i--);
}
int main()
{
	uint32_t b=0;
	//打开端口F的硬件时钟,就是为端口F供电
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
	//配置引脚
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_Speed=GPIO_High_Speed;
	GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
	
	GPIO_Init(GPIOF,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14;
	GPIO_Init(GPIOE,&GPIO_InitStruct);
	
	//一开始所有灯全灭
	GPIO_WriteBit(GPIOF,GPIO_Pin_9,Bit_SET);
	GPIO_WriteBit(GPIOF,GPIO_Pin_10,Bit_SET);
	GPIO_WriteBit(GPIOE,GPIO_Pin_13,Bit_SET);
	GPIO_WriteBit(GPIOE,GPIO_Pin_14,Bit_SET);
	while(1)
	{
		b=!b;
		if(b)
		{
			RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
			RCC->CFGR |= RCC_CFGR_SW_PLL;
		}
		else
		{
			RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
			RCC->CFGR |= RCC_CFGR_SW_HSI;
		}
		
		//点亮D1
		GPIO_WriteBit(GPIOF,GPIO_Pin_9,Bit_RESET);
		delay();
		//点亮D2
		GPIO_WriteBit(GPIOF,GPIO_Pin_10,Bit_RESET);
		delay();
		//点亮D3
		GPIO_WriteBit(GPIOE,GPIO_Pin_13,Bit_RESET);
		delay();
		//点亮D4
		GPIO_WriteBit(GPIOE,GPIO_Pin_14,Bit_RESET);
		delay();
		//熄灭所有灯
		GPIO_WriteBit(GPIOF,GPIO_Pin_9,Bit_SET);
	    GPIO_WriteBit(GPIOF,GPIO_Pin_10,Bit_SET);
	    GPIO_WriteBit(GPIOE,GPIO_Pin_13,Bit_SET);
		GPIO_WriteBit(GPIOE,GPIO_Pin_14,Bit_SET);
		delay();
	}						
}

然后,还可以直接用流水灯的代码,不切换时钟源,只改变PLLN的值,也能改变LED灯的闪烁频率。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F407是STMicroelectronics公司推出的一款高性能的ARM Cortex-M4内核微控制器,它拥有240MHz的主频、1MB的闪存和192KB的SRAM,并支持双精度浮点运算。芯片的数据手册是一份非常重要的文件,主要提供了STM32F407的各种参数、寄存器位定义、功能描述、时序图等详细信息。读取数据手册的过程需要时常仔细阅读、理解与分析,以确保芯片的应用和设计能够达到最佳效果。 在阅读数据手册之前,需要先了解STM32F407体系结构和寄存器。数据手册的基础章节首先介绍了STM32F407的总体结构和基本寄存器,其中包括了CPU、闪存、RAM、时钟系统、DMA控制器、中断控制器、外设等的详细描述。除此之外,数据手册还介绍了STM32F407芯片的电气特性、工作条件、引脚定义等信息,以及开发工具、存储器、调试接口等相关注意事项。此外,数据手册还完整描述了STM32F407微控制器的外设,包括GPIO、TIM、USART、SPI、I2C、CAN、SDIO、USB OTG、CRC计算器等。 数据手册对于STM32F407的设计和应用非常关键。在开发STM32F407的过程中,根据数据手册的规格书和描述实现系统的各个模块,并进行端口和功能映射等设置。此外,数据手册还对系统的运行时序、时钟和中断等详细说明,以及每个模块的寄存器位定义和使用方法。因此,阅读和理解数据手册是STM32F407开发人员的必备技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值