void Delay_Init(void); void DelayMs(u16 nms); void DelayUs(u32 nus);
时间: 2024-05-25 09:11:50 浏览: 95
这是一个延时函数相关的函数声明,具体实现应该在另外的文件中。
`Delay_Init`函数用于初始化延时函数,可能会涉及到一些硬件资源的初始化。
`DelayMs`函数用于进行毫秒级延时,参数nms表示需要延时的毫秒数。
`DelayUs`函数用于进行微秒级延时,参数nus表示需要延时的微秒数。
相关问题
void delay_ms(u16 nms); void delay_us(u16 nus); extern u16 nTime;
`void delay_ms(u16 nms);` 和 `void delay_us(u16 nus);` 这两个函数通常是在微控制器编程中使用的延时函数,它们接受作为参数的时间量,分别以毫秒(millisecond, ms)和微秒(microsecond, us)为单位。它们的主要作用是暂停程序的执行,以便给其他任务或者硬件反应时间,尤其是在需要精确定时的场合。
`nTime` 变量是一个外部全局变量,可能是为了计数延迟时间或者存储某个时间段的总时间。这种设计允许在整个程序的不同部分复用这个计数器,比如在测量和计算延迟之后的间隔。
举个例子,如果你想要让程序暂停500毫秒,你可以这样做:
```c
void delay_500ms() {
delay_ms(500);
}
```
如果要精确到微秒级别,你会用到 `delay_us()` 函数:
```c
void delay_1000us() {
delay_us(1000);
}
```
使用这两个函数时,`nTime` 可能会被用于累积延迟,例如:
```c
void function_that_needs_delay() {
nTime += delay_ms(1000); // 暂停并累加1000毫秒
while(nTime > some_threshold) { // 如果超过设定阈值,继续等待
continue;
}
}
```
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; //清空计数器
}
```
这样就解决了重复定义的问题。
阅读全文