day6 STM32时钟与定时器

news/2025/2/26 21:33:31

STM32时钟系统的概述

概念

时钟系统是由振荡器(信号源)定时唤醒器分频器等组成的电路。

常用的信号有晶体振荡器RC振荡器

意义

时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行状态变换等动作,外设部件在时钟的驱动下完成各种工作,比如串口数据的发送A/D转换、定时器计数等等。因此时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命的,比如振荡器不起振、振荡器不稳、停振等。

 常见振荡器简介

概念

振荡器是用来产生重复电子讯号的电子元件。其构成的电路叫振荡电路,能将直流电转换为具有一定频率交流信号输出的电子电路或装置。

分类

振荡器主要分为RC、LC振荡器和晶体振荡器。

RC振荡器采用RC网络作为选频移相网络的振荡器。

LC振荡器是采用LC振荡回路作为移相选频网络的正反馈振荡器。

晶体振荡器的振荡频率收石英晶体控制。

RC振荡器

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

优点:实现成本比较低,毕竟就是一个电阻电容。

缺点:由于电阻电容的精度问题所以RC振荡器的振荡频率会有误差,同时受温度、湿度影响。

 

LC振荡器

LC振荡器使用一个电感(L)和一个电容(C)组成的电路。

工作原理是通过电感和电容之间的相互作用来产生振荡信号。

当电容充电时,它会储存能量,并通过电感释放能量。

LC振荡器的频率由电感和电容的数值决定。

晶体振荡器

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

优点 :相对来说振荡频率一般都比较稳定,同时精度也较高。

缺点:价格稍微较高,晶体振荡器一般还需要接两个15~33pf起振电容。

STM32F0时钟源介绍

STM32中有四个时钟源:

HSI:高速内部时钟,RC振荡器,频率为8MHz;

HSE:高速外部时钟,可以石英 / 陶瓷振荡器,或者接外部时钟源,频率范围为4MHz~16MHz

LSI:低速内部时钟,RC振荡器,频率为40KHz。独立看门狗时钟源智能是这个,还可以做RTC时钟源

LSE:低速外部时钟,接37.768KHz的石英晶体。主要是RTC的时钟源

STM32时钟树(部分):

SysTick定时器

概念

定时器,能够定时、计数的器件称为定时器

SysTick,称作系统滴答定时器。是一个定时设备,位于Cortex - M0内核中,可以对输入的时钟进行计数,当然,如果时钟信号是周期性地,计数也就是计时。

系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。根据这个中断,系统就可以实现时间片的计算从而切换进程。

工作原理

滴答定时器是一个24位定时器,也就是最多能计数2^24.在使用的时候,我们一般给计数器一个初始的计数值,计数器向下计数,每来一个时钟信号,计数初值就减一,计数值减到0的时候,就会触发一次中断。然后重新计数初值再减一计数,循环不断。

原理图

 SysTick寄存器

 

 SysTick定时器初始化

// Main中已经实现对SysTick定时器的初始化
void SystemClock_Config(void)
	HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
	       SysTick_Config(TicksNumb);

 SysTick中断相关

 HAL_Delay()函数

 //利用SysTick实现精准的延时
__weak void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t    tickstart = 0U;

  tickstart     = HAL_GetTick();
  while((HAL_GetTick() - tickstart) < Delay) ; 
}

HAL_Delay()  的局限   

        HAL库的延时函数有一个局限性,在中断服务函数中使用HAL_Delay会引起混乱,因为它是通过中断方式实现,而 Systick 的中断一般操作系统优先级是最低的,所以在中断中运行 HAL_Delay会导致死锁的现象。

STM32通用定时器介绍

STM32F051xx系列器件包括多达6个通用定时器,1个基本定时器和1个高级定时器

 几种定时器功能比较

通用定时器TIMx功能

  • 定时器定时计数
  • 输入捕获
  • 输出比较
  • PWM输出
  • 使用外部信号控制定时器和定时器互连的电路

高级定时器TIM1功能

  • 通用定时器的功能
  • 带死区控制和紧急刹车,可用于PWM控制电机

基本定时器TIM1功能

  • 主要运用于定时计数以及驱动DAC

定时器计数模式

向上计数模式

计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器移除事件。

向下计数模式

计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

中央对齐模式(向上 / 向下计数)

计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

 定时器计数原理

时钟源:定时器时钟TIMxCLK,即内部时钟CK_INT,经APB预分频器后分频提供

计数器时钟:定时器时钟经过PSC预分频器之后,即CK_CNT,用来驱动计数器计数

计数器CNT:是一个16位/32位的计数器

自动重装载寄存器:这里面装着计数器能计数的最大数值。当计数到这个值得时候,如果使能了中断的话,定时器就产生溢出中断

计时中断时间:1/(TIMxCLK/(PSC+1)) * (ARR+1)

 定时器输入捕获与输出比较

输入捕获:输入捕获可以用来捕获外部事件,比如引脚的电平变化(上升沿,下降沿),并记录下变化的时间,通常可以用来测量外部信号的频率或者电平持续的时间

 输出比较:此项功能是用来控制一个输出波形,当计数器与捕获/比较寄存器的内容相同时,输出比较功能做出相应动作,比如电平的翻转。通常用于生产PWM波形

 


http://www.niftyadmin.cn/n/4935626.html

相关文章

基于SqlSugar的开发框架循序渐进介绍-- 快速构建系统参数管理界面

在参照一些行业系统软件的时候&#xff0c;发现一个做的挺不错的系统功能-系统参数管理&#xff0c;相当于把任何一个基础的系统参数碎片化进行管理&#xff0c;每次可以读取一个值进行管理&#xff0c;这样有利于我们快速的处理业务需求&#xff0c;是一个挺好的功能。本篇随笔…

TEC2083BS-PD码转换器(解决博世矩阵控制PELCO派尔高球机的问题)

TEC2083BS-PD码转换器 使用说明 1.设备概述 控制码转换器在安防工程中起着非常重要的角色&#xff0c;随着高速球型摄像机在安防工程中大范围的使用&#xff0c;而高速球厂家都因为某些原因很少使用博世、飞利浦的协议。为此&#xff0c;工程商经常会遇到博世协议和PELCO协议之…

考公-判断推理-类比推理

第七节课 例题 例题 例题 例题 目无全牛&#xff1a;很熟练 不以为然&#xff1a;不认为正确 不孚众望&#xff1a;不能让人信服 例题 步人后尘&#xff1a;走别人的老路 例题 见义勇为是助人为乐的一种 例题 例题-全同 例题 并列关系 例题 例题 例题 例题 进士…

链表OJ详解

&#x1f495;人生不满百&#xff0c;常怀千岁忧&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;链表oj详解 题目一&#xff1a;移除元素 题目要求&#xff1a; 画图分析&#xff1a; 代码实现&#xff1a; struct ListNode* removeElements(struct List…

C语言快速回顾(二)

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。C/C是音视频必…

CSS实现左侧固定,右侧自适应(5种方法)

<div class"father"><!-- 左右div不能调换顺序来写 --><div class"left">固定宽度区</div><div class"right">自适应区</div> </div> 一、利用左侧浮动float右侧margin-left /* 利用浮动floatmargin…

LeetCode 热题 100 JavaScript--283. 移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0] 输出:…

设计模式之七:适配器模式与外观模式

面向对象适配器将一个接口转换成另一个接口&#xff0c;以符合客户的期望。 // 用火鸡来冒充一下鸭子class Duck { public:virtual void quack() 0;virtual void fly() 0; };class Turkey { public:virtual void gobble() 0;virtual void fly() 0; };class TurkeyAdapter :…