- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
AVR072: 访问 16 位输入输出寄存器 翻译:王育强
AVR072: 访问 16 位输入输出寄存器
翻译:王育强 2007 年 1 月 2 日
sidney_wyq@126.com
修订:邵子扬 2007 年 1 月 8 日
特点:
提供了访问 16 位输入输出寄存器的例程
包含了 AVR 和 IAR 汇编程序宏
问题描述
所有的中端和高端 AVR设备都包含 16 位定时器,有些也包含 10 位 A/D 转换器。这些 I/O
模块都有能够在 AVR核心中通过使用 in 和 out 指令来访问 16 位寄存器。 由于 AVR微控制器
的数据总线是 8 位的,所以对于 16 位输入输出寄存器的访问必须在两个指令周期里执行。
在这两个指令执行之间, 中断可能发生。 如果中断函数访问相同的资源 (16 位定时器或 ADC),
16 位寄存器的访问则必须是一个原子操作,也就是说,该操作不能被中断。
含有 16 位寄存器的 I/O 模块也包含一些临时寄存器,用它们来存储高字节( 8~ 15 位)。注
意 16 位定时器( Timer1 )只有一个临时寄存器,它被在所有的 16 位寄存器对之间共享。 一
个 16 位 I/O 读操作一般这样被执行:
① : in r16, TCNT1L ; 读低字节到的 r16 ,这会触发高字节被拷贝到临时寄存器中。
② : in r17, TCNT1H ; 从临时寄存器中读高字节。
图 1: 16 位 I/O 寄存器读操作
如果中断在两个指令执行之间发生,并且中断函数访问任意的 Timer1 低字节,则临时寄存
器的值可能被改变。从中断返回后, AVR核心现在读已被破坏的值到寄存器 r17 中。
第 1 页 共 3 页
AVR072: 访问 16 位输入输出寄存器 翻译:王育强
16 位 I/O 写操作被这样执行:
;r16 包含要被写的低字节,同时 r17 包含高字节。
① : out TCNT1H, r17 ; 写高字节到临时寄存器中。
② : out TCNT1L, r16 ; 写既低字节又临时寄存器的值到 I/O 寄存器中。
图 2: 16 位 I/O 寄存器写操作
注意在 I/O 寄存器的高、 低字节被访问的顺序上, 读操作和写操作是不同。 如果顺序被颠倒
了,则高字节值将会被错误地读写。
解决方法
我们可以使用下面所提供的 AVR汇编和 IAR C 编译器宏来避免前面所描述的情况。
AVR 汇编宏
.macro outw
cli
out @0, @1
out @0-1, @2
sei
.end macro
.macro inw
cli
in @0, @2-1
in1 @0, @2
sei
.endmacro
第 2 页 共 3 页
AVR072: 访问 16 位输入输出
文档评论(0)