新唐MCU技术
直播中

哈哈哈

11年用户 963经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

请问如何知道当前的CPU和外设频率?

如何知道当前的CPU和外设频率?

回帖(2)

王晋

2025-8-21 17:31:39
在 NuMicro® 系列微控制器 (MCU) 中,I/O 设计有 CKO 功能(时钟输出)。I/O多功能引脚功能切换到CKO后,可以使用示波器测量I/O,观察CPU和外设频率。由于 I/O 压摆率限制,可能无法输出非常高的频率。因此,用户可以在测量前使用CKO函数的预分频器将输出频率除以一个数字。
此外,在 Power-down 模式下,用户还可以使用 CKO 观察 CPU 频率是否停止,并确认是否实际进入了 Power-down 模式。

以M031系列为例,用户可以参考BSP中的CLK_ClockDetector样品。从 BSP 中的 clk.c 文件中,您可以找到 CLK_EnableCKO() 函数。该功能可用于通过CX引脚测量HXT、LXT、HCLK、HIRC、LIRC、PLL和SOF的信号。

将 PB14 切换到 CKO 功能
SYS->GPB_MFPH = (SYS->GPB_MFPH & ~SYS_GPB_MFPH_PB14MFP_Msk) | SYS_GPB_MFPH_PB14MFP_CLKO;
打开 CKO 输出并输出 HCLK 信号。该信号将除以第二位和第三位数字。
CLK_EnableCKO(CLK_CLKSEL1_CLKOSEL_HCLK,1,0);
举报

李霞

2025-8-25 17:46:06

在嵌入式系统中,获取CPU和外设时钟频率的方法取决于具体的硬件平台和操作系统。以下是常见的三种场景及对应的解决方案:




1. 查看设备树配置(适用于Linux嵌入式系统)


设备树(Device Tree)是Linux嵌入式系统中描述硬件资源的配置文件,包含CPU和外设的时钟信息。



  • 查看CPU频率
    cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq  # 最大频率
    cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq  # 最小频率
    cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq  # 当前频率


  • 查看外设频率
    定位设备树中的时钟节点(如 clocks),查看相关配置:


    # 列出所有时钟节点
    ls /sys/kernel/debug/clk/

    # 查看特定时钟频率(例如UART时钟)
    cat /sys/kernel/debug/clk/uart_clk/clk_rate





2. 读取硬件寄存器(裸机开发或RTOS)


通过直接访问芯片的时钟控制寄存器获取频率(以ARM Cortex-M为例):


CPU频率


// STM32通过RCC寄存器获取系统时钟
uint32_t sysclk = HAL_RCC_GetSysClockFreq();  // 系统时钟
uint32_t hclk = HAL_RCC_GetHCLKFreq();        // CPU核心时钟

外设频率


// 获取APB1总线时钟(连接UART, SPI等)
uint32_t pclk1 = HAL_RCC_GetPCLK1Freq();  
// 获取APB2总线时钟(连接高速外设)
uint32_t pclk2 = HAL_RCC_GetPCLK2Freq();


注意:具体寄存器和函数需参考芯片手册(如STM32的RCC章节)。





3. 使用操作系统工具(Linux桌面/服务器)


CPU频率


# 查看所有CPU核心的当前频率
lscpu | grep "MHz"
cat /proc/cpuinfo | grep "MHz"
watch -n 1 "cat /proc/cpuinfo | grep 'MHz'"

# 动态监控频率变化
sudo apt install cpufrequtils
cpufreq-info

外设频率


通过dmidecode或芯片厂商工具(如Intel的turbostat):


sudo dmidecode -t processor | grep Speed
sudo turbostat --show PkgTmp,GFXMHz  # 查看GPU频率



4. 示波器测量(通用硬件方法)


若软件无法获取,可直接测量时钟引脚:



  1. CPU主频:测量晶振或时钟发生器输出引脚(如OSC_IN)。

  2. 外设频率:测量I²C/SPI的SCLK、UART的波特率时钟引脚。
    注意:需根据数据手册确定测试点。




总结方法



























场景 方法
Linux嵌入式系统 查看 /sys/kernel/debug/clk/ + 设备树配置
裸机/RTOS开发 调用厂商库函数(如STM32的HAL_RCC_GetPCLK1Freq())或直接读寄存器
Linux桌面/服务器 lscpu/proc/cpuinfocpufrequtils
硬件测量 示波器测量时钟信号引脚

关键提示:  



  • 寄存器名称和路径因芯片型号差异较大,务必查阅对应《参考手册》。  

  • 操作系统工具可能需安装额外包(如cpufrequtils)。  

  • 优先使用厂商提供的SDK函数(如STM32CubeMX生成的代码)。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分