简单理解:分频系数

这段枚举代码里的数值是几进制的,核心结论先告诉你:这段枚举中没有显式写数值的部分,默认是十进制的整数序列,从 0 开始依次递增

枚举数值的详细解析

首先看这段枚举的定义规则:

  1. 显式赋值的部分CKCU_CKREFPRE_DIV2 = 0明确给第一个枚举常量赋值为十进制的0
  2. 隐式赋值的部分:后面的CKCU_CKREFPRE_DIV4CKCU_CKREFPRE_DIV6等没有写赋值,C 语言会自动按十进制整数依次递增,即:
    • CKCU_CKREFPRE_DIV4= 1(十进制)
    • CKCU_CKREFPRE_DIV6= 2(十进制)
    • ...
    • CKCU_CKREFPRE_DIV64= 31(十进制)

关键注意点

你可能会疑惑:枚举名里的DIV2DIV4是 “2 分频、4 分频”,但枚举值却是0、1、2...31,这两者不是直接对应的!

  • 枚举值(0、1、2...)是寄存器配置的索引值,底层硬件会根据这个索引值,映射到实际的分频系数(2、4、6...64);
  • 这些枚举值(十进制 0-31)最终写入寄存器时,会像我们之前聊的那样,被编译器转换成二进制(00000、00001、00010...11111)存储。

验证示例

你可以用一段简单的代码验证枚举值的实际数值(十进制):

#include <stdio.h> // 把你提供的枚举定义粘贴过来 typedef enum { CKCU_CKREFPRE_DIV2 = 0, // CK_REF时钟2分频 CKCU_CKREFPRE_DIV4, // CK_REF时钟4分频 CKCU_CKREFPRE_DIV6, // CK_REF时钟6分频 CKCU_CKREFPRE_DIV8, // CK_REF时钟8分频 CKCU_CKREFPRE_DIV64 // 仅保留最后一个,简化示例 } CKCU_CKREFPRE_TypeDef; int main() { // 打印枚举值的十进制结果 printf("CKCU_CKREFPRE_DIV2 = %d (十进制)\n", CKCU_CKREFPRE_DIV2); printf("CKCU_CKREFPRE_DIV4 = %d (十进制)\n", CKCU_CKREFPRE_DIV4); printf("CKCU_CKREFPRE_DIV8 = %d (十进制)\n", CKCU_CKREFPRE_DIV8); printf("CKCU_CKREFPRE_DIV64 = %d (十进制)\n", CKCU_CKREFPRE_DIV64); return 0; }

输出结果

CKCU_CKREFPRE_DIV2 = 0 (十进制) CKCU_CKREFPRE_DIV4 = 1 (十进制) CKCU_CKREFPRE_DIV8 = 3 (十进制) CKCU_CKREFPRE_DIV64 = 31 (十进制)

可以清晰看到,枚举值都是十进制整数,和枚举名里的 “2、4、8、64” 只是语义对应,数值上是从 0 开始的连续十进制数。

总结

  1. 这段枚举的数值是十进制:第一个值显式赋值为十进制 0,后续值默认按十进制依次 + 1;
  2. 枚举名中的 “DIV2/DIV4...” 是功能描述,和枚举的实际数值(0/1/2...)没有直接的数值对应关系;
  3. 这些十进制的枚举值最终写入寄存器时,会被编译器转换成二进制存储(比如十进制 31 转换成二进制 11111)。

你想知道枚举里的索引值(0、1、2...31)是如何对应到实际的分频系数(2、4、6...64)的,这其实是嵌入式开发中 “寄存器位值映射到硬件功能” 的核心逻辑。

分频系数的映射逻辑

首先明确核心关系:枚举值(索引)和实际分频系数是通过 “固定公式” 一一对应的,而非直接相等。从你的枚举定义能看出规律:

  • 枚举值0→ 分频系数2(0×2 + 2 = 2)
  • 枚举值1→ 分频系数4(1×2 + 2 = 4)
  • 枚举值2→ 分频系数6(2×2 + 2 = 6)
  • ...
  • 枚举值31→ 分频系数64(31×2 + 2 = 64)
公式总结
实际分频系数 = 枚举值 × 2 + 2

反过来也能推导:

枚举值 = (实际分频系数 - 2) / 2

硬件层面的实现原理

这些枚举值最终会被写入CKCU(时钟控制单元)对应的寄存器中,寄存器里会有专门的CKREFPRE位段(比如 5 个位,因为 31 的二进制是 11111),硬件电路会根据这个位段的数值,按照上面的公式计算出实际的分频系数,然后对CK_REF时钟进行分频。

直观的映射表

为了让你更清晰,整理了关键值的对应关系:

