AVR闪烁程序中的 c声明功能导致闪烁程序故障



我有这个闪烁LED程序(它闪烁L LED每秒钟)

#include <avr/io.h>
#include <util/delay.h>
#define DELAY 1000
int main (void) {
DDRB |= _BV(DDB5);
while(1) {
PORTB |= _BV(PORTB5);
_delay_ms(DELAY);
PORTB &= ~_BV(PORTB5);
_delay_ms(DELAY);
}
return 0;
}

这工作得很好,但当我添加如下功能时,L LED不闪烁,我打算这样做。即使我从主函数中删除了所有的代码,它仍然以同样的方式闪烁。

#include <avr/io.h>
#include <util/delay.h>
#define DELAY 1000
int main (void) {
DDRB |= _BV(DDB5);
while(1) {
PORTB |= _BV(PORTB5);
_delay_ms(DELAY);
PORTB &= ~_BV(PORTB5);
_delay_ms(DELAY);
}
return 0;
}
int test(){
return 0;
}

我用avrdude来闪程序。处理器为atmega328p。这是我使用的Makefile

defualt:
avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o led.o speaker.c
avr-gcc -o led.bin led.o
avr-objcopy -O ihex -R .eeprom led.bin led.hex
sudo avrdude -F -V -c arduino -p ATMEGA328p -P /dev/ttyACM0 -b 115200 -U flash:w:led.hex
rm led.bin
rm led.o
rm led.hex

我试过删除参数,改变返回类型,添加原型函数,但都不起作用。

如果你将代码粘贴到main函数下面,你必须定义一个原型,例如:

#define F_CPU 16000000UL
#define DELAY 1000
#include <avr/io.h>
#include <util/delay.h>
void blink(volatile unsigned char *port, unsigned char pin);
int main (void)
{
DDRB |= _BV(DDB5);
while(1) {

blink(&PORTB, PINB5);
}
return 0;
}
void blink(volatile unsigned char *port, unsigned char pin)
{
*port |= _BV(pin);
_delay_ms(DELAY);
*port &= ~(_BV(pin));
_delay_ms(DELAY);
}

让编译器知道函数头文件,然后进行链接。

需要volatile,因为PORT是直接在RAM中访问的

引用:

  • 将端口作为变量传递

最新更新