AVR073 在ATtiny261(461、861)中访问10位和16位寄存器.doc

AVR073 在ATtiny261(461、861)中访问10位和16位寄存器.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AVR073 在ATtiny261(461、861)中访问10位和16位寄存器

AVR073: 在ATtiny261/461/861中访问10位和16位寄存器 翻译:王育强 2007年1月2日 sidney_wyq@126.com /Counter0(16位) Timer/Counter1(10位) 定时器/计数器0 Timer/Counter0(TC0)模块能够在既8位又16位的模式下使用。在8位模式下操作时,不需要特别考虑;在16位模式下操作时,当访问TCNT0L/H和OCR0A/B时则必须进行特别考虑。 TC0有一个单独的8位寄存器,被用作在16位访问时来临时存储高字节。这个寄存器在两种情况下被使用:在以16位模式访问TCNT0时;在OCR0以16位输入捕获模式下使用时。访问低字节(TCNT0L或OCR0A)时会触发16位读写操作:当16位寄存器的低字节被CPU写时,高字节被存储到临时寄存器中,被写的低字节和临时寄存器中的高字节以同样的时钟周期被拷贝到16位寄存器中;当CPU读16位寄存器的低字节时,其高字节以与低字节被读的同一时钟周期被拷贝到临时寄存器中。 16位写操作 16位写操作能够通过首先写高字节到TCNT0H寄存器中而被执行。首先高字节被拷贝到临时寄存器中,然后TCNT0L才被写,并触发16位值在一个时钟周期里被拷贝。 16位读操作 当读低字节寄存器时(TCNT0L或OCR0A),16位读操作被初始化,这将触发高字节被拷贝到临时寄存器中,在读高字节寄存器时将返回之前被存储的高字节。 定时器/计数器1 Timer/Counter1(TC1)是10位/8位的定时器/计数器模块。在8位模式下使用时,不需要特别考虑;在10位模式下使用时,10位寄存器的访问需要使用一个公共的2位寄存器——TC1H,它用来在读写操作时存储高字节。10位TC1寄存器和它们与8位数据总线的连接见图2-1。 图2-1: Timer/Counter1 10位寄存器 10位写操作 10位写操作首先通过写最高2位到公共TC1H寄存器中。当低字节被CPU写入时,已存储在TC1H寄存器中的2位和低字节在相同的时钟周期里被拷贝到10位寄存器中。 读写操作并不清除TC1H寄存器,这使得在写多个10位TC1寄存器时只需对TC1H写一次即可。注意如果一个8位值被写到10位TC1寄存器,而TC1H没有被使用时,那么前一个读写操作的TC1H值可能被拷贝到10位目标寄存器中,所以无论什么时候写10位TC1寄存器,TC1H寄存器都应该被明确地写,除非TC1H的值是已知的。 10位读操作 10位读操作通过首先读10位寄存器的低字节而被执行,这将触发最高2位被拷贝到TC1H寄存器中。 确保多字节寄存器的原子访问 在使用中断的系统里,访问多字节寄存器可能会带来一定的风险。考虑图2-2所示的这种情况:一个10位值将要被写到OCR1A中,TC1H寄存器已经装载了高字节,低字节即将被写入。然而,这时一个中断在这两个操作之间发生了,转入执行中断服务例程(ISR),读取TCNT1寄存器的值。在TCNT1被访问时,为了完成读操作,高字节被拷贝到了TC1H寄存器中。当执行返回到中断点时,TC1H已被破坏了,但是应用程序却无法检测到这一点。当对OCR1A的第二部分写操作被执行时(低字节),错误的高字节被复制了。 图2-2: 中断破坏 通过确保10位和16位寄存器在一个原子操作被访问,我们可以防止图2-2中的情况发生,它在所有的10位和16位访问期间禁止了中断。实现原子访问最常见的方法如图2-3所示。该方法在代码的任何位置使用都是安全的,但是它增加了执行原子访问所需要的指令数,因此弄明白在多字节访问期间什么时候需要阻止中断是重要的。 通常初始化操作在中断发生之前执行,所以在这个阶段没有必要阻止中断。 当中断被执行时,AVR核心自动清除全局中断标记,因此如果在ISR中不手动设置全局中断标记,那么在ISR执行期间访问多字节寄存器也是安全的。 如果没有ISR访问任何多字节寄存器,那么在不阻止中断的情况下,对它们的访问也是安全的。 图2-3: 10位/16位寄存器的原子访问 同步问题 注意:在TC1中,由于要同步电路,个别TC1寄存器不能在被写后即时读回。更详细的信息,请参考ATtiny261/461/861数据手册中的“同步“一节。 该文档未涵盖的多字节寄存器 在ATtiny261/461/861中,一些其它的多字节寄存器在该文档中没有被涵盖到(如ADCL/H)。这些寄存器是地址连续的,允许多字节访问被编译器明确地处理,因此在本文档中没有被讨论。然而要注意,程序员仍然需要确保这些寄存器的原子访问,如2.3小节说明的那样。 包含的宏 这篇应用笔记所包含的是一份完整的ANSI C宏,它被用于执行在文档中所描述的操作。每一个操作都提供了两个宏,一个是中断安全的,另一个非

您可能关注的文档

文档评论(0)

ayangjiayu4 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档