带有 Arduino 的 AVR-GCC
Avr-GCC with Arduino
如何在 Ubuntu 上用 C 语言对我的 Arduino 进行编程。我听说过 avr-gcc,但所有在线教程似乎都非常乏味,并且没有针对带有 Arduino 引导加载程序的 AVR 芯片的选项。谁能帮助我以更简单的方式在 Ubuntu 上安装 avr-gcc 并开始使用 C 语言为 Arduino 编程?
我推荐使用以下一组命令行选项进行编译:
avr-gcc -c
-std=gnu99
-Os
-Wall
-ffunction-sections -fdata-sections
-mmcu=m328p
-DF_CPU=16000000
并且 linking:
avr-gcc -Os
-mmcu=m328p
-ffunction-sections -fdata-sections
-Wl,--gc-sections
在哪里……
-c
表示"compile to object file only, do not link"
-std=gnu99
表示"My code conforms to C99 and I use GNU extensions"
-Os
表示"optimize for executable size rather than code speed"
-Wall
表示"turn on (almost) all warnings"
-ffunction-sections -fdata-sections
是 -Wl,--gc-sections
优化所必需的
-mmcu=m328p
表示"the MCU part number is ATmega 328P"
-DF_CPU=16000000
表示"the clock frequency is 16 MHz"(根据你的实际时钟频率调整)
-Wl,--gc-sections
表示 "tell the linker to drop unused function and data sections"(这有助于减少代码大小)。
为了实际编译您的代码,您将首先使用 "compile only flags" 发出 avr-gcc
命令,如下所示:
avr-gcc -c -std=gnu99 <etc.> MyProgram.c -o MyProgram.o
然后您将对所有源文件重复此操作。最后,您可以 link 通过在 link 模式下调用 AVR-GCC 将生成的目标文件放在一起:
avr-gcc -Os <etc.> MyProgram.o SomeUtility.o -o TheExecutable.elf
这会生成一个 ELF 文件,您的 MCU 无法直接执行该文件。因此,您需要以 Intel Hex 格式从中提取有用的部分(原始机器代码):
avr-objcopy -O ihex -R .eeprom TheExecutable.elf TheExecutable.ihex
最后需要AVRdude将hex文件的内容上传到MCU:
avrdude -C /path/to/avrdude.conf
-p m328p
-c PROGRAMMER_NAME
-b 19600
-P PORT_NAME
-U flash:w:TheExecutable.ihex:i
在哪里……
-C /path/to/avrdude.conf
表示"use this file as the configuration file"
-c PROGRAMMER_NAME
表示"I am using a programmer of type PROGRAMMER_NAME"(需要根据自己使用的编程器类型自行填写)
-b 19600
是波特率(您可能需要根据您设置的波特率或已预编程到引导加载程序中的波特率进行调整)
-P PORT_NAME
表示"the programmer is connected to port PORT_NAME"。在 Linux 上,它通常是类似于 /dev/ttyusbN
的内容,其中 N 是某个数字。
-U flash:w:TheExecutable.ihex:i
表示 "write to the Flash memory the contents of TheExecutable.ihex which is in Intel Hex format".
如果您只想将 C 代码与已安装引导加载程序的 Arduino 一起使用。您可以直接在 Arduino IDE 中用 C 语言编写代码并像往常一样编译它。 Sketch 实际上是一堆头文件和宏。
这是用 C 语言编写的闪烁草图:
#include <avr/io.h> //defines pins, ports etc
#include<util/delay.h> //functions for wasting time
int main (void) {
//init
DDRB |= (1<<PB5); //Data Direction Register B:
//writing a 1 to the Pin B5 bit enables output
//Event loop
while (1) {
PORTB = 0b00100000; //turn on 5th LED bit/pin in PORT B (Pin13 in Arduino)
_delay_ms (1000); //wait
PORTB = 0b00000000; //turn off all bits/pins on PB
_delay_ms (1000); //wait
} //end loop
return(0); //end program. This never happens.
}
将其粘贴到 IDE 中并亲自尝试。
如果您想从 Arduino 转移到没有引导加载程序的 AVR 编程,我可以推荐 Elliot Williams 的精彩网络广播作为介绍。 - https://www.youtube.com/watch?v=ERY7d7W-6nA
祝你好运,玩得开心:)
如何在 Ubuntu 上用 C 语言对我的 Arduino 进行编程。我听说过 avr-gcc,但所有在线教程似乎都非常乏味,并且没有针对带有 Arduino 引导加载程序的 AVR 芯片的选项。谁能帮助我以更简单的方式在 Ubuntu 上安装 avr-gcc 并开始使用 C 语言为 Arduino 编程?
我推荐使用以下一组命令行选项进行编译:
avr-gcc -c
-std=gnu99
-Os
-Wall
-ffunction-sections -fdata-sections
-mmcu=m328p
-DF_CPU=16000000
并且 linking:
avr-gcc -Os
-mmcu=m328p
-ffunction-sections -fdata-sections
-Wl,--gc-sections
在哪里……
-c
表示"compile to object file only, do not link"-std=gnu99
表示"My code conforms to C99 and I use GNU extensions"-Os
表示"optimize for executable size rather than code speed"-Wall
表示"turn on (almost) all warnings"-ffunction-sections -fdata-sections
是-Wl,--gc-sections
优化所必需的-mmcu=m328p
表示"the MCU part number is ATmega 328P"-DF_CPU=16000000
表示"the clock frequency is 16 MHz"(根据你的实际时钟频率调整)-Wl,--gc-sections
表示 "tell the linker to drop unused function and data sections"(这有助于减少代码大小)。
为了实际编译您的代码,您将首先使用 "compile only flags" 发出 avr-gcc
命令,如下所示:
avr-gcc -c -std=gnu99 <etc.> MyProgram.c -o MyProgram.o
然后您将对所有源文件重复此操作。最后,您可以 link 通过在 link 模式下调用 AVR-GCC 将生成的目标文件放在一起:
avr-gcc -Os <etc.> MyProgram.o SomeUtility.o -o TheExecutable.elf
这会生成一个 ELF 文件,您的 MCU 无法直接执行该文件。因此,您需要以 Intel Hex 格式从中提取有用的部分(原始机器代码):
avr-objcopy -O ihex -R .eeprom TheExecutable.elf TheExecutable.ihex
最后需要AVRdude将hex文件的内容上传到MCU:
avrdude -C /path/to/avrdude.conf
-p m328p
-c PROGRAMMER_NAME
-b 19600
-P PORT_NAME
-U flash:w:TheExecutable.ihex:i
在哪里……
-C /path/to/avrdude.conf
表示"use this file as the configuration file"-c PROGRAMMER_NAME
表示"I am using a programmer of type PROGRAMMER_NAME"(需要根据自己使用的编程器类型自行填写)-b 19600
是波特率(您可能需要根据您设置的波特率或已预编程到引导加载程序中的波特率进行调整)-P PORT_NAME
表示"the programmer is connected to port PORT_NAME"。在 Linux 上,它通常是类似于/dev/ttyusbN
的内容,其中 N 是某个数字。-U flash:w:TheExecutable.ihex:i
表示 "write to the Flash memory the contents of TheExecutable.ihex which is in Intel Hex format".
如果您只想将 C 代码与已安装引导加载程序的 Arduino 一起使用。您可以直接在 Arduino IDE 中用 C 语言编写代码并像往常一样编译它。 Sketch 实际上是一堆头文件和宏。
这是用 C 语言编写的闪烁草图:
#include <avr/io.h> //defines pins, ports etc
#include<util/delay.h> //functions for wasting time
int main (void) {
//init
DDRB |= (1<<PB5); //Data Direction Register B:
//writing a 1 to the Pin B5 bit enables output
//Event loop
while (1) {
PORTB = 0b00100000; //turn on 5th LED bit/pin in PORT B (Pin13 in Arduino)
_delay_ms (1000); //wait
PORTB = 0b00000000; //turn off all bits/pins on PB
_delay_ms (1000); //wait
} //end loop
return(0); //end program. This never happens.
}
将其粘贴到 IDE 中并亲自尝试。
如果您想从 Arduino 转移到没有引导加载程序的 AVR 编程,我可以推荐 Elliot Williams 的精彩网络广播作为介绍。 - https://www.youtube.com/watch?v=ERY7d7W-6nA
祝你好运,玩得开心:)