能用双重for循坏写个us级延时吗
时间: 2024-03-05 19:54:34 浏览: 21
虽然使用SysTick计时器来实现us级延时是比较精确的,但如果你想使用双重for循环来实现us级延时,也是可以的。下面是一个示例代码:
```c
void delay_us(unsigned int us)
{
for (int i = 0; i < us; i++) {
for (int j = 0; j < 12; j++) {
__NOP(); // 空操作指令,不执行任何操作,用于延时
}
}
}
```
这个函数使用了两个for循环来进行延时。内部的for循环执行了12次空操作指令,因为在大多数微控制器中,空操作指令的执行时间为1个时钟周期。由于我们需要延时us级别的时间,因此外部for循环执行us次内部for循环,总共执行的空操作指令次数为`us * 12`次。这种方法的精度不如使用SysTick计时器来进行延时,受到程序运行速度和其他因素的影响,延时时间可能会有一定的误差。
相关问题
用for写个双重循环的 延时函数
以下是使用双重循环的延时函数实现。注意,这种实现方式可能不是最可靠或最准确的,因为它依赖于处理器速度和负载情况。
```c
void delay_ms(unsigned int ms) {
for (int i = 0; i < ms; i++) {
for (int j = 0; j < 100000; j++) {
// 双重循环,等待耗时
}
}
}
```
使用示例:
```c
delay_ms(1000); // 延时 1 秒
```
请注意,这种实现方式可能会导致 CPU 占用率过高,因为它会一直占用 CPU 直到延时结束。因此,建议使用其他方法来实现延时功能。
C语言用for循环写一个单位us的延时函数
可以使用以下代码来写一个单位为us的延时函数:
```
void delay_us(unsigned int us) {
unsigned long us_count = us * (F_CPU / 1000000); // F_CPU为CPU频率
__asm__ volatile (
"1: sbiw %0,1" "\n\t" // 执行 CPU 指令
"brne 1b" : "=w" (us_count) : "0" (us_count)
);
}
```
这样就可以使用 for 循环来实现一个单位为us的延时函数了。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)