출처 : http://blog.naver.com/radiskkk?Redirect=Log&logNo=70030108381


AVR-GCC

 

 SRAM에서의 변수 및 상수

 특별히 속성을 정하지 않고 변수를 정의하면 SRAM 영역에 저장된다. 이것들은 외부 메모리에 저장되는 경우에 비하여 빠르게 엑세스할 수 있다. 축약 표현은 <stdio.h>에 정의되어 있다. 그러나, <io.h>를 인클루드하면 내부적으로 <stdio.h> 파일을 자동 인클루드하도록 연결되어 있다.

 

- AVR-GCC에서 데이터의 형 및 이름 축약하여 표현 방법

일반적인 데이터형의 표현

AVR-GCC의 데이터형 축약 표현

바이트 수

표현 범위

signed char

int8_t

1

-128 ~ +127

unsigned char

uint8_t

1

0 ~ 255

signed int

int16_t

2

-32768 ~ +32767

unsigned int

uint16_t

2

0 ~ 65535

signed long

int32_t

4

-2147483648 ~ +21474783647

unsigned long

uint32_t

4

0 ~ 4294967295

signed long long

int64_t

8

-9.22×10^18 ~ +9.22×10^18

unsigned long long

uint64_t

8

0 ~ 1.844×10^19

 

intptr_t

2

-32768 ~ +32767

 

uintptr_t

2

0 ~ 65535

float

 

4

±8.4×10^-37 ~ ±3.4×10^38

double

 

8

±2.2×10^-308 ~ ±1.8×10^308

 

 

• 프로그램 메모리에서의 상수

 AVR의 프로그램 메모리인 플래시 메모리에 상수를 정의 가능하며 읽는 것만 가능하다. SRAM에 저장할 수도 있지만 플래시 메모리는 SRAM에 비하여 용량이 훨씬 크므로 유용하게 사용할 수 있다. 아래의 상수 데이터 표현을 사용하려면 <pgmspace.h>를 인클루드 하여야 한다.

 

- AVR-GCC에서 프로그램 메모리 상수를 정의하는 방법

데이터의 형

AVR-GCC에서 프로그램 메모리 상수

바이트 수

표현 범위

signed char

prog_char, prog_int8_t

1

-128 ~ +127

unsigned char

prog_uchar, prog_uint8_t

1

0 ~ 255

signed int

prog_int16_t

2

-32768 ~ +32767

unsigned int

prog_uint16_t

2

0 ~ 65535

signed long

prog_int32_t

4

-2147483648 ~ +21474783647

unsigned long

prog_uint32_t

4

0 ~ 4294967295

signed long long

prog_int64_t

8

-9.22×10^18 ~ +9.22×10^18

unsigned long long

prog_uint64_t

8

0 ~ 1.844×10^19

 

- AVR-GCC에서 프로그램 메모리 상수를 읽는 방법

프로그램 메모리 상수의 형

16비트 어드레스를 사용하여 읽기

32비트 어드레스를 사용하여 읽기

prog_char

prog_uchar

prog_int8_t

prog_uint8_t

pgm_read_byte(address_short)

pgm_read_byte_near(address_long)

pgm_read_byte_far(address_long)

prog_int16_t

prog_uint16_t

pgm_read_word(address_short)

pgm_read_word_near(address_long)

pgm_read_word_far(address_long)

prog_int32_t

prog_uint32_t

pgm_read_dword(address_short)

pgm_read_dword_near(address_long)

pgm_read_dword_far(address_long)

 

- 바이트 상수의 저장과 읽기

prog_int8_t aaa = {1};

int8_t value;

value = pgm_read_byte(&aaa);

 

- 바이트 상수 배열의 저장과 읽기

prog_int8_t array[] = {0, 1, 2, 3, 4};

int8_t value;

value = pgm_read_byte(&array[3]);

 

- 문자열의 저장과 읽기

int8_t *str1 = PSTR(“ABC DEF”);

int8_t letter;

letter = pgm_read_byte(str1 + 2);

 

다른 방법으로는

int8_t str2[] _attribute_ ((progmem)) = “ABC DEF”;

int8_t letter;

