我有这个闪烁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中访问的
引用:
- 将端口作为变量传递