在嵌入式系统中,获取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. 示波器测量(通用硬件方法)
若软件无法获取,可直接测量时钟引脚:
- CPU主频:测量晶振或时钟发生器输出引脚(如OSC_IN)。
- 外设频率:测量I²C/SPI的SCLK、UART的波特率时钟引脚。
注意:需根据数据手册确定测试点。
总结方法
场景 |
方法 |
|---|
Linux嵌入式系统 |
查看 /sys/kernel/debug/clk/ + 设备树配置 |
裸机/RTOS开发 |
调用厂商库函数(如STM32的HAL_RCC_GetPCLK1Freq())或直接读寄存器 |
Linux桌面/服务器 |
lscpu、/proc/cpuinfo、cpufrequtils |
硬件测量 |
示波器测量时钟信号引脚 |
关键提示:
- 寄存器名称和路径因芯片型号差异较大,务必查阅对应《参考手册》。
- 操作系统工具可能需安装额外包(如
cpufrequtils)。
- 优先使用厂商提供的SDK函数(如STM32CubeMX生成的代码)。
在嵌入式系统中,获取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. 示波器测量(通用硬件方法)
若软件无法获取,可直接测量时钟引脚:
- CPU主频:测量晶振或时钟发生器输出引脚(如OSC_IN)。
- 外设频率:测量I²C/SPI的SCLK、UART的波特率时钟引脚。
注意:需根据数据手册确定测试点。
总结方法
场景 |
方法 |
|---|
Linux嵌入式系统 |
查看 /sys/kernel/debug/clk/ + 设备树配置 |
裸机/RTOS开发 |
调用厂商库函数(如STM32的HAL_RCC_GetPCLK1Freq())或直接读寄存器 |
Linux桌面/服务器 |
lscpu、/proc/cpuinfo、cpufrequtils |
硬件测量 |
示波器测量时钟信号引脚 |
关键提示:
- 寄存器名称和路径因芯片型号差异较大,务必查阅对应《参考手册》。
- 操作系统工具可能需安装额外包(如
cpufrequtils)。
- 优先使用厂商提供的SDK函数(如STM32CubeMX生成的代码)。
举报