letter = pgm_read_byte(&str2[2]);

 

 

 EEPROM의 사용

 AVR에서 EEPROM을 엑세스하는 것은 I/O 레지스터를 사용하여야 하므로 AVR-GCC에서는 EEPROM을 엑세스하기 위한 특별한 함수들을 제공하는데, <eeprom.h>에 정의되어 있다.

데이터의 종류

EEPROM 읽기

EEPROM 쓰기

8비트 바이트

eeprom_read_byte()

_EEGET()

eeprom_write_byte()

_EEPUT()

16비트 워드

eeprom_read_word()

eeprom_write_word()

바이트 블록

eeprom_read_block()

eeprom_write_block()

 

- EEPROM의 상태 조사

eeprom_is_ready();

리턴 값이 1이면 ready, 0이면 busy 상태를 나타낸다.

 

- 8비트 바이트 또는 16비트 워드의 읽기, 쓰기

void eeprom_write_byte(uint8_t *addr, uint8_t value);

void eeprom_write_word(uint16_t *addr, uint16_t value);

 

uint8_t eeprom_read_byte(const uint8_t *addr);

uint16_t eeprom_read_word(const uint16_t *addr);

 

- SRAM n바이트의 *buf 버퍼값과 EEPROM의 지정된 어드레스 값과의 읽고 쓰기

void eeprom_write_block(const void *addr, void *buf, size_t n);

void eeprom_read_block(void *buf, const void *addr, size_t n);

 

- IAR C컴파일러의 호환

_EEGET(val, addr);

_EEPUT(addr, val);

 

 

 I/O 레지스터 및 병렬 I/O 포트의 액세스

 AVR-GCC에서는 I/O 레지스터 또는 확장 I/O 레지스터를 액세스하기 위한 여러가지 함수나 매크로를 지원하며, 헤더파일<sfr_defs,h>에 정의되어 있다. <io.h>를 인클루드하면 자동으로 인클루드가 된다.

 

- 8비트 I/O 레지스터 또는 확장 I/O 레지스터의 액세스

unsigned char a;

PORTB = 0x80;

a = PINB;

 

- 특정 비트의 조사

#define bit_is_set(sfr, bit)

#define bit_is_clear(sfr, bit)

 

- 레지스터의 특정 비트의 값을 기다리는 매크로

#define loop_until_bit_is_set(sfr, bit)

#define loop_until_bit_is_clear(sfr, bit)

 

 

• 외부 I/O나 메모리의 절대 번지 액세스

ex) #define keyword (*(volatile unsigned char *) 0x2000)

 

 

• 인터럽트 처리

 

- 인터럽트 서비스 루틴 함수

ISR(vector)

{

             // interrupt service routine

}

 

- 모든 사용하지 않는 인터럽트에 대한 인터럽트 처리 함수

ISR(_vector_default)

{

             // interrupt service routine

}

 

- 다른 인터럽트 서비스 루틴 함수

SIGNAL(signame)

{

             // interrupt service routine

}

이 방식은 나중에 폐지될 예정이므로 사용하지 않는 것이 좋다. 예전에 사용하던 INTERRUPT(signame) 형식은 폐지되어서 현재는 사용하지 않는다.

 

- 인터럽트 처리 함수를 정의하는 vector  signame

번호

vector (새로운 방식)

signame (옛 방식)

인터럽트 발생 조건

1

INT0_vect

SIG_INTERRUPT0

External Interrupt Request 0

2

INT1_vect

SIG_INTERRUPT1

External Interrupt Request 1

3

INT2_vect

SIG_INTERRUPT2

External Interrupt Request 2

4

INT3_vect

SIG_INTERRUPT3

External Interrupt Request 3

5

INT4_vect

SIG_INTERRUPT4

External Interrupt Request 4

6

INT5_vect

SIG_INTERRUPT5

External Interrupt Request 5

7

INT6_vect

SIG_INTERRUPT6

External Interrupt Request 6

8

INT7_vect

SIG_INTERRUPT7

External Interrupt Request 7

9

TIMER2_COMP_vect

SIG_OUTPUT_COMPARE2

Timer/Counter2 Compare Match

10

TIMER2_OVF_vect

SIG_OVERFLOW2

Timer/Counter2 Overflow

