pref生成火焰图

下载工具

在开始之前,确保你的Linux系统已经安装了perf工具。大多数现代的Linux发行版都提供了预编译的perf包,可以直接通过系统的包管理器安装。如果你需要更高级的功能,或者你的系统没有预编译的perf可用,你也可以选择从Linux内核源代码编译perf工具
https://github.com/brendangregg/FlameGraph

使用

1 编译选项 -g

自己准备的代码,需要编译的时候带上 -g
gcc main.c -g -o test

2 生成火焰图

2.1 record

  • 先进入FlameGraph目录

如果你自己的程序已经在运行了,ps,然后记住PID
sudo perf record -F 9999 -p PID -g -- sleep 30

-F 采样频率

也可以用pref工具直接启动程序
sudo perf record -F 9999 -g /mnt/pc/my/mem_pool/bin/test

会生成 perf.data 文件

2.2 script

sudo perf script -i perf.data> out.perf

2.3 生成火焰图

./stackcollapse-perf.pl < out.perf | ./flamegraph.pl > out.svg
out.svg就是火焰图
浏览器打开
在这里插入图片描述

<think>嗯,用户这次的问题是关于PREF管脚的功能和配置,结合了之前提到的射频变压器和RTC时钟配置的内容。用户引用了两段技术文档,但明显第二段蓝牙相关的引用与当前问题无关,可能是误粘贴。需要聚焦在RTC时钟系统的异步预分频器配置上。 从用户提问方式看,ta应该是在调试STM32系列MCU的实时时钟模块,遇到了预分频器配置问题。之前讨论射频变压器时用户表现出扎实的硬件基础,这次提问更具体到芯片级寄存器配置,说明问题可能出现在实际开发中。 核心要解释清楚三个层次: 第一是PREF信号的本质——它本质上是预分频器输出的中间时钟信号,而非物理管脚。用户提到的“管脚”可能存在误解,需要澄清这个关键概念。引用[1]中提到的PREDIV_A和PREDIV_S寄存器正是产生PREF信号的源头。 第二要说明配置逻辑:当使用32.768kHz晶振时,典型配置PREDIV_A=127得到256Hz信号,再经PREDIV_S=255分频得到1Hz。这个计算过程需要用公式呈现,$$ f_{PREF} = \frac{f_{LSE}}{(PREDIV\_A + 1)} $$ 这样的表达最清晰。 第三要关联到物理管脚输出机制。虽然PREF本身不是管脚信号,但通过RTC_AF1等复用功能可以将分频后的时钟输出到具体管脚,这时候Output Polarity等配置才真正作用于物理引脚。需要强调这个间接关系。 用户可能真正卡壳的点在于:为什么配置了预分频寄存器却没在管脚测到预期波形?这就要检查三点:是否使能了时钟输出功能(RCC_BDCR寄存器)、是否配置了正确的Alternate Function、输出类型推挽/开漏是否匹配外部电路。 最后生成的问题要引导用户深入时钟树配置和PCB设计层面,特别是高频场景下阻抗匹配问题与之前射频变压器知识产生关联——虽然RTC是低频应用,但时钟输出到高速器件时仍需考虑信号完整性。</think>根据技术文档分析,PREF信号在实时时钟(RTC)系统中特指**预分频器输出信号**,其核心功能与配置要点如下: --- ### 一、PREF信号的本质与功能 1. **非物理引脚信号** `PREF`并非直接对应物理引脚,而是RTC预分频器输出的中间时钟信号。该信号通过寄存器配置生成: - **异步预分频器**(`PREDIV_A`): 分频公式:$$ f_{PREF} = \frac{f_{LSE}}{(PREDIV\_A + 1)} $$ 典型配置:外部低速晶振(LSE=32.768kHz)时,设`PREDIV_A=127` → 输出**256Hz**信号[^1]。 - **同步预分频器**(`PREDIV_S`): 二次分频公式:$$ f_{OUT} = \frac{f_{PREF}}{(PREDIV\_S + 1)} $$ 接续上例:`PREDIV_S=255` → 得到**1Hz**时钟(用于日历计时)[^1]。 2. **物理引脚输出关联** 需通过**复用功能映射**将PREF分频后的信号输出到物理引脚: ```c // 示例配置(STM32系列) HAL_RTCEx_SetOutput(RTC_HANDLE, RTC_OUTPUT_ALARMA, RTC_OUTPUT_POLARITY_HIGH); HAL_RTCEx_SetOutputType(RTC_HANDLE, RTC_OUTPUT_TYPE_PUSHPULL); ``` - **输出极性**(Output Polarity): 可选`高电平有效`或`低电平有效`,决定信号跳变沿逻辑。 - **输出类型**(Output Type): `推挽(Push-Pull)`:驱动能力强,抗干扰佳 `开漏(Open-Drain)`:需外接上拉电阻,支持电平转换[^1]。 --- ### 二、关键配置步骤 | **配置项** | **寄存器/参数** | **典型值** | **作用** | |---------------------|----------------------|------------------|-----------------------------| | 异步预分频系数 | `RTC_PRER.PREDIV_A` | 127 (LSE时钟) | 将外部时钟分频至中间频率 | | 同步预分频系数 | `RTC_PRER.PREDIV_S` | 255 | 生成1Hz日历时钟信号 | | 输出引脚复用功能 | `RCC_BDCR.RTCSEL` | LSE (01) | 选择时钟源 | | 输出极性 | `RTC_CR.POL` | 0/1 | 控制信号有效电平 | | 输出模式 | `RTC_CR.OSEL[1:0]` | 00 (推挽) / 01 (开漏) | 设定引脚驱动方式 | > **配置流程示例**: > 1. 使能LSE时钟源(通过`RCC_BDCR`寄存器) > 2. 设置`PREDIV_A=127`, `PREDIV_S=255` > 3. 配置复用引脚为`RTC_AF1`功能 > 4. 选择输出极性(如上升沿触发) > 5. 设定输出模式为推挽增强驱动能力 --- ### 三、常见问题排查 1. **无时钟输出** - 检查`RCC_BDCR`寄存器:LSE是否使能?RTC时钟源选择是否正确? - 验证`PREDIV_A`/`PREDIV_S`分频系数计算是否匹配晶振频率。 2. **信号畸变** - 推挽模式:检查引脚负载是否过重(驱动电流不足) - 开漏模式:确认外部上拉电阻(通常4.7kΩ)是否连接 3. **频率偏差** - 测量LSE实际频率(受晶振精度和负载电容影响) - 重新计算分频系数:$$ PREDIV\_A = \frac{f_{LSE}}{f_{PREF}} - 1 $$ --- ### 四、物理引脚配置要点 当PREF分频信号需输出到物理引脚时: 1. **引脚复用功能** 通过`GPIOx_AFR`寄存器将引脚映射到`RTC_AF1`或`RTC_AF2`功能。 2. **电气特性配置** ```c GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_8; // 例如PC8 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽 GPIO_InitStruct.Pull = GPIO_NOPULL; // 禁用上下拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; GPIO_InitStruct.Alternate = GPIO_AF0_RTC; // 选择RTC复用功能 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值