STM32Duino音频频谱分析仪代码解析与错误解决

本文将解析一段使用STM32Duino实现音频频谱分析仪功能的代码,并针对编译过程中出现的错误提供解决方案。

代码功能

这段代码旨在创建一个基于STM32Duino的音频频谱分析仪,主要功能包括:

  • 使用MSGEQ7芯片采集音频信号并进行频谱分析;* 使用WS2812B LED灯带实时显示音频频谱;* 通过检测电压来自动开启/关闭PWM输出;* 使用轻触开关控制WS2812B灯光效果和音乐频谱功能。

代码解析

以下是代码的主要部分和功能说明:cpp#include <Arduino.h>

// 定义引脚连接#define MSGEQ7_DATA_PIN PA7#define MSGEQ7_STROBE_PIN PA4#define MSGEQ7_RESET_PIN PA3#define BOOST_VOLTAGE_PIN PA11#define PWM_OUTPUT_PIN PA10#define VOLTAGE_DETECT_PIN PA14#define SWITCH_PIN PA6#define WS2812B_PWM_PIN PA17

// ... 函数定义 ...

// 全局变量volatile uint16_t adc_value[7]; // 存储音频数据volatile uint16_t boost_voltage; // 存储升压电路的基准电压

int main(void) { // ... 初始化配置 ...

while (1) { // 检测电压 if (digitalRead(VOLTAGE_DETECT_PIN) == LOW) { // 没有检测到电压,开启PWM输出 TIM3->CR1 |= TIM_CR1_CEN; // 开启TIM3 } else { // 检测到电压,停止PWM输出 TIM3->CR1 &= ~TIM_CR1_CEN; // 关闭TIM3 }

// 检测轻触开关    if (digitalRead(SWITCH_PIN) == HIGH) {      static uint8_t press_count = 0;      press_count++;

  if (press_count == 1) {        // 第一次按下,控制WS2812B灯光效果的PWM        TIM1->CR1 |= TIM_CR1_CEN;  // 开启TIM1      } else if (press_count == 2) {        // 第二次按下,开启音乐频谱功能        // TODO: 实现音乐频谱功能的代码      } else if (press_count == 3) {        // 第三次按下,关闭WS2812B灯光效果的PWM        TIM1->CR1 &= ~TIM_CR1_CEN;  // 关闭TIM1        press_count = 0;      }    }  }}

// ... 函数实现 ...

  • 首先,代码定义了各个功能模块所使用的引脚连接,包括MSGEQ7、升压电路、PWM输出、电压检测和轻触开关等。- 在main函数中,首先进行GPIO、ADC、定时器和WS2812B PWM的初始化配置。- 之后进入主循环,循环检测电压和轻触开关的状态。- 当检测到电压低于阈值时,开启PWM输出,为音频放大电路供电。- 轻触开关用于控制WS2812B灯光效果和音乐频谱功能,可通过多次点击实现不同的功能切换。

错误解决

在STM32Duino环境下编译这段代码时,可能会遇到以下两个错误:

  1. **error: 'GPIO_Pin_14' was not declared in this scope; did you mean 'GPIO_PIN_14'?**2. error: 'TIM_Cmd' was not declared in this scope

错误原因分析

  • 第一个错误是因为在STM32Duino中,引脚定义使用GPIO_PIN_X的格式,而不是GPIO_Pin_X。- 第二个错误是因为STM32Duino没有直接提供TIM_Cmd函数,需要使用寄存器操作来控制定时器的开启和关闭。

解决方法

  • 将代码中所有的GPIO_Pin_X替换为GPIO_PIN_X。- 使用TIMx->CR1 |= TIM_CR1_CEN;来开启定时器TIMx,使用TIMx->CR1 &= ~TIM_CR1_CEN;来关闭定时器TIMx。

修改后的代码cpp#include <Arduino.h>

// ... 引脚定义 (已修改) ...

#define VOLTAGE_DETECT_PIN GPIO_PIN_14// ... 其他引脚定义 ...

// ... 函数定义 ...

int main(void) { // ... 初始化配置 ...

while (1) { // ... 电压检测 ...

if (digitalRead(VOLTAGE_DETECT_PIN) == LOW) {      // ...    }

// ... 轻触开关检测 ...

if (press_count == 1) {      // 第一次按下,控制WS2812B灯光效果的PWM      TIM1->CR1 |= TIM_CR1_CEN;  // 开启TIM1    } else if (press_count == 2) {      // ...    } else if (press_count == 3) {      // 第三次按下,关闭WS2812B灯光效果的PWM      TIM1->CR1 &= ~TIM_CR1_CEN;  // 关闭TIM1      // ...    }  }}

// ... 函数实现 .

STM32Duino音频频谱分析仪代码解析与错误解决

原文地址: https://www.cveoy.top/t/topic/7Ei 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录