_SFR_IO8(0x04)在做什么? AVR

问题描述 投票:1回答:1

我正在尝试编写汇编程序来切换Arduino MEGA2560的板上LED。

为此,我仅需指示引脚的方向(在这种情况下为PB7,为13)作为输出,然后将该引脚设置为高或低即可。

我知道有两个与此问题相关的寄存器。一个是端口的方向寄存器(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()在做什么?

assembly mapping port avr microprocessors
1个回答
1
投票

这是一个宏。如果您好奇,可以在标题中找到其定义:

#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是IO地址,0x24是内存映射地址。

© www.soinside.com 2019 - 2024. All rights reserved.