首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >_SFR_IO8(0x04)在做什么?AVR

_SFR_IO8(0x04)在做什么?AVR
EN

Stack Overflow用户
提问于 2019-10-20 00:40:49
回答 1查看 618关注 0票数 1

我正在尝试用汇编语言编写一个程序来切换Arduino MEGA2560的板载发光二极管。

为此,我只需将引脚的方向(在本例中为13,即PB7)指定为输出,然后将该引脚设置为高或低。

我知道有两个寄存器与这个问题有关。一个是端口的方向寄存器(DDRB)和管脚状态寄存器(PORTB)

因此,我试图了解这些寄存器的编号或地址,以便在汇编中为它们赋值。我进入了C++库,其中定义了这些常量(iomxx0.h),例如,DDRB是以以下方式定义的:

代码语言:javascript
复制
#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()在做什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-20 03:16:37

这是一个宏命令。如果你很好奇,你可以在头文件中找到它的定义:

代码语言:javascript
复制
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)

代码语言:javascript
复制
#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

此外,

代码语言:javascript
复制
#define _SFR_IO_ADDR(sfr) ((sfr) - __SFR_OFFSET)
#define _SFR_MEM_ADDR(sfr) (sfr)

在AVR上,您可以使用通常的内存读/写或输入/输出指令来访问SFR。但是,地址取决于访问方法。这些宏的存在是为了帮助你做到这一点。在本例中,0x04是IO地址,0x24是内存映射地址。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58465812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档