11

TIMER1_CAPT_vect

SIG_INPUT_CAPTURE1

Timer/Counter1 Capture Event

12

TIMER1_COMPA_vect

SIG_OUTPUT_COMPARE1A

Timer/Counter1 Compare Match A

13

TIMER1_COMPB_vect

SIG_OUTPUT_COMPARE1B

Timer/Counter1 Compare Match B

14

TIMER1_OVF_vect

SIG_OVERFLOW1

Timer/Counter1 Overflow

15

TIMER0_COMP_vect

SIG_OUTPUT_COMPARE0

Timer/Counter0 Compare Match

16

TIMER0_OVF_vect

SIG_OVERFLOW0

Timer/Counter0 Overflow

17

SPI_STC_vect

SIG_SPI

SPI Serial Transfer Complete

18

USART0_RX_vect

SIG_UART0_RECV

USART0 Rx Complete

19

USART0_UDRE_vect

SIG_UART0_DATA

USART0 Data Register Empty

20

USART0_TX_vect

SIG_UART0_TRANS

USART0 Tx Complete

21

ADC_vect

SIG_ADC

ADC Conversion Complete

22

EE_READY_vect

SIG_EEPROM_READY

EEPROM Ready

23

ANALOG_COMP_vect

SIG_COMPARATOR

Analog Comparator

24

TIMER1_COMPC_vect

SIG_OUTPUT_COMPARE1C

Timer/Counter1 Compare Match C

25

TIMER3_CAPT_vect

SIG_INPUT_CAPTURE3

Timer/Counter3 Capture Event

26

TIMER3_COMPA_vect

SIG_OUTPUT_COMPARE3A

Timer/Counter3 Compare Match A

27

TIMER3_COMPB_vect

SIG_OUTPUT_COMPARE3B

Timer/Counter3 Compare Match B

28

TIMER3_COMPC_vect

SIG_OUTPUT_COMPARE3C

Timer/Counter3 Compare Match C

29

TIMER3_OVF_vect

SIG_OVERFLOW3

Timer/Counter3 Overflow

30

USART1_RX_vect

SIG_UART1_RECV

USART1 Rx Complete

31

USART1_UDRE_vect

SIG_UART1_DATA

USART1 Data Register Empty

32

USART1_TX_vect

SIG_UART1_TRANS

USART1 Tx Complete

33

TWI_vect

SIG_2WIRE_SERIAL

Two-wire Serial Interface

34

SPM_READY_vect

SIG_SPM_READY

Store Program Memory Ready

 

 

• 기본 헤더 파일

1 → C:\WinAVR\avr\include\ 폴더에 위치

2 → C:\WinAVR\avr\include\avr\ 폴더에 위치

3 → C:\WinAVR\avr\include\compat\ 폴더에 위치

4 → C:\WinAVR\avr\include\util\ 폴더에 위치

 

- WinAVR에 제공하는 헤더 파일

 

헤더파일

파일의 내용

비고

assert.h

Diagnostics

1

boot.h

Bootloader support utilities

2

crc16.h

CRC-16 computations

24

ctype.h

Character operations

1

delay.h

Busy-wait delay loops

24

eeprom.h

EEPROM handling

2

errno.h

System errors

1

ina90.h

Compatibility header for IAR C compiler EWB 3.x

3

interrupt.h

Interrupt handling

2

inttypes.h

Integer type conversions

1

io.h

AVR device-specific I/O definitions

2

iom128.h

I/O definitions for various AVR microcontrollers

2

math.h

Mathemathics

1

parity.h

Parity bit generations

24

pgmspace.h

Program space string utilities

2

portpins.h

I/O port bit number definitions

2

setjmp.h

Non local goto

1

sfr-defs.h

Special function registers

2

signal.h

기능이 모두 interrupt.h 파일로 흡수되어 사용하지 않음

2

sleep.h

Power management and sleep modes

2

stdint.h

Standard integer types

1

stdio.h

Standard I/O facilities

1

stdlib.h

General utilities

1

string.h

More string manipulation routines

1

twi.h

TWI bit mask definitions

34

version.h

avr-libc version macros

2

wdt.h

Watchdog timer handling

2

 

+ Recent posts