常见问答
- M051 系列(95)
- M0518 系列(97)
- M0519 系列(43)
- M0564 系列(1)
- Mini51 系列(90)
- Nano100 / 102 系列(101)
- Nano103 Base 系列(10)
- Nano110 / 112 LCD 系列(100)
- Nano120 USB 系列(111)
- Nano130 USB+LCD 系列(110)
- NUC029 系列(94)
- NUC100 / 200 系列(102)
- NUC120 / 122 / 123 / 220 USB 系列(116)
- NUC121/125 系列(1)
- NUC126 USB 系列(2)
- NUC130 / 230 CAN 系列(103)
- NUC131/NUC1311 CAN 系列(98)
- NUC140 / 240 USB+CAN 系列(114)
- M451 Base 系列(118)
- M451M 系列(117)
- M452 USB 系列(130)
- M4521 USB 系列(1)
- M453 CAN 系列(128)
- M463 CAN FD/USB HS 系列(1)
- M467 Ethernet/Crypto 系列(1)
- M471 系列(1)
- M479 Motor Control Series(1)
- M481 Base 系列(4)
- M482 USB FS OTG 系列(4)
- M483 CAN 系列(4)
- M484 USB HS OTG 系列(4)
- M485 Crypto 系列(4)
- M487 Ethernet 系列(4)
- M4TK 触摸 IC 系列(25)
- NUC442 / 472 系列(130)
- NUC472 Series(1)
- NUC505 系列(138)
常见问答
如何产生精确的延迟时间? 日期:2020-02-07
假如使用者想要产生精确的延迟时间,建议使用 __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 频率周期
1. 于KEIL的项目中加入一个新的.c档案
2. 将档案位置指定至SRAM
3. 设定 Linker
4. 撰写产生延迟的程序代码
由于执行一次 for 循环需要花费 5 个 CPU 频率周期的时间,因此可以使用以下的方式达到 2 us 的时间延迟
(1) 执行一次 for 循环需要 5 个 CPU 频率周期
(2) 执行一次 __NOP() 指令需要 1 个 CPU 频率周期
(3) 64 个 CPU 频率周期 = 8 ( 5 ( for 循环 ) + 3 * 1 ( __NOP() ) )
void Delay_Test_Function(void)
{
for(i = 0; i < 8 ; i++) /* Delay for 2 micro seconds. */
{
__NOP();
__NOP();
__NOP();
}
}
5. 测试
使用者可以利用下列程序代码进行延迟时间的测试,透过示波器量测 I/O toggle 的时间,以观察延迟函数是否精准。由于 CPU 需要下指令让 I/O 转态,因此观察到的时间中需要增加转态的指令时间 (PA0 = 0)。
执行一次 PA = 0 需花费 11 CPU 指令周期,这意味着 I/O 会持续 (64+11) * 31.25 ns = 2343.75 ns 的时间才进行转态。
void Delay_Test_Function(void)
{
uint32_t i, DelayCNTofCPUClock = 8;
PA0 = 1;
for(i = 0; i < DelayCNTofCPUClock ; i++) /* Delay for 2 micro seconds. */
{
__NOP();
__NOP();
__NOP();
}
PA0 = 0;
}
产品: | 微控制器 ,8 位 8051 微控制器 ,Arm Cortex-M0 微控制器 ,Arm Cortex-M23 微控制器 ,Arm Cortex-M4 微控制器 |
---|---|
应用: | |
功能: |