基于stm32f407zgt6与cubemx的频率计实现
时间: 2025-05-24 11:15:20 浏览: 15
### 基于STM32F407ZGT6和CubeMX实现频率计
#### 1. 系统概述
利用STM32F407ZGT6微控制器配合ST官方工具STM32CubeMX可以快速搭建一个频率计项目。此方案主要依赖外部中断捕获功能来测量输入信号的周期或频率,通过计算单位时间内脉冲数量得出目标信号的频率。
#### 2. 主要模块说明
##### (1) 外部中断配置
为了检测输入信号的变化沿(上升沿或者下降沿),需要启用GPIO端口上的EXTI线触发机制。具体操作可以通过STM32CubeMX图形界面完成初始化设置[^5]。
##### (2) 定时器TIMx作为时间基准
选择其中一个通用定时器(如TIM2)工作在向上计数模式下,设定其自动重装载寄存器ARR值以及预分频系数PSC从而决定每秒钟发生多少次更新事件。这将为我们提供精确的时间间隔用于后续处理逻辑中的频率换算过程[^3]。
```c
// 初始化 TIM2 为基本定时器模式
void MX_TIM2_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 8399; // 设置 PSC=8399 对应约 1ms 的滴答周期
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999; // ARR=999 即总时间为 1s
...
}
```
##### (3) 中断服务程序ISR编写
每当捕捉到一次有效边沿变化后进入对应通道的回调函数,在其中记录当前时刻并累加计数值直到满足一定条件为止再清零重新开始新一轮统计动作[^6]。
```c
uint32_t pulseCount = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
static uint32_t lastCaptureTime = 0;
uint32_t currentCaptureTime = __HAL_TIM_GET_COUNTER(&htim2);
if((currentCaptureTime - lastCaptureTime) >= MIN_PULSE_WIDTH_US){
pulseCount++;
lastCaptureTime = currentCaptureTime;
}
}
float getFrequency(){
float freq = ((float)pulseCount / PERIOD_IN_SEC);
pulseCount = 0; // 清零以便下次测量
return freq;
}
```
#### 3. 测试验证流程
按照上述步骤完成后编译下载固件至开发板运行测试即可观察实际效果是否符合预期需求[^7]。
---
阅读全文
相关推荐


















