返回

MCU + CubeMX 使用 MPU6050 DMP 引发卡死问题分析

后端

#STM32# #CubeMX# #MPU6050# #DMP# #中断# #系统卡死# #根本原因#

引言

在使用 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 函数需要使用大量的堆栈空间,这会导致堆栈溢出。

解决方案

为了解决系统卡死的问题,我们可以通过以下两种方式来增加堆栈大小:

  1. 在 CubeMX 中手动增加堆栈大小。
  2. 在 Keil MDK-ARM uVision5 中手动增加堆栈大小。

在 CubeMX 中手动增加堆栈大小

在 CubeMX 中,我们可以通过以下步骤来手动增加堆栈大小:

  1. 打开 CubeMX 项目。
  2. 单击“Project”菜单。
  3. 选择“Properties”。
  4. 在“Properties”对话框中,单击“ARM Compiler”选项卡。
  5. 在“Stack”组中,修改“Heap and Stack Size”的值。
  6. 单击“OK”按钮保存更改。

在 Keil MDK-ARM uVision5 中手动增加堆栈大小

在 Keil MDK-ARM uVision5 中,我们可以通过以下步骤来手动增加堆栈大小:

  1. 打开 Keil MDK-ARM uVision5。
  2. 打开要修改的项目。
  3. 单击“Project”菜单。
  4. 选择“Options for Target”。
  5. 在“Options for Target”对话框中,单击“Debug”选项卡。
  6. 在“Debug”选项卡中,修改“Stack Size”的值。
  7. 单击“OK”按钮保存更改。

总结

在使用 STM32 + CubeMX 开发项目时,在外部中断中调用 read_dmp 函数可能会导致系统卡死。导致系统卡死问题的根本原因是:在外部中断服务函数中调用 read_dmp 函数会导致堆栈溢出。我们可以通过在 CubeMX 中手动增加堆栈大小或在 Keil MDK-ARM uVision5 中手动增加堆栈大小来解决系统卡死的问题。