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
相关产品推荐
相关产品推荐