枚举常量枚举值(十进制)对应二进制实际分频系数计算公式
CKCU_CKREFPRE_DIV200000020×2+2=2
CKCU_CKREFPRE_DIV10400100104×2+2=10
CKCU_CKREFPRE_DIV3215011113215×2+2=32
CKCU_CKREFPRE_DIV6431111116431×2+2=64

实际编程中的使用示例

当你需要配置CK_REF时钟为 16 分频时,不会直接写数值 7(虽然 7×2+2=16),而是用枚举常量,代码可读性和可维护性会大幅提升:

// 假设配置CK_REF预分频寄存器的函数为CKCU_SetCKREFPrescaler // 需求:将CK_REF时钟配置为16分频 CKCU_SetCKREFPrescaler(CKCU_CKREFPRE_DIV16); // 底层硬件会拿到枚举值7,计算7×2+2=16,实现16分频

如果没有枚举,直接写数值 7:

// 可读性差,别人(甚至你自己)后续看代码时,无法快速知道7对应16分频 CKCU_SetCKREFPrescaler(7);

为什么要这样设计?

硬件厂商这么设计的核心目的:

  1. 简化硬件逻辑:用连续的索引值(0-31)对应寄存器的位段,硬件只需做一次 “×2+2” 的简单运算就能得到分频系数;
  2. 提升代码可读性:通过枚举常量名(DIV2/DIV4...)直接体现功能,避免程序员记忆 “数值 7 对应 16 分频” 这类无意义的映射;
  3. 避免错误:枚举限定了只能用预定义的有效值(0-31),防止写入非法值(比如 32)导致硬件异常。

总结

  1. 枚举值(0-31)和实际分频系数(2-64)的核心映射公式是:分频系数 = 枚举值 × 2 + 2
  2. 枚举值是写入寄存器的 “索引值”,硬件会根据这个索引值计算出实际的分频系数;
  3. 编程时应使用枚举常量(如 CKCU_CKREFPRE_DIV16)而非直接写数值,保证代码可读性和安全性。

你想弄明白为什么枚举值和分频系数的映射公式是实际分频系数 = 枚举值 × 2 + 2,而不是其他形式,这个问题触及了硬件设计和枚举定义的底层逻辑,核心原因可以从硬件实现软件封装两个维度来解释。

一、核心原因:硬件的 “分频逻辑” 决定了公式形态

首先要明确:这个公式不是软件随便定义的,而是硬件电路的分频规则直接决定的,枚举只是对硬件规则的 “适配性封装”。

1. 硬件分频器的基础逻辑

对于CK_REF这类时钟分频器,硬件电路的设计通常遵循两个核心约束:

  • 约束 1:这个分频器只支持偶数分频(2、4、6...64),不支持奇数分频(1、3、5...)—— 因为偶数分频的硬件电路更简单、稳定,时钟抖动更小;
  • 约束 2:寄存器中用于配置分频的位宽是5 位(二进制00000~11111),能表示的十进制范围是0~31,共 32 个值,刚好对应 32 种分频系数(2~64,步长 2)。
2. 公式的推导过程

硬件需要用 5 位寄存器的数值(记为N,即枚举值),映射到 32 个偶数分频系数(2~64),推导过程:

  • 第一步:先把分频系数的范围从2~64转换成0~62(减去最小值 2),得到分频系数-2
  • 第二步:因为步长是 2(每次加 2),所以用(分频系数-2)/2就能得到连续的整数0~31(刚好匹配 5 位寄存器的取值范围);
  • 第三步:反向推导就得到分频系数 = N×2 + 2N是寄存器值 / 枚举值)。
直观的数学验证
寄存器值 N(枚举值)N×2+2(分频系数)对应硬件功能
00×2+2=22 分频
11×2+2=44 分频
.........
3131×2+2=6464 分频

二、软件枚举的封装逻辑:让代码更易理解

硬件寄存器的数值是0~31,但对程序员来说,0代表 “2 分频”、1代表 “4 分频” 完全不直观,所以芯片厂商做了两个关键设计:

  1. 枚举命名贴合实际功能:把0命名为CKCU_CKREFPRE_DIV2(直接体现 2 分频),1命名为CKCU_CKREFPRE_DIV4(直接体现 4 分频),避免程序员记忆 “0=2 分频” 这类无意义的映射;
  2. 枚举值直接复用寄存器值:枚举值不重新定义(比如不把DIV2赋值为 2、DIV4赋值为 4),而是直接用寄存器的原始值0~31—— 这样在写入寄存器时,不需要额外的转换,直接把枚举值写入即可,减少代码开销。

三、如果公式不是这样,会发生什么?

