常规的指针错误,数组下标溢出你应该都知道了,我遇到过你说的这种调试时定位到了错误的函数,是因为编译器你选择了优化,建议遇到这种问题时不要优化编译,那么调试时就是准确的定位,下图所示,但愿能解决你的问题。
STM32程序编译出现错误,是设置错误造成的,解决方法如下:
1、首先打开STM32 ST-LINK Utility,依次选择“File -Open File...”或者按快捷键“CTRL + O”准备打开一个烧录文件。
2、找到需要烧录的HEX文件,选择“打开”。
3、软件会将该HEX文件加载到窗口,同时会在下面的消息框显示文件的校验码。
4、然后点击菜单栏的“Target -Connect”开始连接目标。
5、开始连接目标,成功后会在软件工具栏左侧显示目标芯片信息,同时会在下面的消息框进行相关提示。
EV5、EV6并不是错误。
EV5事件:
程序中是这样调用的
//检测 EV5 事件并清除标志
while(! I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT))
{
if ((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(1);
}
可以看到这里有一个宏I2C_EVENT_MASTER_MODE_SELECT,它定义在stm32f4xx_i2c.h头文件中(答主用的STM32F4单片机)
它的值为((uint32_t)0x00030001)。
这里还有一个函数I2C_CheckEvent();
这个函数将I2C的两个16位寄存器SR1和SR2合并成一个32位数据再与FLAG_MASK (这也是一个宏,在stm32f4xx_i2c.c中,它的值为((uint32_t)0x00FFFFFF)) 做按位与运算,得到SR1的低8位数据和SR2的全部16位数据,这个数据再与宏 I2C_EVENT_MASTER_MODE_SELECT 做按位与运算这个宏的值为((uint32_t)0x00030001) ,取出了SR1寄存器的位0、位1,SR2寄存器的位0 的值。
我们来看看 SR1寄存器的位0、位1,SR2寄存器的位0 表示的什么含义?
在STM32F4xx中文参考手册中查到:
SR1:
SR2:
可见,EV5事件是判断起始位有没有产生、判断是主模式还是从模式,地址有没有发送的? 判断完成,无异常接下来就开始发送从设备地址了。
EV6事件同理,如果不懂,说明还没有理解上面的EV5事件,继续看EV5。
本文标签:stm32硬件错误信息记录