stm32常见错误分析

发布者:calmrs最新更新时间:2018-09-01 来源: eefocus关键字:stm32  常见错误 手机看文章 扫描二维码
随时随地手机看文章

1.warning:  #550-D: variable "d" was set but never used
描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.
解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.

2.warning:  #1-D: last line of file ends without a newline
描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样.
解决:可以不理会.若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行.

3. warning:  #111-D: statement is unreachable
描述:声明不可能到达.多出现在这种场合:
 int main(void)
 {
   ...
  
        while(1) //无限循环,这在不使用操作系统的程序中最常见
       {
             ...
   
        }
  
   return 0; //这句声明在正常情况下不可能执行到,编译器发出警告
 }
 
解决:不理会.

4. warning: C3017W: data may be used before being set
描述:变量'data'在使用前没有明确的赋值.如:
 uint8 i,data;  //定义变量i和data,二者都没有明确赋值

 for ( i = 0; i < 8; i++) //变量'i'在语句中被赋值0
 {
     if ( IO1PIN & SO_CC2420 )
      data |= 0x01;  //变量'data'在使用前没有明确赋值,编译器发出警告
     else
      data &= ~0x01;
 }
解决:应仔细衡量该变量的初始值是否为0,若是,可以不理会这个警告,因为MDK编译器在程序执行前,会将使用到的数据区初始化为0,但若是该变量的初始值不应该是0,忽略这个警告可能会引起致命错误.这个警告应引起足够重视.应养成变量赋初值的习惯,好在有编译器给把关.

5. warning:  #177-D: variable "temp" was declared but never referenced
描述:变量'temp'进行了声明但没有引用.多出现在声明了一个变量,但却没有使用它,它和warning:  #550-D: variable "temp" was set but never used不同之处在于temp从没有使用过.
解决:若是定义的变量确实没有用,删除掉;若是有用,则在程序中使用.
与该警告类似的还有 warning:  #177-D: function "MACProcessBeacon" was declared but never referenced

6. warning:  #940-D: missing return statement at end of non-void function "DealwithInspect2"
描述:返回非空的函数"DealwithInspect2"的最后缺少返回值声明.如:
 int DealwithInspect2(uint32 test)
 {
  ...
  ...
  ...
    //此处应该是return x;返回一个int型数据,若是没有返回值,编译器产生警告
 }

7..warning:  #1295-D: Deprecated declaration lcd_init - give arg types

描述:在定义函数的时候,如果你写上函数参数,就会有这个警告,比如void timer_init(); 这里就没有形参,如果这样的话,编译器会给出警告.

 

 

 

 

 

1. error:  #65: expected a ";"
描述:缺少分号.大多是漏忘';'.
解决:双击错误行,在定位到错误点的附近找到没加';'号的语句,加上分号.并不一定在定位到的错误行才却分号,可能是这行的上一行,也可能是下一行.

2. error:  #65: expected a ";"和 error:  #20: identifier "xxxx" is undefined一块出现,而且后面的error: #20错误可能一大堆
描述:这个错误对于第一次遇上的人来说绝对是个噩梦,当错误出现,满怀希望的双击错误提示,来到错误行时却愕然发现,错误行绝对没有错,于是找找错误行的上一行,下一行,没有错误,再找上上行,下下行...让人无比郁闷的事情出现了:编译提示的所有错误行都不可能有错误出现.其实这最可能是你在.h文件声明外部变量或者函数时,没有在声明语句的最后加分号!如果你有很多模块,如main.c,lcd.c,key.c...有很多头文件,如lcd.h,key.h,若是在lcd.h文件声明函数时没有加分号,那么这种错误可能定为到main.c中,所以要检查所有头文件.
解决:仔细检查.h文件,将分号补上.

3.  Error: L6200E: Symbol flagu multiply defined (by uart0.o and main.o).

