You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino Uno编译报错:__vector_11重复定义问题求助

解决PCM.h与Servo.h库的中断冲突问题

错误原因

Arduino Uno搭载的ATmega328P芯片中,PCM.h和Servo.h两个库同时占用了Timer2的比较匹配A中断向量(__vector_11):

  • Servo.h默认会用Timer2生成舵机控制信号(舵机数量较少时)
  • PCM.h依赖Timer2的中断生成音频PWM信号

两个库重复定义同一个中断服务程序,导致链接器抛出"multiple definition of `__vector_11'"错误。

解决方案

方案1:修改Servo库,强制切换到其他定时器

Arduino Uno的Servo库支持改用Timer1(16位定时器),避开Timer2的冲突:

  1. 找到Servo库的安装目录(通常在Documents\Arduino\libraries\Servo或IDE自带库路径)
  2. 打开src\avr\Servo.h文件
  3. 找到这段代码:
    // Uncomment the line below to use Timer1 instead of Timer2 for Servo library
    // #define _useTimer1
    
  4. 取消注释#define _useTimer1,保存文件
  5. 重新编译项目

方案2:替换PCM库为不占用Timer2的音频库

如果不想修改库文件,可改用Arduino自带的Tone库实现简单音频播放,示例代码如下:

#include <Servo.h>
#include <Tone.h>

Servo Myservo;
Tone audioPlayer;

// 示例音频频率序列
const int notes[] = {262, 262, 294, 262, 349, 330};
const int noteDurations[] = {4,4,4,4,4,2};

void setup()
{
  Myservo.attach(4);
  Myservo.write(0); // 修复原代码大小写错误:myservo -> Myservo
  audioPlayer.begin(9); // 用引脚9作为音频输出
}

void loop()
{
  // 播放音频示例
  for (int i = 0; i < sizeof(notes)/sizeof(int); i++) {
    int duration = 1000/noteDurations[i];
    audioPlayer.play(notes[i], duration);
    delay(duration * 1.3);
    audioPlayer.stop();
  }
  // 其他业务逻辑
}

方案3:手动修改PCM库的定时器(需具备AVR定时器基础)

如果坚持使用PCM库,可将其依赖的Timer2替换为Timer1:

  1. 打开PCM库的PCM.c文件
  2. 批量替换Timer2相关寄存器:
    • 把TCCR2A/TCCR2B替换为TCCR1A/TCCR1B
    • 把OCR2A替换为OCR1A
    • 把TIMSK2替换为TIMSK1
    • 把__vector_11替换为__vector_9(Timer1比较匹配A的中断向量)
  3. 调整Timer1的分频系数和比较值,适配PCM采样率需求

额外提示

原代码存在大小写错误:myservo.write(0);需改为Myservo.write(0);(变量名首字母大写),否则会触发未定义变量的编译错误。

内容的提问来源于stack exchange,提问作者ilies Ould menouer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:05:13