Arduino Mega2560 在连续两次调用 analogWrite 后重启

Arduino Mega2560 reboots after two consecutive calls to analogWrite

为什么这段代码导致Arduino Mega2560不断复位?

void setup() {
  Serial.begin(9600);
  Serial.println("SETUP");
  delay(500);             //without this line Serial prints "SESESESESE"
  analogWrite(10, 100);
  analogWrite(11, 50);    //reboots after this line
}

void loop() {
  Serial.println("LOOP"); //doesn't reach here
}

Arduino 串口输出如下:

SETUP
SETUP
SETUP
SETUP
SETUP
SETUP
SETUP
SETUP

注意事项:

1) 如果我将引脚 10 和 11 替换为其他引脚(例如 8 和 9),Arduino 不会重启,但它也会使用引脚 12 和 13 重启(我猜引脚 10-13 在某种程度上是特殊的) .

2) 如果我在对 analogWrite 的调用中使用相同的值(例如 100 和 100),Arduino 不会重启。

如果您将引脚设置为:

,则不应发生这种情况
 void setup() {
    pinMode(10, OUTPUT);  // sets the pin as output
    pinMode(11, OUTPUT);  // sets the pin as output

此类重置通常是电源不良、噪音或连接不良(原型板不良)或 LED 引脚不良(例如,电阻器太小或损坏,或引脚损坏等)。 如果您的 mega 没有硬件缺陷并且有足够的电源或附加的硬件导致此缺陷,它应该按预期工作。

显然,编译器的优化是罪魁祸首。在程序开头添加这两行后,它终于可以正常工作了:

void setup() __attribute__((optimize("-O1")));
void loop() __attribute__((optimize("-O1")));