描述:变量(也是一种符号)flagu多处定义(在uart0.c中和main.c都定义了).通常错在全局变量定义重复.比如:在main.c中定义全局变量flagu:

      uint8 flagu=0;

在uart0.c中也用到该变量,于是声明此变量,我通常都是先复制定义的变量再在变量前面加关键字extern修饰:

      extern uint8 flagu=0;

然后编译,就会出现上面的连接错误,原因在于,我在uart0.c中是又定义了一个变量,而不是声明变量,因为我给变量赋了初值"flagu=0",这样就重复定义了变量flag.正确的声明方法是去掉赋值部分:

      extern uint8 flagu;

解决办法:找到重复定义的变量,看情况修改一处.

4.error:  #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)
描述:在wr_lcd函数还没有声明之前就已经使用了.多出现在两种情况:第一种,wr_lcd函数体还没有写,就已经用到了它,这种情况多出现在写一个程序的大体结构中,只是简单写一下框架.第二种情况比较常见,函数a调用函数b,但函数b的函数体在函数a的下面:
void a(void) //函数a的实体
{
       b(); //调用函数b
}

void b(void) //函数b的实体
{
       ...
}
这样如果点编译,就会产生error:  #159的错误,因为当函数a调用函数b时,发现在这之前都没有函数b的任何声明.
解决方法:在函数a调用函数b之前,对函数b进行声明,如:
void b(void); //对函数b进行声明

void a(void) //函数a的实体
{
      b(); //调用函数b
}

void b(void) //函数b的实体
{
     ...
}
 
 5. error:  #137: expression must be a modifiable lvalue

描述:表达式必须是一个可以修改的左值.主要出现在这种现象:

                 a=NUM;

NUM是一个数值或表达式,a为一个变量,但a被定义为像const这种不可更改的类型,导致NUM不能赋值给变量a.

解决方法:要么放弃赋值,要么修改变量属性.


6.error:  #18: expected a ")"
如果是出现在c文件中, 多半是因为少了一个")",或者错误行有编译器不识别的字符

如果出现在头文件中,错误行又是一个函数声明,多半是因为在函数声明中有编译器不认识的字符.


7.error:  #7: unrecognized token

未识别的标记,多半是切换成了中文标点。


关键字:stm32  常见错误 引用地址:stm32常见错误分析

上一篇:STM32使用SWD连接报错总结
下一篇:STM32的宏定义问题

推荐阅读最新更新时间:2024-03-16 16:12

