嵌入式stm32--编程所遇(各类错误 )--凡事靠自己,找bug,别人能帮到太少了~~~

来源:互联网 发布:Tensorflow 商用 编辑:程序博客网 时间:2024/05/16 09:41

问题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上网时,普遍感觉速度很慢,除了传输速率低之外,与通信开销大、通信效率低也密切相关。

  1. 同步传输
    通常,同步传输是以数据块为传输单位。每个数据块的头部和尾部都要附加一个特殊的字符或比特序列,标记一个数据块的开始和结束,一般还要附加一个校验序列(如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:调试代码时,出现如下的情况。
这里写图片描述

0 0
原创粉丝点击