【STM32】知识补充 深入探讨预分频器

news2024/12/26 12:06:50

【STM32】知识补充 深入探讨预分频器

  • 概述
  • 分频器是什么
  • 工作原理
    • 计数器预分频器
    • 触发器预分频器
    • 模数计数器预分频器
    • 上升沿和下降沿
  • 应用场景
    • 微控制器时钟预分频
    • 通信系统中的频率合成
    • 计时器与 PWM 波形生成
    • 数字电路设计中的同步与计时
  • 预分频器实现方法
    • 硬件预分频器
    • 软件预分频器
  • 案例
  • 总结

概述

预分频器 (Prescaler) 是数字系统中用于降低时钟频率的关键组件. 本文小白我将介绍预分频器的工作原理, 应用场景和实现方法, 来帮助大家更好的理解和应用预分频器的技术.

预分频器

分频器是什么

分频器 (Prescaler) 是一种用于将输入时钟信号频率降低的电子设备. 通常, 预分频器可以将输入频率降低为整数倍, 小数倍或任意比例. 预分频器在数字系统中具有广泛应用, 例如微控制器, 通信系统, 计时器等.

工作原理

预分频器的工作原理主要依赖于计数器, 触发器, 模数计数器等电子元件. 通过这些元件, 预分频器可以将输入信号的周期按照特定的规律进行累积和清零, 从而实现频率降低的目的.

计数器预分频器

计数器预分频器是一种基于二进制计数器的预分频技术. 计数器对输入信号的上升沿或下降沿进行计数, 当计数值达到预设值时, 计数器清零并输出一个信号脉冲. 通过调整计数器的预设值, 可以实现不同的预分频比例.

触发器预分频器

触发器预分频器主要利用 D 触发器或 JK 触发器实现. D 触发器在输入信号的上升沿或下降沿时, 将数据输入端的状态传递到输出端. 通过将触发器的输出端与输入端相连, 可以实现 2 分频. JK 触发器的工作原理类似, 可以实现 2 分频和 4 分频等不同的预分频比例.

模数计数器预分频器

模数计数器预分频器是一种基于模数计数器的预分频技术. 模数计数器可以对输入信号进行连续计数, 当计数值达到预设值时, 计数器清零并输出一个信号脉冲. 通过调整计数器的模数值, 可以实现任意整数倍的预分频比例.

上升沿和下降沿

上升沿和下降沿是数字信号处理中常见的概念, 它们分别描述了数字信号从低电平跳变到高电平 (0 到 1) 以及从高电平跳变到低电平 (1 到 0 ) 的瞬间.

  1. 上升沿: 当数字信号从低电平 (0) 变为高电平 (1) 时, 这个转变过程称为上升沿. 在此时此刻, 信号的店铺发生了正向跳变. 上升沿通常用于触发器, 计数器和其他数字电路的时钟输入, 因为它表示一个新的计数周期的开始
  2. 下降沿: 当数字信号从高电平 (1) 变为低电平 (0) 时, 这个转变过程称为下降沿. 此时此刻, 信号的电平发生了负向跳变. 下降沿同样可以用于触发器, 计数器和其他数字电路的时钟输入, 因为它也可以表示一个新的计数周期的开开

在数字电路中, 上升沿和下降沿的概念非常重要, 因为它们通常用于同步和计时操作. 许多数字电路元件, 如触发器, 计数器, 锁存器等, 都依赖于上升沿或下降沿来控制其工作状态. 此外, 上升沿和下降沿的概念也常用与通信系统中的数据传输, 例如用于检测和解码脉冲编码调制 (PCM) 信号.

STM32 预分频器

应用场景

微控制器时钟预分频

在微控制器中, 预分频器通常用于生成不同频率的系统时钟. 例如, STM32 微控制器可以通过 PLL (锁相环) 和预分频器生成多种频率的系统时钟, 以适应不同外设的功耗要求.

通信系统中的频率合成

在无线通信系统中, 预分频器常用与频率合成和信号处理. 例如, 无线通信设备需要在不同频率下工作, 可以通过混频器, 锁相环 (PLL) 和预分频器相结合的方式, 实现频率的转换和合成.

计时器与 PWM 波形生成

在计时器和 PWM 波形生成应用中, 预分频器可以用于调整输出信号的频率. 通过改变预分频器的分频比例, 我们可以实现不同频率的计时和 PWM 波形.

数字电路设计中的同步与计时

在数字电路设计中, 预分频器可以用于生成不同频率的时钟信号, 以实现各种功能模块之间的同步和计时. 例如: 在数字信号处理器 (DSP) 或微处理器中, 预分频器可以为数据采集, 运算, 存储等模块提供适当的时钟信号.

预分频器

预分频器实现方法

在实际应用中, 预分频器可以通过硬件和团建两种方式实现.

硬件预分频器

硬件预分频器主要依赖于计数器, 触发器, 模数计数器等电子元件. 这种方式实现的预分频具有较高的精度和稳定性, 适用于对时钟信号要求较高的场合. 常见的硬件预分频器有集成电路 (如 74 系列, CD4040 等) 和可编程逻辑器件 (如 CPLD, FPGA 等).

软件预分频器

软件预分频器是在微控制器内部通过软件编程实现的预分频方法. 这种方式的优点是灵活性高, 成本低, 但精度和稳定性相对较差. 在 STM32 等微控制器中, 可以通过定时器, PWM 等外设实现团建预分频.

案例

在 STM32 中, 预分频器广泛应用于定时器, PWM 波形生成和系统时钟设置等场景. 这里我们以一个使用 STM32 定时器产生不同频率的 PWM 波形为例, 来说明预分频器在 STM32 中的应用.

使用 STM32F103 系列产生一个 1kHz 的 PWM 波形:

#include "stm32f1xx_hal.h"

TIM_HandleTypeDef htim2;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM2_Init();

  // 开启TIM2 PWM输出
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

  while (1)
  {
  }
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_TIM2_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 7199; // 预分频器:7200 - 1
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 99; // 自动重装载寄存器:100 - 1
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET

总结

预分频在数字系统中起着关键作用, 通过降低时钟频率, 可以实现不同功能模块的同步, 计时以及频率合成等目的. 了解预分频器的工作原理, 应用场景和实现方法, 有助于我们在实际工程中更好的应用预分频技术.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/479436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Swift之深入解析如何使用和自定义高级运算符

一、前言 在我之前的博客 Swift之深入解析如何自定义操作符 介绍了“基本运算符”,Swift 还提供了数种可以对数值进行复杂运算的高级运算符,它们包含了在 C 和 Objective-C 中已经被大家所熟知的位运算符和移位运算符。与 C 语言中的算术运算符不同&…

【flask】理解flask的几个难点,难啃的骨头,线程隔离啥的

1.三种路由和各自的比较 2.配置文件所有的字母必须大写 3.if __name__的作用 4.核心对象循环引用的几种解决方式–难 5.Flask的经典错误 6.上下文管理器 7.flask的多线程和线程隔离 三种路由 方法1:装饰器 python C#, java 都可以用这种方式 from flask import F…

SSM整合(三) | 异常处理器 - 项目异常的处理方案

文章目录 异常处理器异常处理器快速入门项目异常处理 异常处理器 异常处理器快速入门 程序开发过程中不可避免的会遇到异常现象 出现异常现象的常见位置与常见原因如下: 框架内部抛出的异常:因使用不规范导致 数据层抛出的异常:因外部服务器…

使用Statsmodel进行假设检验和线性回归

如果你使用 Python 处理数据,你可能听说过 statsmodel 库。Statsmodels 是一个 Python 模块,它提供各种统计模型和函数来探索、分析和可视化数据。该库广泛用于学术研究、金融和数据科学。在本文中,我们将介绍 statsmodel 库的基础知识、如何…

【技巧】Excel序号设置自动更新

做Excel表格的时候,我们经常需要设置序号,在输入序号的时候,你是不是这样做?手动输入序号1,再向下填充,当遇到有不想要的内容,点删除后,发现中间的序号就不连贯了,再手动…

二十五、OSPF高级技术——开销值、虚链路、邻居建立、LSA、多进程

文章目录 调试指令(三张表)1、邻居表:dis ospf peer brief2、拓扑表(链路状态数据库):dis ospf lsdb3、路由表:dis ip routing-table 一、OSPF 开销值/度量值(cost)1、co…

代码审计笔记之开篇

思想 代码审计是从软件测试发展而来,早起一般采用常规软件测试与渗透测试的手段来发现源码漏洞,但是随着软件规模的越来越大,架构越来越复杂,安全漏洞和后门也越来越多越来越隐蔽,这使得传统的软件测试方法很难检出源…

