单片机
返回首页

B001-Atmega16-汇编-地址空间分配

2022-01-18 来源:eefocus

地址空间规划

打开m16def.inc、可以看到如下面的定义,它和手册里面描述的FlashROM、SRAM、EEPROM等的地址空间一一对应。


; ***** DATA MEMORY DECLARATIONS *****************************************

.equ FLASHEND = 0x1fff    ; Note: Word address、这里一共是8K word的flash ROM

.equ IOEND     = 0x003f ; IO寄存器的地址空间是0x0000-0x003F、但它们被映射到0x0020-0x005F

.equ SRAM_START  = 0x0060 ; 0x0060-0x0045F这1KB的地址空间是内部RAM使用的地址空间

.equ SRAM_SIZE   = 1024   ;

.equ RAMEND = 0x045f     ;

.equ XRAMEND = 0x0000     ; 这里可能是为外部RAM预留的地址空间 - question-001

.equ E2END    = 0x01ff  ; EEPROM一共有512B,占据着0x0000-0x01FF的地址空间

.equ EEPROMEND  = 0x01ff  ; 这个地址送到EEPROM控制寄存器使用

.equ EEADRBITS  = 9       ; 512个单元需要9位地址线来访问

#pragma AVRPART MEMORY PROG_FLASH 16384    ; 8K word = 16K byte

#pragma AVRPART MEMORY EEPROM 512

#pragma AVRPART MEMORY INT_SRAM SIZE 1024

#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60

编译器编译结束后会给出FlashROM(.cseg)、SRAM(.dseg)、EEPROM(.eseg)这三者的使用情况:

说明:


1、使用 in、 out指令访问 IO寄存器时、这两个指令使用的是 0x0000-0x003F的 地址空间来访问 IO寄存器的。

2、使用ld、st指令访问IO寄存器时、需要使用映射后的地址空间0x0020-0x005F([0x0000,0x003F]+0x0020)来访问IO寄存器。


PORTB、SREG等IO寄存器在m16def.inc文件中是按照0x0000-0x003F的地址空间来定义的,


所以使用ld、st指令时,寄存器地址需要加上0x0020:PORTB + 0x20、SREG + 0x20。



RAM中的栈空间

0、堆栈(实际指的是栈)也是RAM的一部分,只是可以使用专门的指令push/pop、通过堆栈指针SP来做FILO形式的访问(地址在SP中自动增减变化)。


在DEBUG模式下看到SP指针是放在RAM的末尾,从最后面开始向下生长。


1、在复位中断服务程序中、设置了堆栈指针SP为0x045F、是RAM地址空间的最后一个单元:

RAMEND在m16def.inc中定义如下(就是上面代码中的一部分):


.equ RAMEND = 0x045f

2、 push指令将 R20中的数据保存到 SP指针指向的 RAM单元,也即 入栈:

3、pop指令、将SP指针指向的RAM单元中的内容取出、并放入R20,也即出栈:

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章