STM32Duino音频频谱分析仪代码解析与错误解决
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环境下编译这段代码时,可能会遇到以下两个错误:
- **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 // ... } }}
// ... 函数实现 .
原文地址: https://www.cveoy.top/t/topic/7Ei 著作权归作者所有。请勿转载和采集!