【问题标题】:Arduino Programming Without Arduino Libraries - Atmel Studio没有 Arduino 库的 Arduino 编程 - Atmel Studio
【发布时间】:2015-09-02 20:52:28
【问题描述】:

我想这个问题已经被问了数千次了,我根本找不到很多关于这个主题的资源。

我想使用 Atmel Studio 和 C 语言对我的 Arduino Uno (ATmega328P) 进行编程,减去 Arduino 库。我的意思是我想编写如下代码:

int main(void) {
     /* set pin 5 of PORTB for output*/
     DDRB |= _BV(DDB5);

     while (1) {
       /* set pin 5 high to turn led on */
       PORTB |= _BV(PORTB5);
       _delay_ms(BLINK_DELAY_MS);

       /* set pin 5 low to turn led off */
       PORTB &= ~_BV(PORTB5);
       _delay_ms(BLINK_DELAY_MS);
     }
}

而不是充斥着哦,太方便了 Arduino 功能的代码。我想深入了解 Arduinos!

话虽如此,我正在寻找您可以提供的任何优秀的学习资源,以便我可以扩展我的知识!

到目前为止,我设法找到的唯一有点有用的来源是这个页面: https://hekilledmywire.wordpress.com/2010/12/04/22/

但是,图像丢失了,而且看起来很简约。

【问题讨论】:

  • github.com/dwelch67/avr_samples Atmel 通常擅长文档。从电路板开始,弄清楚你有什么风格的 avr(例如 atmega328p),然后在 atmel 搜索,出现的文档比你想阅读的要多,查找数据表、参考手册、用户指南、家庭用户指南,等等。一些供应商的数据表只为硬件人员提供了一些信息,一些包含所有编程信息,一些包含一些地址,但家庭文档涵盖了详细信息,等等。atmel 可能是那些多文档供应商之一。
  • atmel.com/devices/atmega328p.aspx 然后得到 ATmega48A/PA/88A/PA/168A/PA/328/P 完成然后在 IO 端口章节,寄存器描述部分,最终你会找到 PORTB 显示位地址为 0x05 (0x25) 的端口与指令集中的两种不同的指令/寻址模式有关 0x05 我的猜测是,如果您通过 IDE 或您正在使用的工具套件的编译器头文件进行 grep,您会发现这个端口。并了解这些地址不必对所有 avrs 都是通用的,可以从一个更改为另一个

标签: arduino avr atmega avrdude atmelstudio


【解决方案1】:

你可以做你想做的事,但你需要像Atmel-ICEAVR DragonSTK 500AVRISP mkII 这样的程序员。还有几个。根据您的需要,Atmel 有许多程序员。还有一些便宜得多的第三方程序员。我有 STK500 和 Dragon。喜欢他们两个,他们在 Atmel Studio 6.X 上玩得很好。

这本书是一个很好的学习资源:

Make: AVR Programming By Elliot Williams

【讨论】:

  • 我认为您误解了这个问题。我已经拥有了在 Arduino Uno 上对芯片进行编程所需的硬件(Arduino Uno / ATmega328P)和软件(Atmel Studio)。另一方面,我的问题是定位学习材料,以便我更熟悉芯片的实际编码。
  • @JoshuaGranger 对不起,我误解了。我用一本可以帮助你学习 AVR 编程的好书更新了我的答案。
【解决方案2】:

如果你熟悉 C,我推荐

  • AVR Libc reference开头
  • 检查 iom328p.h 以了解您的处理器特定定义(位于 ...\Atmel Toolchain\AVR8 GCC\Native\[#.#.####]\avr8-gnu-toolchain\avr\include\avr 下)
  • 可选地,在 Atmel Studio 中创建一个新的 ASF 板项目,选择设备 ATmega328p 并检查从“user_board”模板加载到项目文件夹中的源代码(无论如何它是一个通用的几乎空的 @ 987654324@ 为您可能/可能不需要的东西提供空间)
  • complete processor manual 在您身边始终 - 在那里找到的寄存器和位名与 AVR 库中的定义相匹配

请注意,Atmel Studio 和工具链附带的库支持 m328P,但 ASF 不支持 UNO 板本身。但是,对于基本的编程,你会没事的。

添加 ...在 PORTB 上

PORTB 定义在您的处理器的特定...io.h(上面的第一个项目符号)中,通过包含<io.h> 并在AVR Studio 中选择正确的处理器自动包含它。在您的处理器库中,您可以找到

#define PORTB _SFR_IO8(0x05)

查看处理器指南(上面的第 4 个项目符号)第 615 页,您会看到 PORTB 位于 I/O 地址 0x05 (q.e.d.)。 _SFR_IO8(..) 本身是在 <avr/sfr_defs.h> 中定义的宏,用于从 I/O 转换为内存地址(是的,较低的寄存器被双重映射为 I/O 和内存,其中内存地址高 0x20,因为最低内存地址被R0到R31占用)。

通过包含<io.h>,您可以从 AVR 库中获得

#include <avr/io.h>
// included by io.h
//    #include <avr/sfr_defs.h>
//    #include <avr/portpins.h>
//    #include <avr/common.h>
//    #include <avr/version.h>
//    #include <avr/io(your_processor).h> via processor declaration ... fuses
//        #include <avr/(maybe some more).h>

所有这些...h(以及更多)最终让您可以使用您在处理器手册中找到的寄存器/端口/引脚名称在 C 中进行编程。

还有一些更有用的库,比如

#include <stdint.h>                     // Type definitions, e.g. uint8_t
//    #include "stdint-gcc.h"
#include <avr/power.h>                  // clock prescaler macro
#include <avr/interrupt.h>              // interrupt macros

您会发现支持从/向程序和闪存等读取/写入的库。

【讨论】:

  • 我选择了这个作为答案,尽管也许这是我已经检查过的东西。不过,这不是你的错——我应该更仔细地问我的问题。我知道 C 编程(我用 C# 编写桌面应用程序,并且我有一个使用 Nexys4 FPGA 板的微处理器类)。我的一位讲师建议我学习使用 Atmel Studio 使用纯 C 语言编写 Arduino,而不是使用 Arduino IDE 编写“Arduino C”。因此,我一直在寻找好的资源来解释位寄存器(以及它们所在的地址,以及如何访问这些地址)。
  • 我认为我的理解差距(到目前为止)是编译器为什么/如何/在哪里确定什么“PORTB”等。手段(特别是因为它在任何地方都没有明确定义)。总体而言,似乎没有很多有用的文章介绍 Atmel Studio(使用纯 C)中的微处理器入门
  • re bit registers the processor manual shall be your guide (my answer 4th bullet --> link),快速参考见第611ff、65ff、17ff、re PORTB ...见编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多