完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
当我想得到一个32位定时器的当前值(隐含的一些延迟)时,我应该怎么做才能得到一致的数据呢?我的意思是,32位定时器是由两个16位定时器组成的。假设我使用TMR2/3对。然后,我可以先读取TMR2,然后读取TMR3,并将比特串接以获得32位值。但在TMR2和TMR3之间,计时器被触发,TMR3溢出,TMR2也增加。因此,我最终用较旧的TMR2值(从定时器前的嘀嗒声)和TMR3的新值(嘀嗒嘀嗒)之后。参考手册(14)。定时器,14.3.2.1 32位定时器考虑)状态:TMRx和TMRy计数寄存器对可以被读和写为单个32位值。然后,代替读取两个寄存器和连接这些值,我可以简单地将它们中的一个读为32位整数,它应该给我32位时间。R值。它似乎起作用了。还会有比赛条件吗?我的实验似乎说:不,如果我用手把寄存器串联起来,我就可以比较频繁地看到不一致的数据。如果我只读TMR2,我看不见。但是,单个32位读取可能比两个16位读取快得多,竞争条件仍然存在,但是看到格式错误的数据的可能性要小得多。我在文件中找不到答案。有人知道吗?我正在用PIC32 MZ208EFH100进行实验。
|
|
相关推荐
6个回答
|
|
|
谢谢你的回复。但是,在阅读之前停止定时器对于我的申请似乎是不可接受的。我有一个总是在后台运行计时器。我定期读取计时器值,检查溢出并更新包含当前挂钟时间的全局变量。另外,每当我需要一个非常精确的时间信息时,我调用相同的程序来更新挂钟时间。这样,我就避免了太频繁的定时器中断,同时,当我真正需要时,我有一个非常精确的时间戳。至少我想是这样。如果我停止计时器,读取值并重新启动,我会“失去”一定的时间。此外,这一微小的时间会积累,并最终变得明显的用户。我将“失去”的时间量很大程度上取决于我更新上述全局变量(挂钟时间)的频率,因此它会随着时间而变化。我也不知道我的挂钟时间与真实世界时间之间的关系,也不知道我的时间会以同样的节奏流逝——有时会加速,有时会减速。所以你的意思是,用一个32位的读数读取一个32位的定时器值也具有竞争条件?关于定时器,它不是原子性的,我可以得到两个16位半数,来自定时器的不同节拍?
|
|
|
|
|
|
我相信他意味着你只需要停止计时器,如果读它在两个16位半。
|
|
|
|
|
|
在我的情况下,预分频器正好是64。没关系,如果变量是计时器后的一个滴答(甚至十或二十个滴答),这不是问题。对我来说,问题是当我从TMRX读取的32位值实际上是来自两个不同的32位定时器值的两个16位半部的混合。例如,我希望计时器是0x1234 FFFF。我想阅读它,但在第一步,硬件加载上半部分(0x1234)和定时器更新下半年(0xffff>0x000)生产携带。然后硬件加载下半部分(0x000),定时器更新上半部分(0x1234 -gt;0x1235)。结果:当同时计时器从0x123FFFF变为0x1235000时,我读了0x1234万。这可以使我的全局变量向后退。因此,对我来说最重要的信息是,我可以读取32位值,而不必像上面那样的怪癖。谢谢你的帮助!在我的例子中,RTC是一个非常糟糕的选择。内置的RTC(据我所知)有1s的分辨率。对于我来说,对于长期的时间保持(一天中的一天,一年中的一天)和短延迟(低于1ms)来说都是很舒服的。否则,我需要有多个时间来源。有时,我需要决定当它们相互矛盾时应该做什么(例如,因为RTC是由与CPU核心不同的振荡器驱动的)。因此,如果可能的话,我希望尽可能少的时间来源。只是为了简单起见。再次感谢!此外,如果读取TMRx或TMRy比同时读取它们和连接这些位更安全,您知道Harmony为什么选择第二个选项吗?函数在32位定时器的情况下返回定时器的当前值,最后调用似乎分别读取两个半数的函数:
|
|
|
|
|
|
和谐版本是什么?
|
|
|
|
|
|
我引用了V1.10(因为这是我在应用程序中使用的)。在V1.11看起来完全一样。在V2.02.00 b的情况下略有不同:但结果是一样的,我想。
|
|
|
|
|
|
嗨,当最初设计Harmony中的定时器接口时,它希望能够用在8位CPU中有8位和16位定时器、16位CPU中有16位和32位定时器、32位处理器中有16位和32位定时器的设备上。因此,有许多不同的模板。我没有在实际的硬件中验证这一点,但我一直有这样的印象,在一个原子32位加载操作中,可以读取配置用于32位操作的定时器(对)。参见家庭参考手册:DS61105F-page 14-5:图14-3:TyPEB定时器块图(32位),显示32位并行总线接口到定时器寄存器。以及节:14.3.2.1 32位定时器考虑相同的文档:但是除非以上只是出于一厢情愿,那么SFR寄存器文档在数据表中为PIC32MZ…EF…和PIC32MX……是错误的和误导的,因为没有在TMR2、TMR4和类似的寄存器中显示完整的32位定时器值。在Harmony中,在v2-03b/framework/./tmr/templates/tmr_.32Bit_In32BitRegister.h中有一个模板文件,看起来它可能能够做正确的事情。message#8所示的代码片段肯定不是原子式的,也不是中断安全的,并且如果32位读取工作正常,就不应该使用它。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1124浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1097浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 07:23 , Processed in 0.741759 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2178