void Delay_Init(void); void DelayMs(u16 nms); void DelayUs(u32 nus);
时间: 2024-05-25 20:11:50 浏览: 12
这是一个延时函数相关的函数声明,具体实现应该在另外的文件中。
`Delay_Init`函数用于初始化延时函数,可能会涉及到一些硬件资源的初始化。
`DelayMs`函数用于进行毫秒级延时,参数nms表示需要延时的毫秒数。
`DelayUs`函数用于进行微秒级延时,参数nus表示需要延时的微秒数。
相关问题
C:\Users\liuji\Desktop\STM32Project\2-1 STM32工程模板\User\delay.h(6) : void delay_init(void); C:\Users\liuji\Desktop\STM32Project\2-1 STM32工程模板\User\delay.c(5) : void delay_init(void) C:\Users\liuji\Desktop\STM32Project\2-1 STM32工程模板\User\delay.c(27) : //static inline void delay_init(void)这三个有没有重复定义,具体应该怎么改
是的,这三个函数都定义了 `void delay_init(void)`,因此存在重复定义的问题。
解决方法:
1. 删除 `delay.h` 文件中的 `void delay_init(void);` 声明,保留 `delay.c` 文件中的定义即可。
2. 在 `delay.h` 文件中使用 `extern` 关键字声明 `void delay_init(void);`,并在 `delay.c` 文件中定义该函数,这样就可以在多个文件中使用该函数了。
下面是第二种方法的实现:
delay.h 文件:
```c
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f10x.h"
#ifdef __cplusplus
extern "C" {
#endif
extern void delay_init(void);
extern void delay_ms(u16 nms);
extern void delay_us(u32 nus);
#ifdef __cplusplus
}
#endif
#endif /* __DELAY_H */
```
delay.c 文件:
```c
#include "delay.h"
static u8 fac_us = 0; //us延时倍乘数
static u16 fac_ms = 0; //ms延时倍乘数
void delay_init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
fac_us = SystemCoreClock / 8000000; //为系统时钟的1/8
fac_ms = (u16)fac_us * 1000; //非OS下,代表每个ms需要的systick时钟数
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开启计数器
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD = (u32)nms * fac_ms; //时间加载(SysTick->LOAD为24bit)
SysTick->VAL = 0x00; //清空计数器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp = SysTick->CTRL;
}
while((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL = 0X00; //清空计数器
}
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD = nus * fac_us; //时间加载
SysTick->VAL = 0x00; //清空计数器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp = SysTick->CTRL;
}
while((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL = 0X00; //清空计数器
}
```
这样就解决了重复定义的问题。
void delay_nus(unsigned int i) { i=i/10; while(--i); } void delay_nms(unsigned int n) { n=n+1; while(--n) delay_nus(900); } delay_nms(200);
这段代码是一个简单的延时函数。它包含两个函数:delay_nus和delay_nms。delay_nus函数用于微秒级延时,而delay_nms函数用于毫秒级延时。
在delay_nus函数中,参数i被除以10,然后使用while循环递减i的值,直到i为0为止。这段代码的目的是实现一个较短的延时。
在delay_nms函数中,参数n被加1,然后使用while循环递减n的值,直到n为0为止。在每次循环中,调用delay_nus函数并传入参数900进行微秒级延时。这段代码的目的是实现一个较长的延时。
最后一行代码delay_nms(200)表示调用delay_nms函数,并传入参数200进行毫秒级延时。这样程序会延时200毫秒。