完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
大家好,
使用 STM32F429 并阅读在线文档,如果 SYSCLK 为 16Mhz,我经常会看到这段用于在 Ms 中生成延迟的代码
据我了解,要实现 1 毫秒的延迟,我们需要 FOSC=16MHz TOSC=1/16Mhz = 62.5nS 对于1Ms,那么我可以通过以下等式计算需要“燃烧”多少个周期: My_1_Ms_counter = 1mS / TOSC = 0.001 / 62.5nS = 16000 总之,我需要执行 16000 条虚拟指令才能获得 1 毫秒的代码执行时间(因此延迟)。 我回到我为什么使用 3195 的问题? 谢谢 |
|
相关推荐
1个回答
|
|
我可以猜出 3195 号码的来源,并且我可以向您保证,至少在某些情况下它是错误的,而且您很幸运,它按规定工作。这是我们用来延迟 *至少* 请求的处理器周期数的代码(对于以秒为单位的绝对延迟,由调用者知道当前的 CPU 频率是多少并传递正确的周期数) :
这也假设请求的延迟是最小的,并且可以等待比请求更长的时间;如果涉及中断,则不会考虑任何中断,并且延迟将比严格需要的时间长 - 因此它不适合实时目的,只能用于满足诸如“等待至少 2 毫秒时钟稳定”。 在这种情况下,要在 CPU 以 16 MHz 运行时延迟 1 毫秒,您将传递 16000 的延迟值,该值将除以 3 以获得 5334 次循环迭代的计数。我的猜测是,在您的示例的 for 循环情况下,编译循环包含一些需要 5 个周期而不是 3 个周期的序列,正确的值大约是 3200 次迭代 - 非常接近您的 3195。当然,a更好或不同的优化级别可能会在未来的某个时间毁掉你的一周,因为编译循环现在只需要 3 个周期而不是 5 个周期来执行......你所有的延迟最终都太短了,你的设备驱动程序都不再工作了. 最后,正如名称“__spin_delay_m4()”所暗示的那样,这仅对 M4 CPU 有效。M7 可以使用相同的延迟循环体,但推测它在单个循环中同时执行减法和分支,因此必须增加迭代计数以匹配所需的循环计数(省略(循环 + 2)/3 数学)。我没有在 M0 或 M33 上测试过,所以不能说可能需要什么调整,如果有的话。 正如其他人所说,如果您可以访问某种类型的计时器单元(SYSTICK、TIM 或 DWT),那么这些都是获得更准确延迟的所有选项,并且您可以通过这些选项将 CPU 置于低功耗模式在延迟期结束时等待中断唤醒您的 WFI 指令。它们都具有与 CPU 无关的优势。 |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2674 浏览 1 评论
3224 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1797 浏览 1 评论
3627 浏览 6 评论
6010 浏览 21 评论
953浏览 4评论
1324浏览 4评论
在Linux上安装Atollic TRUEStudio的步骤有哪些呢?
599浏览 3评论
使用DMA激活某些外设会以导致外设无法工作的方式生成代码是怎么回事
1318浏览 3评论
1377浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-5 07:31 , Processed in 1.114919 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号