【Java入门合集】第二章Java语言基础(一)

【Java入门合集】第二章Java语言基础(一) 博主:命运之光 专栏JAVA入门 学习目标 掌握变量、常量、表达式的概念,数据类型及变量的定义方法; 掌握常用运算符的使用; 掌握程序的顺序结构、选择结构和循环结构…

C/C++每日一练(20230501)

目录 1. 对链表进行插入排序 🌟🌟 2. 找出小于平均值的数 ※ 3. 二叉树的最大深度 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 对链表进行…

【五一创作】Apollo(入门)

Apollo(入门) Quick Start 配置中心是一种统一管理各种应用配置的基础服务组件 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且…

Springboot 实战一个依赖解决XSS攻击

1. 什么是XSS介绍 XSS: Cross Site Scripting,为不和层叠样式表(Cascading Style Sheets, CSS) 的缩写混淆,故将跨站脚本攻击缩写为XSS。 恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中 Web里面的Scrip…

【高并发】并发数据结构与多核编程

系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于多处理器编程的艺术进行的,每个知识点的修正和深入主要…

【JavaEE初阶】认识线程(Thread)

目录 🌾 前言 🌾 了解线程 🌈1.1 线程是什么? 🌈1.2 一些基本问题 🌾2、创建线程的方式 🌈 2.1 继承Thread类 🌈 2.2 实现Runnable接口并重写run()方法 🌈 注意…

有哪些好的学习方法?学霸们自己在用,却不愿意透露的

临近期末,很多家长都在跟我咨询,怎么才能提升孩子的学习效率? 原因就是,每天看着自己的孩子学习到深夜,但不少内容还是记不住, 学习和复习的效果非常的不理想。 今天,给大家分享的方法,是我自己一直也都在用的方法,效果非常的棒。 学长Ron,江苏某省重点高中毕业,高…

给公司搭建一个人才库系统,前台(信息填写+简历上传)后台(筛选功能+下载简历)

首先指出目前代码的不足之处: 如果公司使用,代码还存在风险问题,需要增加防火墙、防PHP攻击、后台加验证等操作 以下指南: 1.Mod Security 和 Fail2Ban 是开源的安全软件,您可以在宝塔面板上安装和配置这些软件来增强您…

【JUC】ThreadLocal

【JUC】ThreadLocal 文章目录 【JUC】ThreadLocal1. 概述2. Thread、ThreadLocal、ThreadLocalMap 关系2.1 Thread 和 ThreadLocal2.2 ThreadLocal 和 ThreadLocalMap2.3 三者之间的关系 1. 概述 ThreadLocal 提供线程局部变量。这些变量与正常的变量不同,因为每一…

Java 基础入门篇(一)—— Java 概述

文章目录 一、Java 概述二、Java 的产品 JDK2.1 JDK 安装2.2 Java与 Javac 介绍2.3 Java 程序的开发步骤 三、Java 程序的执行原理四、JDK 的组成五、Java 的跨平台工作原理 一、Java 概述 Java 是 sun 公司在 1995 年推出的一门计算机高级编程语言,其语言风格接近人…

音视频技术开发周刊 | 291

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 谷歌将 AI 芯片团队并入云计算部门 追赶微软和亚马逊 OpenAI推出的ChatGPT获得一定成功,微软是OpenAI的重要投资者,它将ChatGPT植入必应搜索&#…

Java 基础入门篇(三)—— 数组的定义与内存分配

文章目录 一、数组的定义1.1 静态初始化数组1.2 动态初始化数组1.3 数组的访问 二、数组的遍历三、数组的内存图 ★3.1 Java 的内存分配3.2 数组的内存图3.3 两个数组变量指向同一个数组对象 四、数组使用的常见问题补充:随机数 Random 类 一、数组的定义 数组就是…

机器视觉工程师职场四点“心态>交流=思路>知行合一”

视觉人机器视觉团队,他们热爱机器视觉行业,爱学习,爱分享。这一路上,首先感谢粉丝们805天一如既往的支持。我想团队拥有这些粉丝,是富有的,也是我们一直创作的动力。 是否记得毕业季,自己的豪言壮语。希望你毕业三年后,无论结果如何,不忘初心,继续前行。 机器视觉工程…