STM32外设驱动篇——AT24C02(I2C接口)
SOC:STM32F103RCT6 软件平台:STM官方库V3.5.0 开发工具:Keil 1. 摘要   本文章将给出STM32F103RCT6控制AT24C02的代码。如有疑问和错误,欢迎留言告之。 2.硬件连接 AT24C02使用I2C进行数据访问,板子上使用STM32的I2C控制器2和AT24C02进行连接。 具体来说,PB10作为SCL和AT24C02相连,PB11作为SDL和AT24C02相连。 这里就不给出硬件连接图了,比较简单。 3. AT24C022C访问代码(轮询) I2C这里使用轮询方法,不是中断,请留意。 首先,给出I2C控制器的初始化代码,和读写代码,一共三个函数,对应三个功能。 注
[单片机]
stm32成长记之滴答时钟
SysTick具体操作可参照: http://www.st.com/content/ccc/resource/technical/document/programming_manual/5b/ca/8d/83/56/7f/40/08/CD00228163.pdf/files/CD00228163.pdf/jcr:content/translations/en.CD00228163.pdf The system timer, SysTick, is a 24-bit count-down timer. Use this as a Real TimeOperating System (RTOS) tick timer or a
[单片机]
<font color='red'>stm32</font>成长记之滴答时钟
stm32的3种下载程序方式
个人记录: 了解这些,自己多多总结,也算是对开发板硬件接口的了解。 没总结完,     【1】ISP下载   这里类似51. boot1拨到0, 就行了 下载需要来回拨动拨码开关   【2】J-LINK 可下载 可仿真 (分为SW和JTAG模式) JTAG 或 SW 方式,在KEI的编程选项里面设定,选择好仿真器后,在相关的SETTINGS设置项里面会有 JTAG和SWD方式的选择。 只需要修改KEI环境配置,和硬件设置,这个SWD只需要5个,一个电源,一个地 和仅需要三根调试线SWDO(可选的跟踪),SWDIO(data I/O),SWDCLK(时钟针) 如果用jt
[单片机]
趣谈STM32的ADC与DMA
最近在做ADC采样电池电压,有时候有点纠结,不用DMA我能很好的把电压给采集出来,那么我为什么要费那些精力去使用DMA呢?用了DMA万一搞错了呢,不用DMA的效果还没有影响到让我非用不可的地步。我有时候确实会有这些小纠结,不想太麻烦,一分钟能做出来的事情,不想用两分钟做出来。但是看到网上很多人一谈到ADC立马就开始说各种DMA,仿佛这种类似的数据外设到内存的传输非DMA不可。 网上的一篇文章详细的讲述了ADC外设和DMA的来龙去脉,非常清晰,在此摘抄下来用以学习:原文地址 : http://m646208823.blog.163.com/blog/static/1669029532012217115010531/ 作为一个偏向工
[单片机]
趣谈<font color='red'>STM32</font>的ADC与DMA
(八)STM32的CAN模块实验
bxCAN是基本扩展CAN(Basic Extended CAN)的缩写,它支持CAN协议2.0A和2.0B。它的设计目标是,以最小的CPU负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。 主要特点 *****; 支持CAN协议2.0A和2.0B主动模式 *****; 波特率最高可达1兆位/秒 *****; 支持时间触发通信功能 发送 *****;3个发送邮箱 *****; 发送报文的优先级特性可软件配置 *****;记录发送SOF时刻的时间戳 接收 *****; 3级深度的2个接收FIFO *****; 14个位宽可变的过滤器组-由整个CAN共享 ***
[单片机]
stm32外部中断常用库函数
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); //确定端口与中断线映射关系 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); //初始化中断线,触发方式 typedef struct { uint32_t EXTI_Line; //指定要配置的中断线 EXTIMode_TypeDef EXTI_Mode; //模式:事件or中断 EXTITrigger_TypeDef EXTI_Trigger; //触发方式:上升沿/下降沿/双沿 Functio
[单片机]
STM32 TALK | 无感FOC方案原理机器控制难点分析
1、电机控制方案的分析与选择 在永磁电机的无感控制策略中,主要有两大类:(1)无感方波控制;(2)无感FOC控制。 先谈谈无感方波控制。在无感方波控制中,主要是利用反电动势过零点的方式来得到换相信号(反电动势过零点的信号与电机的换相信号在相位上相差30°电角度)。为了得到反电动势过零的信号,通常采用两种方式:(1)硬件比较器法;(2)软件端电压采样法。这两种方法的原理大致是相同的,都是将检测得到的端电压的值与电机中性点电压进行比较来得到反电动势过零点的信号。在无感方波控制中,该检测手段的好坏将决定了控制性能的好坏。但无感方波控制通常会伴随着噪声大、转矩脉动大等缺点,因此仅在一些对电机无感控制要求不是很高的场合中较为适用。
[单片机]
STM32的嵌套中断系统NVIC和RCC详细整理
STM32的嵌套中断系统NVIC和RCC详细整理 用的是stm32f103的最新3.5的库。 一、综述: 1、STM32 (Cortex-M3) 中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作 亚优先级 或 副优先级 ,每个中断源都需要被指定这两种优先级。 1. 何为占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行 抢断式优先响应,俗称中断嵌套。 2. 何为副优先级(subpriority) 在占先式优先级相同的情况下,高副优先级的中断优先被响应; 在占先式优先级相同
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved