2

AVR汇编(二):AVR架构介绍 - chinjinyu

 1 year ago
source link: https://www.cnblogs.com/chinjinyu/p/17617636.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

AVR汇编(二):AVR架构介绍

ATmega328P介绍#

ATmega328P是Atmel公司(现Microchip公司)推出的一个基于AVR架构的高性能低功耗单片机,拥有32KB的Flash、1KB的EEPROM以及2KB的SRAM等资源,具体如下表:

资源 主要特征
Flash 32KB
频率 16MHz
EEPROM 1024B
定时器 2个8bit,1个16bit
PWM 6通道
ADC 8通道10bit
比较器 1
GPIO 23
USART 1
SPI 1
TWI 1
看门狗 1
RTC 1
电压 0~8MHz @ 2.7~5.5V
0~16MHz @ 4.5~5.5V

如下图所示,ATmega328P的AVR核心通过数据总线与各个外设相连,另外也可以发现AVR采用的是哈佛架构,Flash和SRAM相互独立,通过不同的总线与AVR核心相连。

image.png

AVR内存空间#

AVR内核包含两块内存空间:数据空间(data memory)和程序空间(program memory),另外,ATmega328P还包含额外用于数据存储的EEPROM空间(EEPROM memory)。

Program Memory#

ATmega328P的程序指令存储在片上的32KB Flash中,由于AVR指令都是16位或32位的,因此Flash是以16位(1个字)为单元组织的,即16Kx16bit,地址空间为0x0000~0x3FFF。

ATmega328P的程序空间分为两个部分:Application和Bootloader。Bootloader存放在高地址处,大小可以通过fuse相关位进行配置,有256/512/1024/2048字4种选择。

可以通过 LPM 指令访问整个程序空间。

image.png

Data Memory#

ATmega328P的数据空间大小为2303字节,由4个部分组成:

  • 寄存器堆:包含32个通用寄存器。
    • 通过 MOV / MOVW 指令访问,地址为0x00~0x1F。
  • I/O空间:包含64个I/O寄存器。
    • 通过 IN / OUT 指令访问时,I/O空间独立编址到0x00~0x3F;
    • 通过 LD / LDS / LDD / ST / STS / STD 访问时,地址为I/O地址+0x20;
    • I/O地址为0x00~0x1F的寄存器支持位寻址,可以通过 SBI / CBI / SBIS / SBIC 指令访问。
  • 扩展I/O空间:包含160个扩展I/O寄存器。
    • 只能通过 LD / LDS / LDD / ST / STS / STD 指令访问。
  • SRAM空间:2KB,地址从0x0100开始。

数据空间支持5种寻址方式:

  • 直接寻址(direct);
  • 间接寻址(indirect);
  • 带偏移的间接寻址(indirect with displacement);
  • 带前自减的间接寻址(indirect with pre-decrement);
  • 带后自增的间接寻址(indirect with post-increment)。

image.png

对SRAM的访问需要耗费2个CPU周期。

image.png

EEPROM Memory#

ATmega328P拥有1KB的EEPROM空间,能够对其进行单字节的读写操作,需要通过 EEARHEEARLEEDREECR 寄存器进行访问。

AVR内核#

如下图所示,AVR内核采用哈佛架构,程序空间和数据空间相互独立。指令以单级流水线方式执行,执行一条指令的同时预取出下一条指令。

image.png

AVR内核由ALU(算术逻辑单元)、 SREG (状态寄存器)、通用寄存器堆、 SP (最栈指针)、 PC (程序计数器)构成。

ALU能够以单周期的时间对32个通用寄存器进行算术、逻辑、位操作,一些实现中还支持乘法运算。

通用寄存器堆支持以下4种操作:

  • 1个8位操作数,1个8位结果;
  • 2个8位操作数,1个8位结果;
  • 2个8位操作数,1个16位结果;
  • 1个16位操作数,1个16位结果。

其中,只有 r16r31 支持立即数寻址,r26r31 可以两两组合为索引寄存器 XYZ ,供间接寻址时使用。

image.png

SREG (状态寄存器)包含8个标志位:

image.png
标志位 名称 描述
I 中断使能位 置位使能中断,使用 SEL / CLI 指令访问
T 传输位 使用 BLD / BST 指令访问
H 半进位标志 当bit 3向bit 4进位时置位
S 符号位 S = N xor V
V 溢出标志 结果超过符号数范围时置位
N 负数标志 结果是负数时置位
Z 零标志 结果为0时置位
C 进位标志 结果超过无符号数范围时置位

SP (堆栈指针)位于I/O空间,用于存储局部变量、中断和子程序的返回地址。堆栈从地址高处往低处增长, SP 指向下一个可用的位置(即空减栈)。

image.png

PC (程序计数器)指向下一条执行指令的地址。ATmega328P的 PC 为14位宽度,由于Flash存储单元是16位宽,所以可以寻址2^14=16K个字(即32KB)。上电时, PC 的值为0x0000。

参考资料#


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK