嵌入式stm32--编程所遇(各类错误 )--凡事靠自己,找bug,别人能帮到太少了~~~
2016-09-01 17:02
295 查看
问题1:Error[Li006]: duplicate definitions for “gImage_l2”; in “C:\Users\moon\Desktop\IAR–practice\test5(LCD)\test5–yejing\EWARM\STM32F4xx-Nucleo\Obj\lcd.o”, and “C:\Users\moon\
今天在进行代码测试编译时出现了重复定义的错误,提示在对象文件lcd.o 和main.o中出现了上述变量重复定义的问题。问题在于lcd.c 与 main.c 都用到了一个头文件里的全局变量! 全局变量不同于函数,我们在调用函数时,不会出现重定义的情况,可是不能两个文件同时去调用一个文件里的全局变量,这样会出现重定义了这些调用的全局变量。
问题2:用的STM32F4的芯片,在编写RTC时,报出几个函数未定义,这些函数都能在#include “stm32f4xx_hal_rtc.h” 头文件里找到。rtc.c 也包含了该头文件,可还是出现了报错,不知为何~请大家帮忙。
编译通过而链接出错,问题在于 stm32f4xx.hal.conf.h这个文件没有包含进 stm32f4xx.hal.rtc.h 这个头文件。
其实每个错误都不大,细心一点都能找到,不要存由侥幸心理,觉得某行代码没事,然后放葱这个错误;
每个小错误都可能决定最后的东西显示不出来。
问题三:烧录程序出现如下错误:
问题4:同步与异步
1.异步传输
通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步。所谓异步传输是指字符与字符(一个字符结束到下一个字符开始)之间的时间间隔是可变的,并不需要严格地限制它们的时间关系。起始位对应于二进制值 0,以低电平表示,占用 1 位宽度。停止位对应于二进制值 1,以高电平表示,占用 1~2 位宽度。一个字符占用 5~8位,具体取决于数据所采用的字符集。例如,电报码字符为 5 位、ASCII码字符为 7 位、汉字码则为8 位。此外,还要附加 1 位奇偶校验位,可以选择奇校验或偶校验方式对该字符实施简单的差错控制。发送端与接收端除了采用相同的数据格式(字符的位数、停止位的位数、有无校验位及校验方式等)外,还应当采用相同的传输速率。典型的速率有:9 600 b/s、19.2kb/s、56kb/s等。
异步传输又称为起止式异步通信方式,其优点是简单、可靠,适用于面向字符的、低速的异步通信场合。例如,计算机与Modem之间的通信就是采用这种方式。它的缺点是通信开销大,每传输一个字符都要额外附加2~3位,通信效率比较低。例如,在使用Modem上网时,普遍感觉速度很慢,除了传输速率低之外,与通信开销大、通信效率低也密切相关。
同步传输
通常,同步传输是以数据块为传输单位。每个数据块的头部和尾部都要附加一个特殊的字符或比特序列,标记一个数据块的开始和结束,一般还要附加一个校验序列(如16位或32位CRC校验码),以便对数据块进行差错控制。所谓同步传输是指数据块与数据块之间的时间间隔是固定的,必须严格地规定它们的时间关系。
问题5 如图:
解决在项目的options 里的Linker Linker configuration file 里选择符合的icf文件,如stm32f411xe_flash.icf 而不是stm32f01xe_flash.icf
问题6:弄清楚每个引脚的配置,一个引脚是配成通用推挽输出,还是复用推挽输出,是有很大影响的。
在配置N25Q时,读出来的数据一直是0xFF,看了近十天后发现原来是这里出错了。
问题7:
HAL_I2C_Master_Transmit(&I2cHandle, (uint16_t)I2C_ADDRESS3,(uint8_t*)m_temp1 ,2,10);
uint8_t m_temp1[1]={0x88};
中m_temp1等都是寄存器的指令,既然这样那能否使用,类似于下面的语句来代替呢?
HAL_I2C_Master_Transmit(&I2cHandle, (uint16_t)I2C_ADDRESS3,(uint8_t*)RegAddr_dig_T1 ,2,10);
关键在于这个语句 (uint8_t *)这个不能够传过去,传过去也只是一个常量。
问题7:
warning:? #767-D:?conversion from pointer to smaller integer
解释:将指针转换为较小的整数
影响:可能造成的影响:容易引起数据截断,造成不必要的数据丢失。如果出现bug,很难调试。
改正:尽量避免这种转换,避免不了要确定转换的数据不会引起数据丢失。
问题8:
如果某个IO口设为复用到SPI或者其他的复用模式,那么就不能再往里面像通用IO口模式一样,直接发送1/0,这样的数据了。
问题9:
在移植代码时,如果代码都一致,c文件与头文件,各种库函数里的文件也一致,可在不同的工程下运行的结果不一致,这时可以检查检查工程的基本配置是否一样。而不再需要去逐行核对代码。
问题10:调试代码时,出现如下的情况。
今天在进行代码测试编译时出现了重复定义的错误,提示在对象文件lcd.o 和main.o中出现了上述变量重复定义的问题。问题在于lcd.c 与 main.c 都用到了一个头文件里的全局变量! 全局变量不同于函数,我们在调用函数时,不会出现重定义的情况,可是不能两个文件同时去调用一个文件里的全局变量,这样会出现重定义了这些调用的全局变量。
问题2:用的STM32F4的芯片,在编写RTC时,报出几个函数未定义,这些函数都能在#include “stm32f4xx_hal_rtc.h” 头文件里找到。rtc.c 也包含了该头文件,可还是出现了报错,不知为何~请大家帮忙。
编译通过而链接出错,问题在于 stm32f4xx.hal.conf.h这个文件没有包含进 stm32f4xx.hal.rtc.h 这个头文件。
其实每个错误都不大,细心一点都能找到,不要存由侥幸心理,觉得某行代码没事,然后放葱这个错误;
每个小错误都可能决定最后的东西显示不出来。
问题三:烧录程序出现如下错误:
问题4:同步与异步
1.异步传输
通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步。所谓异步传输是指字符与字符(一个字符结束到下一个字符开始)之间的时间间隔是可变的,并不需要严格地限制它们的时间关系。起始位对应于二进制值 0,以低电平表示,占用 1 位宽度。停止位对应于二进制值 1,以高电平表示,占用 1~2 位宽度。一个字符占用 5~8位,具体取决于数据所采用的字符集。例如,电报码字符为 5 位、ASCII码字符为 7 位、汉字码则为8 位。此外,还要附加 1 位奇偶校验位,可以选择奇校验或偶校验方式对该字符实施简单的差错控制。发送端与接收端除了采用相同的数据格式(字符的位数、停止位的位数、有无校验位及校验方式等)外,还应当采用相同的传输速率。典型的速率有:9 600 b/s、19.2kb/s、56kb/s等。
异步传输又称为起止式异步通信方式,其优点是简单、可靠,适用于面向字符的、低速的异步通信场合。例如,计算机与Modem之间的通信就是采用这种方式。它的缺点是通信开销大,每传输一个字符都要额外附加2~3位,通信效率比较低。例如,在使用Modem上网时,普遍感觉速度很慢,除了传输速率低之外,与通信开销大、通信效率低也密切相关。
同步传输
通常,同步传输是以数据块为传输单位。每个数据块的头部和尾部都要附加一个特殊的字符或比特序列,标记一个数据块的开始和结束,一般还要附加一个校验序列(如16位或32位CRC校验码),以便对数据块进行差错控制。所谓同步传输是指数据块与数据块之间的时间间隔是固定的,必须严格地规定它们的时间关系。
问题5 如图:
解决在项目的options 里的Linker Linker configuration file 里选择符合的icf文件,如stm32f411xe_flash.icf 而不是stm32f01xe_flash.icf
问题6:弄清楚每个引脚的配置,一个引脚是配成通用推挽输出,还是复用推挽输出,是有很大影响的。
在配置N25Q时,读出来的数据一直是0xFF,看了近十天后发现原来是这里出错了。
/* ( W# )Write protect Control Input* PC5 */ GPIO_InitStructure.Pin = sFLASH_SPI_WP_PIN; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //通用推挽输出 GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_FAST; HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); HAL_GPIO_WritePin(GPIOC,sFLASH_SPI_WP_PIN,GPIO_PIN_SET); //置高,无效 /* ( HOLD# ) HOLD Control Input* PC6 */ GPIO_InitStructure.Pin = sFLASH_SPI_HOLD_PIN; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //通用推挽输出 GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_FAST; HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); HAL_GPIO_WritePin(GPIOC,sFLASH_SPI_HOLD_PIN,GPIO_PIN_SET);//置高,无效
问题7:
HAL_I2C_Master_Transmit(&I2cHandle, (uint16_t)I2C_ADDRESS3,(uint8_t*)m_temp1 ,2,10);
uint8_t m_temp1[1]={0x88};
中m_temp1等都是寄存器的指令,既然这样那能否使用,类似于下面的语句来代替呢?
define RegAddr_dig_T1 0x88
将原语句改写为:HAL_I2C_Master_Transmit(&I2cHandle, (uint16_t)I2C_ADDRESS3,(uint8_t*)RegAddr_dig_T1 ,2,10);
关键在于这个语句 (uint8_t *)这个不能够传过去,传过去也只是一个常量。
问题7:
warning:? #767-D:?conversion from pointer to smaller integer
解释:将指针转换为较小的整数
影响:可能造成的影响:容易引起数据截断,造成不必要的数据丢失。如果出现bug,很难调试。
改正:尽量避免这种转换,避免不了要确定转换的数据不会引起数据丢失。
问题8:
如果某个IO口设为复用到SPI或者其他的复用模式,那么就不能再往里面像通用IO口模式一样,直接发送1/0,这样的数据了。
问题9:
在移植代码时,如果代码都一致,c文件与头文件,各种库函数里的文件也一致,可在不同的工程下运行的结果不一致,这时可以检查检查工程的基本配置是否一样。而不再需要去逐行核对代码。
问题10:调试代码时,出现如下的情况。
相关文章推荐
- 有道理的一句话:生气是拿别人的错误来惩罚自己!
- 白岩松:不要拿别人的错误来惩罚自己
- 很多人都患有一种毛病,将自己看得过高,自认样样都最好,而别人则个个不如自己,唯有自己看得较顺眼,这是非常错误的,因世上每个人都有些优点值得我们学习。因此我们必须“取他人之长。补自己之短”这样才能在从事涉及人事复杂的销售生意时更加胜任,更加愉快!
- 转:嵌入式编程(以STM32为例)中的volatile,const意义及应用场景
- 嵌入式 编程常见错误一览表
- Java 错误记事本---记录自己菜鸟编程中出现的错误。
- 编自己的程,让别人调Bug去吧
- 嵌入式Linux驱动程序之编程常见错误
- 别人遇到的struts2中出现的各类错误
- 函数错误处理二(总结自己windows编程核心)
- 看了些别人怎样搞研究才发现自己跌跌撞撞的一年多犯了很多错误。。
- “编程只是个工具,关键在于你用它实现别人的事业,还是实现自己的事业”
- 基于stm32 的labview嵌入式编程
- cocos2d-xna-TweeJump学习笔记1(都是自己看别人代码后所感所想,希望有懂的人指出我的错误或者大家交流交流)
- 转:不要拿别人的错误惩罚自己---白岩松《我不赞成抵制家乐福》
- 如何把别人的文件资源融入自己的exe (MFC编程)
- 不要为别人的错误,别人的无知,让自己心情郁闷,不痛快
- 转载别人的错误,自己提高
- PB编程通俗快速入手(自己2002年教别人PB时随手写的,很多年了,放上来送给新手们)
- 不要用别人的错误惩罚自己