출처 : 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 |