历史上的今天
今天是:2025年02月19日(星期三)
2020年02月19日 | avr的flash和ram存放的数据问题
2020-02-19 来源:eefocus
简介:本文介绍了AVR单片机内flash和RAM存放数据的区别以及使用等内容。
avr单片机是基于哈佛结构,它的程序存储器和数据存储器分开。
avr的Flash存储器空间存放的内容有:
(1)text:程序代码区
(2)interrupt vectors:存放中断向量
(3)fun_lit:函数列表区。函数列表区包含了函数的入口地址。
(4)lit:整型数和浮点数常量区。存放的是程序中的常量数据。
(5)idata:全局变量和字符串的初始值存放在该区。
avr的RAM数据内存中存放的内容有:
1)data: 存放全局变量、静态变量和字符串。(注意:全局变量和字符串的初始值保存在Flash中的idata区域,在启动时被复制到RAM中)
2)bss:包括未初始化的全局变量。
avr中的EEPROM存放的是HEX文件。
AVR系列的SRAM和Flash的结构 SRAM实际上就是AVR的内存,运算只能通过32个工作寄存器,而SRAM在这个过程中起到保存数据的作用。
在做简单的工程的时候,你使用的变量可能只需要用的寄存器就足够了,但是在比较复杂的工程下,就要频繁的进行寄存器和SRAM之间的数据交换了。
如果你是使用汇编进行工作,此时你需要知道的是AVR的地址空间分配,对SRAM的操作的汇编指令等,而如果是使用C编译器,知道这些,能有帮助你优化你的程序。
所有的地址空间能被直接或者间接的寻址。
直接寻址:
在要保存(加载)数据到(从)你所指定的直接地址的时候,你可以使用sts、lds指令。
ldi r16,0x55 ;r16装入立即数0x55
sts 0x0190,r16 ;把r16里的数据保存在SRAM中地址为0x190的地方
lds r16,0x0190 ;把SRAM中地址为190的数据装入r16
间接寻址可以象C或者Pascal里的指针那样操作,就是32个寄存器里的(R26,R27)X,(R28,R29)Y,(R30,R31)Z。
还是以地址0x0190为例子
ldi XL, 0x90 ;加载目标地址的低位
ldi XH, 0x01 ;加载目标地址的高位
ld r16, X ;把目标地址的数据加载到r16
间接寻址的加载和存储和直接的指令是不一样的,间接的只能使用ls和st来执行。
AVR的地址空间是由3个主要部分构成的:32个寄存器、I/O寄存器(UART、TIME、等等)、内部SRAM。
另外不同的编译软件对FLASH中的变量定义方法不一样。
史海拾趣
|
在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器(下图中阴影部分的TDR),另一个是程序看不到的移位寄存器(下图中阴影部分Transmit Shift Register)。 对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送 ...… 查看全部问答> |
|
大虾们,这样的配置怎么样? AMAX供应商给我的配置, CPU:intel Xeon 5504 硬盘:250G SATA 内存:12G 显卡:Tesla C1060 & Quadro FX380 最近在选型,大家帮忙参谋参谋,我导师让我买台做教学实验用。他们给的价格 ...… 查看全部问答> |
|
我在编译mamece3的时候出现如下错误 LINK : fatal error LNK1104: cannot open file \'subsystem:windowsce,4.00\' 请问高手如何解决这个问题,谢谢… 查看全部问答> |
|
这是在TI网站找到的例程: // // MSP430F413 // ----------------- // /|\\| XIN|- // | | | 32kHz // --|RST XOUT|- // | ...… 查看全部问答> |
|
从复旦攻读微电子专业模拟芯片设计方向研究生开始到现在五年工作经验,已经整整八年了,其间聆听过很多国内外专家的指点。最近,应朋友之邀,写一点心得体会和大家共享。 我记得本科刚毕业时,由于本人打算研究传感器的,后来阴差阳错进了复旦 ...… 查看全部问答> |
|
用IAR给MSP430f4152烧写程序,总提示找不到单片机。仿真器用的UIF。 出错信息是: IarIdePm The debugging session could not be started。 Either the debugger initialization failed,or else the file \"F:\\Examination\\E-Meter\\Debug\\ ...… 查看全部问答> |




