首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Avr-GCC和Arduino

Avr-GCC和Arduino
EN

Stack Overflow用户
提问于 2015-09-05 14:05:04
回答 2查看 5.2K关注 0票数 6

我如何在Ubuntu上用C语言编程我的Arduino。我听说过AVR,但是所有的在线教程似乎都非常乏味,并且没有使用Arduino引导加载程序的AVR芯片的选择。有人能帮我用一种更简单的方法在Ubuntu上安装avr,并开始用C语言为Arduino编程吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-05 14:14:28

我推荐以下一组命令行选项用于编译:

代码语言:javascript
复制
avr-gcc -c
        -std=gnu99
        -Os
        -Wall
        -ffunction-sections -fdata-sections
        -mmcu=m328p
        -DF_CPU=16000000

以及关于联系:

代码语言:javascript
复制
avr-gcc -Os
        -mmcu=m328p
        -ffunction-sections -fdata-sections
        -Wl,--gc-sections

Where…

  • -c的意思是“只编译到目标文件,不要链接”
  • -std=gnu99的意思是“我的代码符合C99,我使用GNU扩展”
  • -Os的意思是“优化可执行文件的大小而不是代码速度”。
  • -Wall的意思是“打开(几乎)所有警告”
  • -ffunction-sections -fdata-sections-Wl,--gc-sections优化的必要条件
  • -mmcu=m328p的意思是“MCU部件号是ATmega 328 p”。
  • -DF_CPU=16000000的意思是“时钟频率为16 MHz”(根据实际时钟频率调整)。
  • -Wl,--gc-sections的意思是“告诉链接器删除未使用的函数和数据部分”(这有助于减少代码大小)。

为了实际编译代码,首先使用“只编译标志”发出avr-gcc命令,如下所示:

代码语言:javascript
复制
avr-gcc -c -std=gnu99 <etc.> MyProgram.c -o MyProgram.o

然后,您将对所有源文件重复此操作。最后,通过在链接模式中调用AVR-GCC将结果对象文件链接到一起:

代码语言:javascript
复制
avr-gcc -Os <etc.> MyProgram.o SomeUtility.o -o TheExecutable.elf

这将生成一个ELF文件,它不能由您的MCU直接执行。因此,您需要以Intel Hex格式从其中提取有用的部分(原始机器代码):

代码语言:javascript
复制
avr-objcopy -O ihex -R .eeprom TheExecutable.elf TheExecutable.ihex

最后,您需要AVRdude将十六进制文件的内容上载到MCU:

代码语言:javascript
复制
avrdude -C /path/to/avrdude.conf
        -p m328p
        -c PROGRAMMER_NAME
        -b 19600
        -P PORT_NAME
        -U flash:w:TheExecutable.ihex:i

Where…

  • -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的内容,这是英特尔的十六进制格式”。
票数 14
EN

Stack Overflow用户

发布于 2017-01-20 21:01:24

如果您只想在已经安装了引导加载程序的Arduino中使用C代码。您可以在Arduino IDE中用C编写代码,并像往常一样编译它。草图实际上是一堆头文件和宏。

下面是用C编写的眨眼素描:

代码语言:javascript
复制
#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

祝你好运,玩得开心

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32413959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档