09 FIR操作
up的视频讲解配置 ADC 与 DMA 采样,导入 FIR 驱动,再用 SerialPie 生成系数并观察滤波波形。
up视频里的实验代码: 👣FIR实验代码
FIR驱动代码: FIR驱动代码
1 🔌 硬件连接(复用)

2 🖥️ 软件操作
1 CubeMX配置
新建工程与选择芯片
打开 STM32CubeMX,点击 File → New Project,搜索 STM32F103C8T6,双击对应芯片创建工程。


配置下载接口与时钟
在 System Core → SYS 中,将 Debug 设置为 Serial Wire。再进入 RCC,将 HSE 设置为 Crystal/Ceramic Resonator。


进入 Clock Configuration,按图将主频设置为 72 MHz。若出现时钟求解提示,按图确认,再核对调整后的主频与 ADC 时钟配置。

配置ADC
打开 Analog → ADC1,勾选 IN1(PA1),按图将规则组的外部触发源选择为 Timer 3 Trigger Out event。



展开 Rank,将通道 1 的 Sampling Time 设置为 7.5 Cycles。

配置DMA
进入 DMA Settings,点击 Add 并选择 ADC1,添加 ADC 的 DMA 请求。

配置TIM3触发
打开 Timers → TIM3,启用 Internal Clock。在参数页中,将 Prescaler 设置为 72 - 1,Counter Period 设置为 200 - 1。


在 Trigger Output (TRGO) Parameters 中,将 Trigger Event Selection 设置为 Update Event,对应 触发ADC。

配置串口
打开 Connectivity → USART1,将模式设置为 Asynchronous。

生成工程
进入 Project Manager,填写工程名与保存位置,工具链选择 MDK-ARM。

在 Code Generator 中,按图选择只复制需要的库文件,并勾选为每个外设生成独立的 .c/.h 文件。

点击 GENERATE CODE,生成完成后点击 Open Project,进入 MDK。

2 MDK配置
下载并放入FIR驱动
从本页的 FIR 驱动下载入口获取压缩包,解压后把 FIR 驱动文件夹放入工程目录,位置参考下图。


添加头文件路径与工程文件
打开 Options for Target → C/C++,在 Include Paths 中添加 FIR 驱动文件夹。

打开工程文件管理窗口,新建 FIR 分组,点击 Add Files 并进入驱动目录。按图切换文件类型,选择驱动文件并添加到分组。


设置MicroLIB
进入 Options for Target → Target,按视频工程配置勾选 Use MicroLIB,然后确认保存。

3 实验代码
全局
#include <stdio.h>
#include "FIR.h"
// ADC采样缓存
#define DATA_SIZE 256
uint16_t adc_dma_buf[DATA_SIZE];
//DMA传输完成中断
volatile uint8_t flag = 0;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if (hadc->Instance == ADC1) flag = 1;
}
// printf输出重定向
int fputc(int ch, FILE *f)
{
uint8_t temp = ch;
HAL_UART_Transmit(&huart1, &temp, 1, HAL_MAX_DELAY);
return ch;
}
main()
HAL_TIM_Base_Start(&htim3);
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)adc_dma_buf,DATA_SIZE);//在CubeMX中配置的单次传输
while(1)
if (flag)
{
// 分帧采样有间隔,每帧复位;
fir_filter_reset();
for (uint16_t i = 0; i < DATA_SIZE; i++)
{
int16_t filtered = fir_filter_run(adc_dma_buf[i],h,a);
printf("%d\r\n", filtered);
}
flag = 0;
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_dma_buf,DATA_SIZE);//重新打开DMA
}
4 生成FIR滤波系数
在SerialPie中设置滤波器
打开 SerialPie 的“滤波”页面,选择 FIR进行参数配置。
| 采样率 | 5000 Hz | 滤波类型 | 带通 |
|---|---|---|---|
| 下限频率 | 162.250 Hz | 上限频率 | 239.500 Hz |
| 抽头数 | 63 | 窗函数 | 汉明窗 Hamming |

复制系数到工程
向下滚动到系数区域,系数类型选择 int16_t,点击 FIR 一侧的“复制”。回到 MDK,按图把生成的系数粘贴到 main.c 的全局区域。


3 ♒️ 实验效果
完成上述配置与代码填写后,编译并下载工程。打开 SerialPie,连接开发板对应的串口,保持串口参数与工程配置一致,切换到“波形”页面查看输出。下图为视频操作中的波形画面。