假设强行把公式改成分频系数 = N(即枚举值直接等于分频系数),会出现两个问题:

  1. 硬件层面:5 位寄存器只能表示0~31,无法覆盖32~64的分频系数,需要扩展寄存器位宽(比如 6 位),增加硬件成本;
  2. 软件层面:枚举需要定义DIV2=2DIV4=4...DIV64=64,写入寄存器时需要先做(N-2)/2的转换,增加代码复杂度,且容易出错。

四、同类硬件设计的通用规律

不只是这个分频器,几乎所有嵌入式芯片的时钟分频枚举都遵循这个逻辑:

  • 枚举值 = 寄存器原始值(直接可写入寄存器);
  • 枚举名 = 实际硬件功能(分频系数、时钟源等);
  • 映射公式 = 硬件电路的逻辑决定(步长、取值范围)。

总结

  1. 公式分频系数 = 枚举值×2+2本质是硬件约束决定的:5 位寄存器(0~31)要映射 32 个偶数分频系数(2~64),这是最简洁的数学映射方式;
  2. 枚举值直接复用寄存器的原始值(0~31),避免软件写入寄存器时的额外转换;
  3. 枚举名直接体现实际分频系数,是为了让程序员不用记忆 “寄存器值 - 功能” 的映射关系,提升代码可读性。

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

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

相关文章

风电功率日前场景生成方法探索

风电功率日前场景生成方法 随着可再生能源渗透率的不断提高&#xff0c;如何有效地描述其出力不确定性是电力系统日前调度所面临的巨大挑战。 针对该问题&#xff0c;提出一种基于条件生成对抗网络的可再生能源日前场景生成方法。 完美复现《基于条件生成对抗网络的可再生能源日…

基于IEEE 33节点的配电网经济调度 设备包括光伏,风电,燃气轮机,柴油发电机和储能 以综合...

基于IEEE 33节点的配电网经济调度 设备包括光伏&#xff0c;风电&#xff0c;燃气轮机&#xff0c;柴油发电机和储能 以综合成本最优为目标 包括各设备的调用成本和购电费用以及环境费用 考虑各设备的运行约束和潮流约束 其中潮流使用前推回代法计算 代码可保证完美运行 这年头…

改进A星算法,机器人路径规划导航A星算法和DWA算法融合,可以实现动态避障,有算法matlab...

改进A星算法&#xff0c;机器人路径规划导航A星算法和DWA算法融合&#xff0c;可以实现动态避障&#xff0c;有算法matlab源文件&#xff0c;可以直接用。清晨调试机器人底盘时突然想到&#xff0c;传统A星就像拿着纸质地图的旅行者——规划好的路线遇到临时障碍就傻眼了。上个…

MMC玩转指南:从零搭建20kV直流输电系统

MMC-HVDC两端直流输电&#xff0c;直流电压20kV/每桥臂10个子模块&#xff0c;系统容量10WM。 包括系统级控制&#xff0c;换流站级控制&#xff0c;阀级控制等。 matlab/simulink学习MMC必备&#xff0c;整流逆变&#xff0c;环流抑制/子模块电容排序均压/最近电平逼近/优化调…

提示工程分布式架构的自动化运维:Ansible vs Terraform,批量管理节点

深入剖析&#xff1a;Ansible vs Terraform&#xff0c;分布式架构的自动化运维核心利器与提示工程实践 在分布式架构大行其道的今天&#xff0c;面对动辄几十、数百乃至上千节点的部署和管理挑战&#xff0c;如何实现高效、一致、安全的运维操作成为每个架构师和运维工程师的核…

【水下图像增强融合算法】基于融合的水下图像与视频增强研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真…

Vue3 系列教程(三)插值表达式与常用文本指令

前言 第2课已掌握Vue3应用的创建、挂载及单文件组件的基础结构&#xff0c;本课将聚焦Vue3中最基础的页面渲染方式——插值表达式与文本指令&#xff0c;理解不同文本渲染方式的使用规则与适用场景&#xff0c;掌握基础数据到页面的渲染逻辑&#xff0c;为后续动态数据展示打下…

大模型微调教程(一)大模型微调基础认知+零基础环境搭建

前言 欢迎来到大模型微调的入门课堂&#xff01;对于初学者来说&#xff0c;入门的关键不是 “学得多快”&#xff0c;而是 “学得扎实”。这节课我们会先花时间把微调的核心概念砸实 —— 用生活化的场景帮你理解 “预训练模型”“Tokenizer”“显存” 这些关键术语&#xff…

Finisar AOC/DAC 在高速网络互连中的应用解析

在当今数据中心与大规模计算平台中&#xff0c;高速链路互连已经成为网络性能瓶颈之一。为了实现服务器、交换机、存储等设备之间的高带宽、低延迟通信&#xff0c;光模块和高速线缆成为关键部件。Finisar Corporation 是一家专注于光通信组件制造的公司&#xff0c;其包括 AOC…

