不借用库函数,用c写一个延时函数
时间: 2024-12-13 13:28:05 浏览: 2
在C语言中,如果没有预定义的库函数支持,可以使用系统定时器函数或者嵌套循环的方式实现简单的延迟。这里提供一个基于毫秒级别的简单延时函数示例:
```c
#include <stdio.h>
#include <time.h>
// 自定义延时函数,单位为毫秒
void delay(int milliseconds) {
struct timespec spec;
spec.tv_sec = milliseconds / 1000; // 转换为秒
spec.tv_nsec = (milliseconds % 1000) * 1000000; // 将剩余毫秒转换为纳秒
while (nanosleep(&spec, NULL) == -1 && errno != EINTR) { // 睡眠并检查是否被中断
perror("Error in sleep");
}
}
int main() {
int delay_time = 5000; // 延迟5秒
printf("Start delaying...\n");
delay(delay_time);
printf("Delay over.\n");
return 0;
}
```
这个函数通过`nanosleep`系统调用来让当前线程睡眠指定的时间。注意,如果在睡眠过程中有信号中断,`errno`会被设置为`EINTR`,在这种情况下我们会忽略中断继续等待。
相关问题
使用systick库函数写一个ms级的延时函数
以下是使用systick库函数编写的ms级延时函数:
```c
#include "stm32f4xx.h"
void SysTick_Handler(void) {
// 空函数,不需要做任何事情
}
void delay_ms(uint32_t ms) {
// 配置SysTick定时器
SysTick->LOAD = (uint32_t)(ms * (SystemCoreClock / 1000));
SysTick->VAL = 0x00;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待定时器计数完成
SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk); // 关闭定时器
}
```
使用方法:
```c
int main(void) {
// 初始化SysTick定时器
SysTick_Config(SystemCoreClock / 1000);
// 延时1秒
delay_ms(1000);
// 无限循环
while(1) {
}
}
```
注意:在使用此延时函数前,需要先初始化SysTick定时器。在本例中,我使用了`SysTick_Config`函数来初始化SysTick定时器,并将SysTick定时器的时钟源配置为系统时钟,每隔1ms触发一次中断。由于SysTick定时器的计数值是由CPU时钟除以预分频值得到的,因此在不同的MCU上可能需要根据实际情况调整代码中的`SystemCoreClock`值。
使用systick库函数写一个ms级的延时函数并延时点灯
好的,以下是使用systick库函数编写ms级延时函数并延时点灯的示例代码:
```c
#include "stm32f10x.h"
// 延时函数,延时时间为ms
void delay_ms(uint32_t ms)
{
SysTick->LOAD = SystemCoreClock / 1000 - 1; // 计数器的重装值
SysTick->VAL = 0; // 清空计数器的当前值
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; // 开启计数器
while (ms--)
{
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待计数器计满1ms
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭计数器
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 点亮PC13引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
while (1)
{
GPIO_SetBits(GPIOC, GPIO_Pin_13); // PC13置高,点亮LED灯
delay_ms(1000); // 延时1s
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // PC13置低,熄灭LED灯
delay_ms(1000); // 延时1s
}
}
```
在该示例代码中,我们使用了STM32的systick库函数来编写了一个ms级的延时函数。在主函数中,我们点亮了PC13引脚,并使用delay_ms函数延时1s,之后熄灭LED灯并再次使用delay_ms函数延时1s。这样就实现了LED灯每隔1s闪烁的功能。
阅读全文