This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP432P401R:GPIO 中断不能与 SDFatFS 例程一起使用

Guru**** 2564565 points
Other Parts Discussed in Thread: ADS1298

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/676209/msp432p401r-gpio-interrupt-not-working-with-sdfatfs-routine

器件型号:MSP432P401R

大家好、

我正在构建一个项目、在该项目中、我的目标是在发生 GPIO 中断时将数据记录到 SD 卡中的文件中。

我从 TIREX 的 fatsd 示例项目借用了 SD 卡代码。 我修改了代码以满足我的需求、它本身运行良好。

我还有一个与 P1.4 (按钮开关)相关的 GPIO 中断、按下该中断后、红色 LED (P1.0)将进行切换。 该代码本身也运行良好。

但是、当我在程序中同时激活这两个代码时、代码的中断部分停止工作。 我尝试单步执行在 SD 卡中写入数据时使用的 API、但它们似乎过于复杂。 这样做的原因可能是什么?

另外、我将数据写入 SD 卡的最佳和最有效的方式是什么? 通过 TI 的 API 访问它是否是前进的最佳方式?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Neha、

    您是否检查了是否有 GPIO 存在冲突-用于与 SD 卡通信的 SPI 引脚和用于生成中断的 GPIO?

    谢谢、
    SAI
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我确保它们不会发生碰撞。 此外、目前我只是使用板载按钮开关来生成中断、因此它们之间没有冲突的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能给我指出这两个项目的起点吗?

    您是否还在所有3个项目(2个单独项目和1个合并项目)上使用 RTOS?

    谢谢、
    SAI
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    整个项目只是一个而不是三个。 此外、RTOS 未被使用。

    我将更详细地解释这个项目、希望这将填入我可能遗漏的任何详细信息。 我的项目涉及通过 SPI 从 ADC ADS1298接收数据并将其存储在 SD 卡上。 每当数据准备就绪时、ADC 会每2ms 将其 DRDY 引脚拉至低电平。 该引脚连接到 MSP432P401R 的 GPIO。 每当拉至低电平、我都希望生成一个中断、该中断会让我知道现在是时候收集数据了。

    我希望在采集大约一秒后将这些数据存储在 SD 卡中。 为了减少延迟、我认为最好不要在写入每秒的数据后打开和关闭文件、而是保持文件打开、继续写入数据、并在日志记录过程完成后关闭文件。

    首先、我在电路板上的按钮开关(P1.4)上实现了一个 LED 切换 ISR。 我尝试将相同的逻辑与此连接起来、即每次按下开关并调用 ISR 时、我都尝试向文件写入一些固定数量的数据。

    我目前面临的问题是 LED 闪烁的 ISR 代码独立工作、写入 SD 卡的程序独立工作、但当我尝试合并这两个代码时、中断不会被注册。

    我用于程序 SD 卡部分的 API 来自 TIREX 的 fatsd_MSP_EXP432P401R_nortos_ccs 项目示例。 我发现这些寄存器的内部代码很复杂、因此无法解码不允许控制器寄存中断的内容。

    请在这方面提供任何帮助。

    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的第一个猜测是关于端口(按钮) ISR 及其设置。 你能告诉我们吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是我拥有的中断初始化例程:

    void interrupt_init (void)
    {
    /*将 P1.0配置为输出,将 P1.1 (开关)配置为输入*/
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
    
    /*将 P1.1配置为输入并启用中断*/
    MAP_GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P1、GPIO_PIN4);
    
    MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN4);
    MAP_GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN4);
    MAP_Interrupt_enableInterrupt (INT_Port1);
    
    /*启用主中断*/
    MAP_Interrupt_enableMaster();
    
    } 

    以下是我必须为中断提供服务的 ISR:

    void Port1_IRQHandler (void)
    {
    uint32_t status;
    int i;
    
    STATUS = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);
    MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态);
    
    MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN4);
    
    /*切换 LED 上的输出*/
    IF (STATUS & GPIO_PIN4)
    {
    
    GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
    
    }
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Neha、

    很抱歉、我没有回复! 您是否仍在查找有关此帖子的帮助?

    如果您已经解决了问题、您可以在此处发布解决方案。 如果没有、您能否告知我们您是否执行了更多的调试步骤?

    谢谢、
    SAI
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Neha、

    [引用 user="Neha Vedam"]我用于程序 SD 卡部分的 API 来自 TIREX 的 fatsd_MSP_EXP432P401R_nortos_ccs 项目示例。

    "fatsd_MSP_EXP432P401R_nortos_ccs"示例来自 SDK 的文件夹"./examples/nortos/MSP_EXP432P401R/drivers/fatsd。 它使用 SDK 文件夹"./kernel/nortos 中的"nortos"框架、允许将基于 RTOS 的 TI 驱动程序示例移植到 nortos。 如果您使用的是"./examples/nortos/MSP_EXP432P401R/drivers /"文件夹中的示例、则配置 GPIO 中断的正确示例为"./examples/nortos/MSP_EXP432P401R/drivers/gpiointerrupt。

    希望这对您有所帮助!

    谢谢、

    SAI