用keil sdk编译STM32的程序时出现“.\inc\stm32f10x_conf.h(21): error: #5: cannot open source input file "stm32f10x_type.h": No such file or directory”类似的问题,说明没有搜到此头文件,如果是用双引号 “ ” 包含的头文件,则问题肯定出在没有把此头文件放在工程文件夹内。
还有一个问题,已经把此头文件放在了工程文件夹内,但是编译时出现这个问题:.\inc\stm32f10x_type.h(28): error: #256: invalid redeclaration of type name "s32" (declared at line487 of ".\inc\stm32f10x.h"),没有任何怀疑,错误提示已经明确地说s32这个名字已经在inc\stm32f10x.h的487行定义过,所以stm32f10x_type.h中对s32的定义属于重复定义,无效。
那么为什么会出现重复定义呢? 通过双击该提示到stm32f10x_type.h定义s32的地方,以及到stm32f10x.h的第487行定义s32的地方,会发现果然有同样的定义,
如图所示:
这是不同的头文件,而且在stm32f10x.h这个头文件中会包含stm32f10x_type.h(如图,stm32f10x.h包含了另一个头文件stm32f10x_conf.h,而在stm32f10x_conf.h里面包含了stm32f10x_type.h,即相当于stm32f10x.h中包含stm32f10x_type.h——即①包含了②,②包含了③,那么①就包含了③,有点啰嗦,但会显得更清楚一些,呵呵),
为什么还会出现在这两个相关联的头文件中定义了同一个名字s32呢?
问题就出在版本上。
在我的这个工程中,因为我打算都用双引号 “ ” 来包含头文件,所以要把头文件都放到我的工程文件夹里,并设置好路径(这里不细说,有问题加后面的QQ联系)。问题就来了,stm32f10x.h这个头文件是keil mdk中的,路径为\keil mdk\ARM\INC\ST\STM32F10x,而stm32f10x_conf.h是来自我先前安装的IAR编译里的(前面说了,stm32f10x.h中是会包含stm32f10x_conf.h的。至于为什么会把IAR这个编译器中的头文件放进去,就不说了,呵呵),正确的方法是只是用一个编译器中的头文件,保证版本的一致性,在我的工程中,应该使用kei mdk中的stm32f10x_conf.h,而不是IAR中的。
那么我们看看这不同的编译器中的同名头文件有什么区别,如下图:
左边的是Keil中的,版本为V3.5.0,右边是IAR中的,版本为V1.0,版本不同!!!
版本不同,里面定义的内容不同,自然会出现不能替换的问题了。
所以要特别注意相关联的头文件(有包含关系的)是不是来自同一个版本。
关键字:STM32 头文件
引用地址:
关于STM32头文件
推荐阅读最新更新时间:2024-03-16 14:58
STM32 J-LINK SW 调试常见问题
STM32 支持 SW 调试,只需用占用两个端口 SWDIO/SWCLK 及 VCC/GND,最多四条线就可以调试。 SWDIO/SWCLK 不需要上拉或下拉电阻。 调试时常见 No Cortex-M SW Device Found 问题,可以尝试以下方法: 1、可能软件设置了JTAG_SW_DISABLE,请将BOOT0接到VCC然后复位 2、VCC电压过低,可以尝试降低 JLINK/JTRACE Cortex-M Driver Setup 中的 Max Clock,找到合适的时钟频率 3、提示找不到J-LINK,检查是否板子是否没有上电
[单片机]
STM32高级开发(11)-使用GDB调试你的工程
在GNU编译器中,GDB无疑起着无足轻重的位置,常言有道:写工程3分靠写,7分靠调。GDB作为GNU编译器下的标准调试工具,在我们的项目编写即调试过程中会被平凡的使用到。而由于我们在IDE环境下娇生惯养出来的习惯,我们可能不太容易上手一个用命令行为主要操作和显示形式的调试器。所以在这篇中我们会为大家详细的讲解GDB工具的使用,来让大家快速的入门。 怎样启动arm-none-eabi-gdb 之前我们在安装和介绍调试器驱动的时候,曾举过例子,来使用指令开启一个操作接口,用以为gdb程序提供连接。这就是嵌入式GDB的工作方式,详细来说就是,使用调试器的驱动软件指令将调试器连接目标板,并将驱动软件的GDB指令接口开启在一个设定的计算
[单片机]
STM32中0x1u 0u的含义
今天见到这种函数,查了一些他们的含义 后缀就是告诉编译器该常数的属性。 默认为有符号INT型,加了u就是无符号的,加了l就是long型。 做下移位就知道结果了。以0x80为例,左移次数过多编译器会提示你符号位被改变,即负数被移位成正数。加个u的话就被编译器识别为无符号数,可以随意移位。不会影响符号位。 例如: C语言里面0x8000000000000000u这样的常数一律默认为int型,不是什么字节。至于int型是4字节还是2字节那就是编译器的问题了。加u尾缀并不会扩展常数占用的字节数,加ul才会从int型长度扩展成long型长度。 个人理解: 也就是说0x00是int型,0x00u是无符号int型,0x00ul长
[单片机]
STM32 UART串口通讯编程方法
在对通讯时间要求比较高的时候,就需要自己对UART的通讯底层直接进行操作。我以STM32单片机为例,讲一下比较快速的UART编程方法。——其实不止是STM32这么处理,我以前使用过51的单片机,TI的MSP单片机,三菱的16位单片机,都可以采用这种方法。 基本的处理思路如下: 1. UART接收的处理方法 打开UART的接收中断,每收到一个字节就放到接收缓冲区,同时更新接收指针。当连续100ms没有收到接收字符,则认为本次帧接收完毕,置位帧接收完成标志,由主程序进行处理。 2. UART发送的处理方法 将需要发送的数据放到发送缓冲区,设置发送长度。然后发送第一个字节,并打开发送中断。在发送中断中判断是否已经发送
[单片机]
STM32控制4个LED灯循环点亮源程序
电路原理图如下: 单片机源程序如下: #include led.h void Delay(unsigned int count); //延时函数 //int main(void) //{ // // LED_Init(); //初始化与LED连接的硬件接口 // while(1) // { // u32 LED=0x00000001;//设置初始控制码 // //逐一点亮 // for(u8 i=0;i 4;i++) // { // GPIO
[单片机]
STM32外部中断易出错总结
前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己记忆不好,所以在这个给自己打个mark。 一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发; 二:外部中断分组 STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。 STM32 分组和对应中断处理函数分配: 管脚 中断标志 中断处理函
[单片机]
STM32串口接收发送子程序
/*上传STM32串口接收发送子程序,调试验证OK,供参考*/ #include STM32_UartImpl.h static UART_HandleTypeDef* pstm32uart_entry = NULL; int STM32_SendBuffer(const char* pcmd); const char* STM32_GetBuffer(void); #define UART__TIMEOUT 500 void WaitSTM32UartReady() { HAL_UART_StateTypeDef status; do { status = HAL_UART_GetState(pstm
[单片机]
深度解析STM32驱动LCD原理
TFTLCD即薄膜晶体管液晶显示器。它与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。 01驱动流程 使用FSMC驱动LCD 关于FSMC,把数据写入相应的地址,FSMC就会把地址从FSMC_A出去,写入的数据会会从FSMC_D发出去。至于片选等信号线都是自动的。读的话,直接读相应的地址,就会拿到改地址上的数据。 FSMC驱动外部SRAM时,外部SRAM的控制一般有: 地址线(如A0~A25) 数据线(如D0~D15) 写信号(WE,即WR) 读信号(OE,即RD) 片选信号
[单片机]