历史上的今天
今天是:2024年11月02日(星期六)
2021年11月02日 | ATmega128 堆栈指针
2021-11-02 来源:eefocus
堆栈指针主要用来保存临时数据,局部变量和中断/ 自程序的返回地址。堆栈指针总是指 向堆栈的顶部。要注意AVR 的堆栈是向下生长的,即新数据推入堆栈时,堆栈指针的数 值将减小。
堆栈指针指向位于SRAM 的函数及中断堆栈。堆栈空间必须在调用函数或中断使能之前 定义。指针必须指向高于$60 的地址。用PUSH 指令推数据入栈时,堆栈指针将减一, 而当调用函数或中断时,指针将减二。使用POP 指令时,堆栈指针将加一,而用RET 或 RETI 返回时,指针将加二。
AVR堆栈指针占用了I/O空间两个8位寄存器。使用的位数由实际情况决定。注意,在AVR 结构中某些操作使用的数据空间很小,只要SPL 即可 ,此时,不会给出SPH 寄存器。
RAM 页面的Z 选择寄存器-RAMPZ

• Bits 7..2 – Res: 保留
保留位,读操作返回值为零。在写数据时要写入0 以保证与未来产品的兼容。
• Bit 1 – RAMPZ0: 扩展RAM 页面Z 指针
RAMPZ 寄存器用于选择Z 指针访问的是哪一个64K RAM。由于ATmega128 不支持超过64K的存储器,因此RAMPZ只用来协助ELPM/SPM指令决定访问哪一个程序存储器页。不同的RAMPZ0 的作用如下:
RAMPZ0 = 0: ELPM/SPM 可以访问程序存储器地址$0000 - $7FFF ( 低64K 字节)
RAMPZ0 = 1: ELPM/SPM 可以访问程序存储器地址$8000 - $FFFF ( 高64K 字节)
LPM 不受RAMPZ 设置的影响。
上一篇:ATmega128 指令执行时序
下一篇:ATmega128 通用寄存器
史海拾趣
|
我想利用2450的GPB3口的TOUT3功能发出PWM波。 在Kernel/Oal/init.c下的OEMInit()中添加代码。下面是我的代码: volatile S3C2450_IOPORT_REG *s2450IOP = (S3C2450_IOPORT_REG *)OALPAtoVA(S3C2450_BASE_REG_PA_IOPORT, FALSE); & ...… 查看全部问答> |
|
我往BSP中加6*6矩阵键盘: 编译出错: BUILD: [01:0000000086:ERRORE] C:\\WINCE600\\PLATFORM\\DEVICEEMULATOR\\src\\drivers\\matrixkey\\.\\MATRIXKEY.cpp(9) : fatal error C1083: Cannot open include file: \'matrixkey.h\': No such file ...… 查看全部问答> |
|
现在需要用EEPROM保存一些参数,程序用KEIL C写的,现在就不知道参数该怎么保存,直接赋值?还是需要其他什么操作 直接赋值的话: .... int xdata canshu; ..... canshu=122; .... 但有个EECON寄存器,不知道需不需要对这个寄存器进行操作? ...… 查看全部问答> |
|
我用电脑并口与51单片机通信的时候,采取的是EPP1.9模式,发现老是nWait=1,不知道什么原因, 有没有这方面的前辈指导一下。感谢不尽。 源码如下: #include /* inp, outp */ #include /* kbhit() et al */ #incl ...… 查看全部问答> |
|
我的写FLASH程序如下: void Flash_write(void) { unsigned z; _DINT(); // 禁止系统中断 Flash_clr(piFLASH); // 擦除信息段B for(z=0;z<4;z++) Flash_ww(piFLAS ...… 查看全部问答> |
|
module Display(clk,data,addr,read_en,write_en,data_out,seg,lbit);input clk;input read_en,write_en;input [7:0]data;input [3:0]addr;output [7:0] seg;output [7:0] lbit;output [7:0]data_out;reg [7:0]data_in[7:0];reg [7:0]seg;reg [7:0] ...… 查看全部问答> |




