没有 Arduino 库的 Arduino 编程 - Atmel Studio

Arduino Programming Without Arduino Libraries - Atmel Studio

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

我想使用 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/

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

你可以做你想做的事,但你需要像 Atmel-ICE, AVR Dragon, STK 500 or a AVRISP mkII 这样的程序员。还有一些。 Atmel 有许多程序员,具体取决于您的需要。还有一些便宜得多的第 3 方程序员。我有 STK500 和 Dragon。爱他们两个,他们在 Atmel Studio 中玩得很好 6.X。

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

Make: AVR Programming By Elliot Williams

如果你熟悉C,我推荐

  • AVR Libc reference
  • 开始
  • 检查 iom328p.h 以了解您的处理器特定定义(位于 ...\Atmel Toolchain\AVR8 GCC\Native\[#.#.####]\avr8-gnu-toolchain\avr\include\avr 下)
  • 可选地,在 Atmel Studio 中创建一个新的 ASF 板项目选择设备 ATmega328p 并检查从 "user_board" 模板(无论如何都是*.h 的一组几乎为空的通用集,为您 may/may 不需要的东西提供 space)
  • 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 地址 0x05q.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(以及更多)最终让您可以使用在处理器手册中找到的 register/port/pin 名称在 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

你会找到支持 reading/writing from/to 程序和闪存等的库