error: unknown type name 'u16' 6 | void delay_ms(u16 nms); | ^~~为什么报错
时间: 2024-02-15 10:44:23 浏览: 24
这个错误通常是因为编译器无法识别类型名称'u16'。这可能是由于没有包含所需的头文件或类型定义。
u16通常是一个16位无符号整数类型的缩写,可能是由于您使用的编译器不支持u16类型而导致无法识别。你可以尝试将'u16'替换为'unsigned short'或'uint16_t'类型。
如果你使用的是某个库或框架,你需要查找该库或框架的文档以了解所需的头文件或类型定义。
相关问题
//对72M条件下,nms<=1864 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_ms(u16 nms) { u16 i; for(i=0;i<nms;i++) delay_ms(1); }
这段代码是一个延时函数的实现,用于延时指定的毫秒数。它使用了系统滴答定时器(SysTick)来实现延时功能。函数`delay_ms`接收一个参数`nms`,表示要延时的毫秒数。首先,将参数`nms`乘以一个变量`fac_ms`,然后将计算结果加载到SysTick的LOAD寄存器中,作为倒计时的值。然后,清空计数器的值和控制寄存器的值,开始倒计时。在倒计时过程中,程序会不断读取SysTick的控制寄存器的值,并判断倒计时是否完成。当倒计时完成时,关闭计数器,并将计数器的值清零。函数`Delay_ms`是对`delay_ms`函数的封装,用于延时指定的毫秒数。它通过循环调用`delay_ms`函数一次延时1毫秒的方式来实现延时功能。
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; //清空计数器
}
```
这样就解决了重复定义的问题。