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

ATmega328P(Arduino板)C编程加函数后LED异常闪烁求助

ATmega328P自定义函数引发LED异常闪烁问题排查请求

我正在用C语言直接给Az-delivery Arduino板上的ATmega328P编程。最初的LED闪烁测试程序运行正常,但添加自定义函数后,LED出现快速闪烁3次、熄灭1秒的循环异常。逐行排查发现,哪怕只是声明并定义一个空函数setHigh_Led,就会触发这个问题,就算加上端口初始化代码也没用;在更接近原程序的异常代码中,LED本该熄灭的时段也会出现闪烁。以下是各阶段的代码、HEX文件及编译烧录脚本,麻烦帮忙分析原因:


正常运行的LED闪烁代码

#include <avr/io.h>
#include <util/delay.h>

int main(void){
    DDRB |= (1 << DDB5);
    while(1){
        PORTB |= 1 << PORTB5;
        _delay_ms(500);//0.35
        PORTB &= ~(1 << PORTB5);
        _delay_ms(500);
    }
}

对应的HEX文件:

:10000000259A2D9A2FEF89E698E121508040904063
:10001000E1F700C000002D982FEF89E698E121500C
:0C00200080409040E1F700C00000EBCFF2
:00000001FF

无操作的正常代码(无异常)

#include <avr/io.h>
#include <util/delay.h>
int main(void){
    while(1){}
}

对应的HEX文件:

:02000000FFCF30
:00000001FF

触发异常的空函数代码

#include <avr/io.h>
#include <util/delay.h>

void setHigh_Led(void);

int main(void){
    while(1){}
}

void setHigh_Led(void){}

对应的HEX文件:

  • 含初始化版本:
:060000000895259AFFCFD0
:00000001FF
  • 不含初始化版本:
:040000000895FFCF91
:00000001FF

接近原程序的异常代码

void setHigh_Led(void);

int main(void){
    DDRB |= (1 << DDB5);
    while(1){
        setHigh_Led();
        _delay_ms(500);
        PORTB &= ~(1 << PORTB5);
        _delay_ms(500);
    }
}

void setHigh_Led(void){
    PORTB |= 1 << PORTB5;
}

对应的HEX文件:

:100000002D9A0895259A0E9400002FEF89E698E125
:10001000215080409040E1F700C000002D982FEF64
:1000200089E698E1215080409040E1F700C000004F
:02003000EACF15
:00000001FF

编译烧录脚本

avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o blink/blink.o blink/blink.c
avr-gcc -o blink/blink.bin blink/blink.o
avr-objcopy -O ihex -R .eeprom blink/blink.bin blink/blink.hex
avrdude -F -V -c arduino -p ATMEGA328P -P COM3 -b 115200 -U flash:w:blink.hex

内容的提问来源于stack exchange,提问作者simovre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:00:59