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)这三个有没有重复定义,具体应该怎么改
时间: 2023-06-28 12:06:58 浏览: 177
是的,这三个函数都定义了 `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; //清空计数器
}
```
这样就解决了重复定义的问题。
阅读全文