STM32学习笔记-时钟系统

一、STM32时钟系统概述

1、时钟系统的概念及意义

  • 概念
    时钟系统是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器。
  • 意义
    时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,比如串口数据的发送、A/D转换、定时器计数等等。因此时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命的,比如振荡器不起振、振荡不稳、停振等。
    在这里插入图片描述

2、常见振荡器简介

  • 概念
    振荡器是用来产生重复电子讯号的电子元件。其构成的电路叫振荡电路,能将直流电转换为具有一定频率交流信号输出的电子电路或装置。
  • 分类
    振荡器主要分为RC,LC振荡器和晶体振荡器。RC振荡器是采用RC网络作为选频移相网络的振荡器。LC振荡器是采用LC振荡回路作为移相和选频网络的正反馈振荡器。晶体振荡器的振荡频率受石英晶体控制。
2.1、RC振荡器

RC振荡器
RC振荡器是又电阻电容构成的振荡电路,能将直流电转换为具有一定频率交流信号输出的电子电路或装置。

  • 优点
    实现的成本比较低,毕竟就是一个电阻电容
  • 缺点
    是由于电阻电容的精度问题所以RC振荡器的震荡频率会有误差,同时受到温度、湿度的影响
    在这里插入图片描述
2.2、晶体振荡器

晶体振荡器
石英晶体振荡器是高精度和高稳定度的振荡器,被广泛应用于彩电、计算机、遥控器等各类振荡电路中,以及通信系统中用于频率发生器、为数据处理设备产生时钟信号和为特定系统提供基准信号

  • 优点
    是相对来说震荡频率一般都比较稳定,同时精度也较高
  • 缺点
    就是价格要稍微高点了,还有用晶体振荡器一般还需要接两个15-33pF起振电容

在这里插入图片描述

3、STM32F0时钟源介绍

3.1、STM32 中主要有四个时钟源
  • HSI:高速内部时钟,RC振荡器,频率为16MHz;
  • HSE:高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz,我们开发板是25MHz
  • LSI:低速内部时钟,RC 振荡器,频率为 32kHz 左右。供独立看门狗和自动唤醒单元使用
  • LSE:低速外部时钟,接频率为32.768kHz 的石英晶体。这个主要是 RTC 的时钟源
3.2、STM32 时钟树的分析

主系统时钟会配置为168M,通过PLL倍频
在这里插入图片描述

3.3、复位和时钟控制 (RCC)

通过寄存器控制
在这里插入图片描述
在这里插入图片描述

二、STM32时钟配置实例

1、系统时钟配置

1.1、默认配置

在这里插入图片描述
代码现象查看
在这里插入图片描述
通过mydelay函数,查看时钟效果。
在这里插入图片描述

1.2、倍频配置

注意最大可承受频率
在这里插入图片描述

1.3、运行分析

SystemInit () 系统时钟初始化

  • void SystemInit(void)
    System_stm32f4xx.c中定义,在系统启动之后,程序会先执行 HAL 库定义的 SystemInit 函数,进行系统一些初始化配置,复位 RCC 时钟配置为默认复位值(默认开启 HSI)
  • void SystemClock_Config(void)
    在main.c中定义,实现系统时钟的具体配置,配置PLL, 配置AHB和APB1,APB2的时钟

1、系统上电,执行复位函数,运行SystemInit
在这里插入图片描述
2、初始化环境,使用初始时钟
在这里插入图片描述
3、跳转到main函数SystemClock_config
在这里插入图片描述

2、外设时钟使能

STM32F4 的外设在使用之前,必须对时钟进行使能,如果没有使能时钟,那么外设是无法正常工作的。
在 STM32F4 的 HAL 库中,外设时钟使能操作都是在 RCC 相关固件库文件头文件 stm32f4xx_hal_rcc.h 定义的。大家打开 stm32f4xx_hal_rcc.h 头文件可以看到文件中除了少数几 个函数声明之外大部分都是宏定义标识符。外设时钟使能在 HAL 库中都是通过宏定义标识符 来实现的
在这里插入图片描述

三、SysTick定时器讲解

1、SysTick定时器简介

  • 概念
    定时器,能够定时、计数的器件称为定时器
    SysTick, 称作系统滴答定时器,简称滴答定时器。是一个定时设备,位于Cortex-M0内核中,可以对输入的时钟进行计数,当然,如果时钟信号是周期性的,计数也就是计时。
    系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。根据这个中断,系统就可以实现时间片的计算从而切换进程。
  • 工作原理
    滴答定时器是一个24位定时器,也就是最多能计数2^24。在使用的时候,我们一般给计数器送一个初始的计数值,计数器向下计数,每来一个时钟信号,计数初值就减一,计数值减到0的时候,就会发出一次中断。然后重新从计数初值再减一计数,循环不断

2、SysTick定时器工作原理图

在这里插入图片描述
重载数值寄存器用户定义。系统上电后会把数值赋值给计数器,每来一个时钟周期,计时器减1,当数值为0,触发中断异常。时间周期为数值时钟周期。
在这里插入图片描述
定时器1ms触发一次中断,重载数值寄存器数值为168000.重载数值寄存器最大不能超过2^24.
(1ms
168)/1us

3、流程分析

1、Main中已经实现对SysTick定时器的初始化 void SystemClock_Config(void)
在这里插入图片描述
2、HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);传了一个参数(HAL_RCC_GetHCLKFreq()/1000,重载数值寄存器的值,主频率/1000。默认1ms
在这里插入图片描述
在这里插入图片描述
设置重载寄存器的值,减1因为寄存器从0开始
在这里插入图片描述
时钟源,抢占优先级
在这里插入图片描述
定时器触发异常,系统会进行处理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
回调函数为空,可重写,操作系统要重写
在这里插入图片描述
在这里插入图片描述

四、HAL_Delay()函数的实现

1、利用SysTick实现精准的延时

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、HAL_Delay()分析

//下面代码均在文件 stm32f4xx_hal.c 中

static __IO uint32_t uwTick; //定义计数全局变量

//获取全局变量 uwTick 的值
__weak uint32_t HAL_GetTick(void)
{
	return uwTick;
}
//全局变量 uwTick 递增
__weak void HAL_IncTick(void)
{
	uwTick++;
}
//Systick 中断服务函数:文件 stm32f0xx_it.c 中

void SysTick_Handler(void)
{
	HAL_IncTick();
  	HAL_SYSTICK_IRQHandler();
}

每隔 1ms, uwTick增加 1
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值