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的冲突:
- 找到Servo库的安装目录(通常在
Documents\Arduino\libraries\Servo或IDE自带库路径) - 打开
src\avr\Servo.h文件 - 找到这段代码:
// Uncomment the line below to use Timer1 instead of Timer2 for Servo library // #define _useTimer1 - 取消注释
#define _useTimer1,保存文件 - 重新编译项目
方案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:
- 打开PCM库的
PCM.c文件 - 批量替换Timer2相关寄存器:
- 把
TCCR2A/TCCR2B替换为TCCR1A/TCCR1B - 把
OCR2A替换为OCR1A - 把
TIMSK2替换为TIMSK1 - 把
__vector_11替换为__vector_9(Timer1比较匹配A的中断向量)
- 把
- 调整Timer1的分频系数和比较值,适配PCM采样率需求
额外提示
原代码存在大小写错误:myservo.write(0);需改为Myservo.write(0);(变量名首字母大写),否则会触发未定义变量的编译错误。
内容的提问来源于stack exchange,提问作者ilies Ould menouer
相关产品推荐
相关产品推荐

