返回
MCU + CubeMX 使用 MPU6050 DMP 引发卡死问题分析
后端
2023-12-28 23:10:06
引言
在使用 STM32 + CubeMX 开发项目时,我们经常会遇到需要使用外部中断的情况。例如,当我们需要使用 MPU6050 传感器时,就需要使用外部中断来接收传感器的数据。
然而,在某些情况下,在外部中断中调用 read_dmp 函数可能会导致系统卡死。本文将分析导致系统卡死问题的根本原因,并提供解决方案。
系统环境
硬件:
MCU:STM32F405RGT6
IMU:MPU6050
软件:
开发环境:KEIL MDK-ARM uVision5
问题
当我们在外部中断中调用 read_dmp 函数时,系统会出现卡死的情况。卡死时,程序会停留在外部中断服务函数中,无法继续执行。
根本原因分析
经过分析,我们发现导致系统卡死问题的根本原因是:在外部中断服务函数中调用 read_dmp 函数会导致堆栈溢出。
在 CubeMX 中,默认的堆栈大小为 4KB。当我们在外部中断服务函数中调用 read_dmp 函数时,read_dmp 函数会使用堆栈来存储临时数据。然而,read_dmp 函数需要使用大量的堆栈空间,这会导致堆栈溢出。
解决方案
为了解决系统卡死的问题,我们可以通过以下两种方式来增加堆栈大小:
- 在 CubeMX 中手动增加堆栈大小。
- 在 Keil MDK-ARM uVision5 中手动增加堆栈大小。
在 CubeMX 中手动增加堆栈大小
在 CubeMX 中,我们可以通过以下步骤来手动增加堆栈大小:
- 打开 CubeMX 项目。
- 单击“Project”菜单。
- 选择“Properties”。
- 在“Properties”对话框中,单击“ARM Compiler”选项卡。
- 在“Stack”组中,修改“Heap and Stack Size”的值。
- 单击“OK”按钮保存更改。
在 Keil MDK-ARM uVision5 中手动增加堆栈大小
在 Keil MDK-ARM uVision5 中,我们可以通过以下步骤来手动增加堆栈大小:
- 打开 Keil MDK-ARM uVision5。
- 打开要修改的项目。
- 单击“Project”菜单。
- 选择“Options for Target”。
- 在“Options for Target”对话框中,单击“Debug”选项卡。
- 在“Debug”选项卡中,修改“Stack Size”的值。
- 单击“OK”按钮保存更改。
总结
在使用 STM32 + CubeMX 开发项目时,在外部中断中调用 read_dmp 函数可能会导致系统卡死。导致系统卡死问题的根本原因是:在外部中断服务函数中调用 read_dmp 函数会导致堆栈溢出。我们可以通过在 CubeMX 中手动增加堆栈大小或在 Keil MDK-ARM uVision5 中手动增加堆栈大小来解决系统卡死的问题。