完整教程:Android 宣布 Runtime 编译速度史诗级提升:在编译时间上优化了 18%

完整教程:Android 宣布 Runtime 编译速度史诗级提升:在编译时间上优化了 18%pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fa…

2026制动改装品牌榜 CMYCH卡钳性能对比

2026制动改装品牌榜 CMYCH卡钳性能对比2026制动改装品牌榜 CMYCH卡钳性能对比 一、行业背景与筛选维度 根据《中国汽车改装技术标准与服务白皮书》2025版数据,国内汽车制动改装市场规模突破320亿元,年复合增长率达18…

Amphenol CS(High Speed IO)PCIe 与 QSFP 高速 IO 线缆设计与选型实践

在现代高性能计算、数据中心互联和通信系统中&#xff0c;高速 IO 线缆是实现可靠数据传输的关键基础构件。随着 PCIe 及 QSFP 等高速协议的广泛应用&#xff0c;对线缆的信号完整性、阻抗匹配、串扰抑制以及环境适应性提出了更高要求。 Amphenol CS&#xff08;High Speed IO&…

服务器互联中的 Amphenol ICC(FCI)电缆组件选型逻辑

在服务器互联、存储设备和数据通信架构中&#xff0c;连接器与电缆组件构成了设备之间传输链路的关键一环。Amphenol ICC&#xff08;原 FCI&#xff09; 是全球互连系统解决方案的知名供应者&#xff0c;其推出的电缆组件与连接器体系因卓越的可靠性和工程适配性&#xff0c;在…

ATGBICS 光模块兼容光缆选型与互连兼容性测试指南

在现代数据通信和网络架构中&#xff0c;光模块及其互连光缆是高带宽链路不可或缺的组成部分。随着行业标准&#xff08;如 SFP、QSFP、OSFP 等 MSA 规范&#xff09;的成熟&#xff0c;基于光纤的高速互连技术在数据中心、企业网络、服务器通信等场景中得到广泛应用。光缆组件…

Maxwell或者motorcad建模仿真 1、电机电磁设计仿真; 2、可提供设计报告或ans...

Maxwell或者motorcad建模仿真 1、电机电磁设计仿真&#xff1b; 2、可提供设计报告或ansysEM源文件等&#xff1b;报告包含反电势&#xff0c;LDLQ&#xff0c;齿槽转矩&#xff0c;效率map等客户需要的参数&#xff0c;以及退磁仿真等等&#xff1b; 3、可提供3D和2D图纸结构设…

基于SpringBoot的企业级进销存ERP系统Java源码

基于springBoot企业级进销存ERP系统源码 java源码 Spring Boot的企业级进销存系统开发中&#xff0c;最让人头疼的不是功能实现&#xff0c;而是如何在高并发场景下保证库存数据的准确性。去年我们团队重构老系统时&#xff0c;曾在促销活动中出现过库存超卖500件的重大事故—…

探秘综合能源系统:供需双响应与碳交易的完美邂逅

关键词:供需灵活双响应;可替代性负荷;阶梯式碳交易;综合能源系统;有机朗肯循环 主题:考虑阶梯式碳交易与供需灵活双响应的综合能源系统优化调度。 提出了供需灵活双响应机制&#xff0c;供应侧引入有机朗肯循环实现热电联产机组热电输出的灵活响应&#xff0c;需求侧在考虑电热…

玩转风光储并网系统建模

风光储并网系统 matlab/simulink风光储能并网交直流发电系统仿真模型&#xff0c;2018a版本&#xff0c;2021a版本 1&#xff09;光伏和风电均采用扰动观察法最大功率跟踪 2&#xff09;蓄电池为双向DC-DC变换器&#xff0c;采用电压环和电流环控制的双闭环控制&#xff0c;且电…

西门子plc巅峰应用,大型包膜机程序控制,常见的气缸,通讯,机械手,模拟量等,各种FB块,可用...

西门子plc巅峰应用,大型包膜机程序控制&#xff0c;常见的气缸&#xff0c;通讯&#xff0c;机械手&#xff0c;模拟量等&#xff0c;各种FB块&#xff0c;可用来参考和学习 软件博图&#xff0c;威纶通触摸屏&#xff0c;网络结构可参考图一&#xff0c;PTO控制20个轴&#xf…

基于hadoop的商城推荐系统 大数据个性化商城推荐 协同过滤推荐 推荐原理:每天定时更新数据集

基于hadoop的商城推荐系统 大数据个性化商城推荐 协同过滤推荐 推荐原理&#xff1a;每天定时更新数据集&#xff0c;数据集为当然商城中用户的订单信息&#xff0c;将数据集保存在hadoop的hdfs文件系统中&#xff0c;并触发计算&#xff0c;根据余弦相似度计算用户间的相似度&…