如何在Ubuntu上使用C语言编程我的Arduino?我听说过avr-gcc,但所有在线教程都非常繁琐,并没有针对带有Arduino引导程序的AVR芯片的选项。有没有人可以帮助我更简单地安装avr-gcc并开始为Arduino使用C语言进行编程?
如何在Ubuntu上使用C语言编程我的Arduino?我听说过avr-gcc,但所有在线教程都非常繁琐,并没有针对带有Arduino引导程序的AVR芯片的选项。有没有人可以帮助我更简单地安装avr-gcc并开始为Arduino使用C语言进行编程?
我建议使用以下命令行选项进行编译:
avr-gcc -c
-std=gnu99
-Os
-Wall
-ffunction-sections -fdata-sections
-mmcu=m328p
-DF_CPU=16000000
而且用于链接:
avr-gcc -Os
-mmcu=m328p
-ffunction-sections -fdata-sections
-Wl,--gc-sections
如何使用 AVR-GCC 编译代码:
-c
表示 "仅编译为目标文件,不链接"-std=gnu99
表示 "我的代码符合 C99 标准并使用 GNU 扩展"-Os
表示 "优化可执行文件大小而非代码速度"-Wall
表示 "打开(几乎)所有警告"-ffunction-sections -fdata-sections
是使用 -Wl,--gc-sections
优化的必要条件-mmcu=m328p
表示 "MCU 的型号是 ATmega328P"-DF_CPU=16000000
表示 "时钟频率为 16 MHz"(请根据实际时钟频率进行调整)-Wl,--gc-sections
表示 "告诉链接器删除未使用的函数和数据部分"(这有助于减小代码大小)。要实际编译代码,您需要首先使用 "仅编译标志" 发出 avr-gcc
命令,就像这样:
avr-gcc -c -std=gnu99 <etc.> MyProgram.c -o MyProgram.o
然后您需要为所有源文件重复此操作。最后,通过在链接模式下调用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
如何使用avrdude烧录单片机:
-C /path/to/avrdude.conf
:表示“将该文件用作配置文件”-c PROGRAMMER_NAME
:表示“我正在使用类型为PROGRAMMER_NAME的编程器”(您需要根据实际情况自行填写)。-b 19600
:波特率(您可能需要根据设置的波特率或预先编程到引导加载程序中的波特率进行调整)-P PORT_NAME
:表示“编程器连接到PORT_NAME端口”。在Linux上,它通常是类似于/dev/ttyusbN
(其中N是某个数字)的东西。-U flash:w:TheExecutable.ihex:i
:表示“将TheExecutable.ihex文件(Intel Hex格式)的内容写入Flash存储器”。如果您只想在已安装引导加载程序的Arduino上使用C代码,那么您可以直接在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
祝你好运并玩得开心 :)