Что делает _SFR_IO8 (0x04)? AVR - PullRequest
1 голос
/ 19 октября 2019

Я пытаюсь написать программу в сборке, чтобы переключить встроенный светодиод Arduino MEGA2560 в сборке.

Для этого мне просто нужно указать направление вывода (13 в данном случае это PB7) в качестве выхода, а затем установить этот вывод как Высокий или Низкий.

Я понимаю, что есть два регистра, связанные с этой проблемой. один - это регистр направления порта (DDRB) и регистр состояния выводов (PORTB)

Поэтому я пытаюсь понять, какой номер или адрес имеют эти регистры, чтобы я мог присваивать им значения в сборке,Я зашел в библиотеку C ++, в которой эти константы определены (iomxx0.h) и, например, DDRB определяется следующим образом:

#define DDRB    _SFR_IO8(0x04)
#define DDB7    7
#define DDB6    6
#define DDB5    5
#define DDB4    4
#define DDB3    3
#define DDB2    2
#define DDB1    1
#define DDB0    0

Мне интересно узнать, является ли адрес регистра 0x04? и если это так, что делает _SFR_IO8 ()?

1 Ответ

2 голосов
/ 19 октября 2019

Это макрос. Вы можете найти его определение в заголовках, если вам интересно:

#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)

и

#ifndef __SFR_OFFSET
/* Define as 0 before including this file for compatibility with old asm
   sources that don't subtract __SFR_OFFSET from symbolic I/O addresses.  */
#  if __AVR_ARCH__ >= 100
#    define __SFR_OFFSET 0x00
#  else
#    define __SFR_OFFSET 0x20
#  endif
#endif

Кроме того,

#define _SFR_IO_ADDR(sfr) ((sfr) - __SFR_OFFSET)
#define _SFR_MEM_ADDR(sfr) (sfr)

На AVR вы можете получить доступ к SFR либос обычной памятью для чтения / записи или с инструкциями ввода / вывода. Однако адреса зависят от способа доступа. Эти макросы существуют, чтобы помочь вам в этом. В вашем случае 0x04 - это адрес ввода-вывода, а 0x24 - это отображенный в памяти адрес.

...