[应用方案] 新唐单片机如何生成精确延迟

[复制链接]
2121|18
 楼主| hehhehee 发表于 2021-3-29 23:20 | 显示全部楼层 |阅读模式
假如使用者想要产生精确的延迟时间,建议使用 __nop() 函数来组合达成。__nop() 函数能够产生 1 个精确的 CPU 频率周期延迟时间。然而,由于 flash 的速度低于 CPU 的频率速度,在 CPU 内部有快取优化的技术,编译程序也会自动针对程序做优化,造成__nop() 函数组合出来的时间会与预期的时间不同。因此,建议将程序代码放置于 SRAM 中执行,以避免优化造成的非预期延迟时间问题。



以产生 2 us 的延迟时间为例:

(1) CPU 频率= 32MHz => 1 CPU 频率周期花费 1/32000000 sec = 31.25 ns

(2) 2 us 延迟时间 = 2000 ns / 31.25 ns = 64 次 CPU 频率周期

 楼主| hehhehee 发表于 2021-3-29 23:25 | 显示全部楼层
1. 于KEIL的项目中加入一个新的.c文件
 楼主| hehhehee 发表于 2021-3-29 23:27 | 显示全部楼层
2. 将文件位置指定至SRAM

390356061f1c6b4c65.png
 楼主| hehhehee 发表于 2021-3-29 23:31 | 显示全部楼层
 楼主| hehhehee 发表于 2021-3-29 23:31 | 显示全部楼层
3. 设定 Linker 274456061f2c948e97.png
 楼主| hehhehee 发表于 2021-3-29 23:33 | 显示全部楼层
4. 编写延迟程序代码



由于执行一次 for 循环需要花费 5 个 CPU 频率周期的时间,因此可以使用以下的方式达到 2 us 的时间延迟
 楼主| hehhehee 发表于 2021-3-29 23:34 | 显示全部楼层
(1) 执行一次 for 循环需要 5 个 CPU 频率周期

(2) 执行一次 __NOP() 指令需要 1 个 CPU 频率周期

(3) 64 个 CPU 频率周期 = 8 ( 5 ( for 循环 ) + 3 * 1 ( __NOP() ) )
 楼主| hehhehee 发表于 2021-3-29 23:34 | 显示全部楼层

  1. void Delay_Test_Function(void)
  2. {
  3.     for(i = 0; i <8; i ++)/ *延迟2微秒。* /
  4.     {
  5.         __NOP();
  6.         __NOP();
  7.         __NOP();
  8.     }
  9. }
 楼主| hehhehee 发表于 2021-3-29 23:35 | 显示全部楼层
5. 测试

使用者可以利用下列程序代码进行延迟时间的测试,透过示波器量测 I/O toggle 的时间,以观察延迟函数是否精准。由于 CPU 需要下指令让 I/O 转态,因此观察到的时间中需要增加转态的指令时间 (PA0 = 0)。
 楼主| hehhehee 发表于 2021-3-29 23:36 | 显示全部楼层
执行一次 PA = 0 需花费 11 CPU 指令周期,这意味着 I/O 会持续 (64+11) * 31.25 ns = 2343.75 ns 的时间才进行转态。
 楼主| hehhehee 发表于 2021-3-29 23:38 | 显示全部楼层
  1. void Delay_Test_Function(void)
  2. {
  3.     uint32_t i,DelayCNTofCPUClock = 8;
  4.     PA0 = 1;
  5.     for(i = 0; i <DelayCNTofCPUClock; i ++)/ *延迟2微秒。* /
  6.     {
  7.         __NOP();
  8.         __NOP();
  9.         __NOP();
  10.     }
  11.     PA0 = 0;
  12. }
 楼主| hehhehee 发表于 2021-3-29 23:39 | 显示全部楼层
x史可法 发表于 2021-3-29 23:56 | 显示全部楼层
楼主有没有一些板子的示例
Harvard 发表于 2021-3-30 09:06 | 显示全部楼层
厉害了 楼主. 原厂FAE么
nawu 发表于 2021-4-8 16:08 | 显示全部楼层
精确到什么地步啊
drer 发表于 2021-4-8 16:11 | 显示全部楼层
还是如何操作时钟的问题啊
gwsan 发表于 2021-4-8 16:12 | 显示全部楼层
很难做到这么高精度的
kxsi 发表于 2021-4-8 16:13 | 显示全部楼层
能不能给一份源代码呀  呵呵呵
qcliu 发表于 2021-4-8 16:14 | 显示全部楼层
有多少个优化等级啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

89

主题

1252

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部