AVR汇编(二):AVR架构介绍
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核心相连。

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 指令访问整个程序空间。

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)。

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

EEPROM Memory
ATmega328P拥有1KB的EEPROM空间,能够对其进行单字节的读写操作,需要通过 EEARH 、 EEARL 、 EEDR 、 EECR 寄存器进行访问。
AVR内核
如下图所示,AVR内核采用哈佛架构,程序空间和数据空间相互独立。指令以单级流水线方式执行,执行一条指令的同时预取出下一条指令。

AVR内核由ALU(算术逻辑单元)、 SREG (状态寄存器)、通用寄存器堆、 SP (最栈指针)、 PC (程序计数器)构成。
ALU能够以单周期的时间对32个通用寄存器进行算术、逻辑、位操作,一些实现中还支持乘法运算。
通用寄存器堆支持以下4种操作:
- 1个8位操作数,1个8位结果;
- 2个8位操作数,1个8位结果;
- 2个8位操作数,1个16位结果;
- 1个16位操作数,1个16位结果。
其中,只有 r16 至 r31 支持立即数寻址,r26 至 r31 可以两两组合为索引寄存器 X 、 Y 、 Z ,供间接寻址时使用。

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

| 标志位 | 名称 | 描述 |
|---|---|---|
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 指向下一个可用的位置(即空减栈)。

PC (程序计数器)指向下一条执行指令的地址。ATmega328P的 PC 为14位宽度,由于Flash存储单元是16位宽,所以可以寻址2^14=16K个字(即32KB)。上电时, PC 的值为0x0000。
参考资料
AVR汇编(二):AVR架构介绍的更多相关文章
- (转)OpenStack —— 原理架构介绍(一、二)
原文:http://blog.51cto.com/wzlinux/1961337 http://blog.51cto.com/wzlinux/category18.html-------------O ...
- MemSQL分布式架构介绍(二)
接上次的MemSQL分布式架构介绍(一),原文在这里:http://docs.memsql.com/latest/concepts/distributed_architecture/ 首先上张图,是我 ...
- 从零开始编写自己的C#框架(5)——三层架构介绍
三层架构对于开发人员来说,已经是司空见惯了,除了大型与超小型项目外,大多都是这种架构来进行开发. 在这里为初学者们简单介绍一下三层架构: (下面内容摘自<趣味理解:三层架构与养猪—<.NE ...
- MemSQL分布式架构介绍(一)
最近在了解MemSQL架构,看了些官方文档,在这里做个记录,原文在这里:http://docs.memsql.com/latest/concepts/distributed_architecture/ ...
- Apache Shiro 使用手册(一)Shiro架构介绍 - kdboy - ITeye技术网站
转载 原文地址 http://kdboy.iteye.com/blog/1154644 一.什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理 ...
- Apache Shiro 使用手册(一)Shiro架构介绍
一.什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户"登录": 授权 - ...
- 大型网站技术架构介绍--squid
一.大型网站技术架构介绍 1.pv高 ip高 并发量 2.大型网站架构重点 1. 高性能:响应时间,TPS,系统性能计数器.缓存,消息队列等. 高可用性High Availabilit ...
- Android_进化史和平台架构介绍
一.Android平台发展史 2008年9月,谷歌正式发布了Android 1.0系统,全球第一台Android设备HTC (G1) 2009年4月,谷歌正式推出了Android 1.5 ...
- 80x86汇编小站站长简单介绍-2014年08月23日
[序言] 旧版的"80x86汇编小站站长简单介绍"已经过时了, 因此于2013年10月01日花费1个小时又一次更新和排版一次. [人生格言] 1] 一生都用头脑而不是情绪解决这个 ...
- Kylin系列之二:原理介绍
Kylin系列之二:原理介绍 2018年4月15日 15:52 因何而生 Kylin和hive的区别 1. hive主要是离线分析平台,适用于已经有成熟的报表体系,每天只要定时运行即可. 2. Kyl ...
随机推荐
- iview中时间选择器组件改变日期格式
//改变视图的显示格式,但不会改变value的值的格式 format="yyyy-MM-dd" //改变value值的格式 @on-change="anZhuangDat ...
- 2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子 你有 n 颗球。箱子的顶部和底部都是开着的。 箱子中的每个单元格都有一个对角线挡板,跨过单元格的两个角, 可以将球导
2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子 你有 n 颗球.箱子的顶部和底部都是开着的. 箱子中的每个单元格都有一个对角线挡板,跨过单元格的两个角, 可以将球导 ...
- 2021-02-06:假设字符串str长度为N,请问最长回文子串的长度是多少?
福哥答案2021-02-06: 1.动态规划.无代码,见图.2.中心扩展法.无代码.3.Manacher算法.有代码,见图.1)理解回文半径数组.2)理解所有中心的回文最右边界R,和取得R时的中心点C ...
- 微信小程序setData()异常
近来开发一个小程序的项目,遇到使用setData()始终报错的情况,其问题奇特难解- 一.操作错误截图 如上图,只要将setData放置在回调函数中就会出现异常,如果不放在回调中就正常: 好郁闷,wh ...
- 代码随想录算法训练营Day2|977有序数组的平方 209.长度最小的子数组 59螺旋矩阵Ⅱ(C++)
LeetCode刷题,代码随想录算法训练营Day2 977.有序数组的平方 题目链接 : 977.有序数组的平方 题目思路:关键在于双指针思想的应用 输入:nums = [-4,-1,0,3,10] ...
- XTTS测试遇到问题:ORA-20001、ORA-06512
现场测试工程师在半夜电话反馈:在新建的小测试库做XTTS流程验证,遇到错误: ERROR at line 1: ORA-20001: TABLESPACE(S) IS READONLY OR, OFF ...
- 如何制作 Storybook Day 网页上的 3D 效果?
Storybook 刚刚达到了一个重要的里程牌:7.0 版本!为了庆祝,该团队举办了他们的第一次用户大会 - Storybook Day.为了更特别,在活动页面中添加了一个视觉上令人惊叹的 3D 插图 ...
- 6. SpringMVC的视图
SpringMVC 中的视图是 View 接口,视图的作用渲染数据,将模型 Model 中的数据展示给用户 SpringMVC 视图的种类很多,默认有转发视图和重定向视图 当工程引入 jstl 的依赖 ...
- 【Promptulate】一个强大的LLM Prompt Layer框架
本文节选自笔者博客: https://www.blog.zeeland.cn/archives/promptulate666 前言 在构建了[prompt-me]一个专为 Prompt Enginee ...
- SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件
之前我们已经,出了一些列文章. 讲解如何封统一全局响应Restful API. 感兴趣的可以看我前面几篇文章 (整个starter项目发展史) SpringBoot定义优雅全局统一Restful AP ...