写一个延时函数delay_ms()
时间: 2024-03-24 17:37:15 浏览: 36
好的,下面是一个简单的延时函数delay_ms()的代码示例:
```c
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
{
for (j = 0; j < 1000; j++); // 空循环延时1ms
}
}
```
在这个函数中,我们使用了两个嵌套的循环来实现ms级别的延时。每次外层循环会重复执行一定次数的内层循环,而内层循环则是一个空循环,没有任何实际操作,只是通过多次空循环来达到一定的延时效果。具体地,我们假设每个空循环的执行时间为1us,那么1000个空循环的执行时间就是1ms,从而实现了1ms的延时。外层循环则重复多次内层循环,以实现指定的延时时间。
需要注意的是,这个函数中的延时时间是根据空循环的执行时间来估算的,并不是非常精确。如果需要更精确的延时时间,可以考虑使用硬件定时器或其他更为精确的延时方法。
相关问题
程序中的延时函数Delay_Ms(),USART_Init()和EEPROM_Init()函数也帮我写下吧
好的,以下是延时函数Delay_Ms()的代码:
```
void Delay_Ms(uint32_t n)
{
SysTick->LOAD = 9*n; //设置定时器装载值,每个节拍为10us
SysTick->VAL = 0x00; //清空计数器
SysTick->CTRL = 0x01; //开启定时器
while(!(SysTick->CTRL&(1<<16))); //等待时间到达
SysTick->CTRL = 0x00; //关闭定时器
SysTick->VAL = 0X00; //清空计数器
}
```
以下是USART_Init()函数的代码:
```
void USART_Init(uint32_t baud_rate)
{
RCC->APB2ENR |= 1<<14; //使能USART1时钟
RCC->APB2ENR |= 1<<2; //使能GPIOA时钟
GPIOA->CRH &= 0xFFFFF00F; //清零CRH的第13~16位和第9~12位
GPIOA->CRH |= 0x000008B0; //设置CRH的第13~16位和第9~12位
USART1->BRR = 72000000/baud_rate; //设置波特率
USART1->CR1 |= 1<<3; //使能发送
USART1->CR1 |= 1<<2; //使能接收
USART1->CR1 |= 1<<13; //使能USART1
}
```
最后是EEPROM_Init()函数的代码:
```
void EEPROM_Init(void)
{
RCC->AHB1ENR |= 1<<6; //使能GPIOG时钟
GPIOG->MODER &= 0xFFFFFF3F; //将GPIOG的第7~10位清零
GPIOG->MODER |= 0x00000040; //将GPIOG的第7~10位设置为输出模式
GPIOG->ODR |= 1<<6; //将PG6输出高电平
}
```
delay_ms函数用法
delay_ms函数是一个用于延时的函数。它用于在程序中暂停执行一段时间。根据引用、引用和引用提供的代码,可以看出delay_ms函数可以接受一个参数,该参数表示要延时的毫秒数。具体使用方法如下:
1. 单次延时:
使用delay_ms函数,传入要延时的毫秒数作为参数,即可实现单次延时。
2. 循环延时:
使用for循环结构,将delay_ms函数嵌套在循环内部,并设置循环次数,即可实现循环延时。
3. 自定义延时函数:
可以根据需要编写自己的延时函数,如引用中的mydelay_ms函数。该函数使用while循环和delay_ms函数实现延时。
需要注意的是,不同开发板或开发环境可能对延时函数的范围有限制。具体的限制可以参考引用和引用提供的代码。