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.

[参考译文] CCS/MSP432P401R:GPIO中断在未调试时会间歇性禁用,通过按重置按钮修复

Guru**** 2553450 points
Other Parts Discussed in Thread: CC2564, ADS1299

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/589258/ccs-msp432p401r-gpio-interrupts-get-disabled-intermittently-when-not-in-debug-fixed-by-hitting-reset-button

部件号:MSP432P401R
主题中讨论的其他部件:CC2564ADS1299MSPWARE

工具/软件:Code Composer Studio

您好,

我正在使用MSP432启动板。 长话短说,我建立了一个通过SPI (使用DMA)与外部SoC连接的系统,并通过蓝牙传输数据(SPP配置文件,蓝牙)。 外部SoC通过降低引脚的状态让我知道有一些数据准备就绪,我使用GPIO(GPIO_PORT_P4)监控引脚并使用其关联的事件处理程序进行管理。 (之后也会立即涉及DMA IRQ,但这与当前情况无关)

我在过去的两个月里开发了这个系统,在我决定将它作为一个独立的系统进行尝试之前,一切都运行良好。 当我在没有调试器的情况下执行系统时,蓝牙接口和调试UART仍然可以正常工作,但似乎不再调用GPIOs中断处理程序。

在论坛上看到类似的错误时,有人建议点击重置按钮查看发生的情况,实际上,在开机后,如果我点击重置按钮几秒钟,则问题似乎解决了3次(共4次)。

现在我想知道,这是不是正确的做法? 到底发生了什么? 最终,这个系统计划部署在现实世界中,我需要提前考虑它在实际应用中的表现。

最佳,

弗雷德

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

    听起来,当您切换到"独立系统"时,您开始遇到这个问题,您能不能将这些硬件设置中的差异干燥? 您的硬件与原型系统和新系统之间是否可能存在差异?

    标题显示当您不在调试模式下时,问题是否在调试模式下出现? 您是否可以设置中断点以确认您没有进入中断?

    由于中断有时似乎起作用,而其他中断则不起作用,因此MSP可能看不到这种边缘。 如果您的SoC依赖于上拉/下拉,您可以检查是否已安装(漏极开路输出类型)。 浮动销钉可能不会持续触发。 或者,MSP432重置计时未到达主代码,此时SoC切换GPIO时,它已准备好进行中断,因此,如果两个器件的重置计时不是确定的正确,则它无法始终捕获这种情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,John:

    谢谢你花时间回答我的问题,我会尽量说得更准确。

    在硬件配置方面,我一直在使用MSP432启动板和CC2564 BoosterPack。 我连接的另一个SoC也由MSP432提供电源(记录在案的是,我连接了ADS1299EEG-FE的顶部元件)。 我还没有设计以后支持系统的PCB。

    两种设置之间的差异:

    (1)调试模式,我使用Code Composer Studio (CCS)构建固件,并通过启动调试会话来刷新固件。 我让系统在该模式下运行了一个多月,但从未遇到过该问题。

    (2)独立模式,我停止调试会话(甚至关闭CCS以处理该问题),从主板上拔下电源。 然后,使用USB端口为主板通电,而不运行CCS。 另外,我还有一种电池操作模式,它使用燃油箱II增压器组,在这种情况下,我不使用USB端口为主板供电,而是使用电池。

    我通过添加Display (printf)(在串行端口上输出字符串)来确认中断未触发。 我使用串行端口终端监控它。 我在执行此操作时不会在CCS上进行调试会话。 我的代码中没有任何断点,蓝牙SPP链路仍正常工作,系统正在处理我的命令。  

    同样,如果重置设备,它将工作4次(共5次)。

    我知道低功率模式可能与这个问题有关,我有没有办法检验这个假设? 电源模式如何与集成蓝牙的操作系统交互。

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

    感谢您的澄清。  调试会话阻止MSP实际进入某些低功耗模式(我认为它是LPM3及更高级的模式,但我必须检查)。  某些外围设备无法从特定电源模式唤醒MSP (参见 TRM的表7-8)。  这意味着外围设备可能在调试中工作(因为系统实际上不在该LPM中),但随后不会在调试之外工作,因为系统正在等待无法唤醒MSP的外围设备。  (这似乎有点不好,因为你得到了4/5次的手术,但我不会排除100 % 在检验假设之前。

    您可以尝试从代码中完全删除LPM,就像确定这是否导致了问题一样,然后您可以返回并以更巧妙的方式输入适当的LPM,这样您就不会遇到等待的问题 如果确实存在问题,则无法唤醒设备的外围设备。  (根据代码的结构,请确保在删除LPM时不要错误地删除启用的中断,因为有时这些操作是一起完成的。)

    您能告诉我您是使用RTOS,driverlib还是寄存器级编程,仅供我参考吗?

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

    (1)我检验了LPM假设。 之前,我没有可见的LPM说明。 我说不可见,因为我正在使用蓝牙,电源管理可能隐藏在其中的某个位置。

    在程序进入BTPS_ExecuteScheduler()之前,我尝试为LPM0添加一个指令(也使用LPM3进行了测试),但这不会返回, 在这两种情况下,我观察到与以前相同的行为。 因此没有效果。

    为了回答您的问题,我正在使用蓝牙演示中集成的操作系统 :BTPS和driverlib来控制寄存器的状态。

    (2)当我在那里的时候,我测试了一个新的假设:TM4C129 MCU是否有与我的系统交互作用的依据? 我怀疑它和 在调试模式下默认设置的main()断点上挂起一样愚蠢,因为蓝牙和几个模块都在工作,但它是否会阻止或改变程序的执行方式?

    我卸下了所有将TM4连接到MSP的跳线(重置引脚除外),以便能够重置MSP。 我仍然有同样的行为。

    (3)我现在想知道系统的通电是否是一个问题。 通过连接ADS1299,我在系统上增加了额外的负载,可能是加电时电流限制过大,这会阻止电压上升得足够快? 这是否有意义? 我仍然看不出来这会如何让蓝牙正常工作,同时中断。

    仍然是为什么它在调试中工作的问题,但当我在调试中运行时,设备的闪烁会触发重置。 主板已通电一段时间...

    请告诉我,如果您还能想到其他任何事情,我会尝试一种方法来检验实力假设。

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我试图在主菜开始时加上一个很长的延迟(4秒),以便给时间让权力稳定下来。 它没有效果。

    我还注意到map_pcm_gotoLPM3();通常放在alwhile (1)中,因此我将指令移动到定期调用的任务,也没有效果。

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

    弗雷德里克

    您能否为我提供代码或代码片段,以便我回顾您如何实现中断?  另外,如果我无法通过单独查看代码来了解这一点,我可能还需要聘请蓝牙堆栈的其他专家,例如Bluetoothia,因为我对此并不熟悉。

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

    明天我会删除一段代码,我不在工作,但我正在阅读有关电源电压监控器的信息(TRM部分,6.2 PSS操作)。

    我发现:

    <<当SVSMH配置为监护仪且VCC电压降至SVSMH以下时
    阈值模块设置SVSMHIFG中断标志并生成中断(仅当SVSMHIE =1时)。
    如果电压低于SVSMH水平,且软件尝试清除SVSMHIFG,则为
    立即由硬件重新设置。 SVSMH的中断标志保持设置,直到通过硬复位清除
    或通过软件。>>

    因此,我想知道,在我假设电源是原因的情况下,GPIO中断是否可以被SVSMH中断标志屏蔽,如果它被提高,则永远不会被重置。

    我明天会研究这个问题,如果我发现任何问题,请随时通知您。

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

    您好,John:

    我尝试为PSS添加中断处理程序,如上一篇文章中所述,这将清除中断标志并禁用它。 没有解决。 (注意, NIVAC连接了一个defaultISR处理程序,这会导致无限的while循环。 因此,我的添加不可能产生任何影响)

    以下是从我的程序中提取的代码,用于在GPIO 4.4 上配置中断。 我确实确认(逻辑分析器) ADS1299发送的信号存在,即使在故障条件下也是如此。  

    //DRDY引脚(WFP 4.4),此引脚触发中断
    GPIO_setAsInputPin (GPIO端口P4,GPIO _PIN4);
    
    //清除为该PIN设置的任何标志
    GPIO清除InterruptFlag (GPIO端口P4,GPIO _PIN4);
    //下降边缘灵敏度
    GPIO中断边缘选择(GPIO_PORT_P4,GPIO _PIN4,GPIO高电平转换);
    //为该引脚启用中断
    GPIO_enableInterrupt (GPIO端口P4,GPIO _PIN4);
    //降低优先级(这可防止调试UART导致芯片崩溃)
    InterrupT_setPriority (INT_Port4,(1 <5));
    //为该端口启用中断
    interrupT_enableInterrupt (INT_Port4);
    
    //为SRAM Bank 1启用保留
    sysctl_enableSRAMBankRetention (sysctl_SRAM_Bank1);
    
    //启用全局中断管理
    interrup_enableMaster(); 

    请告诉我您是否想到了任何问题,或者您是否希望我发布其他代码段。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Fred,

    只是想给你一 个快速的更新,这样你就不会觉得我忘记了你。  我还没有发现这方面有什么明显的问题,所以我打算周一去蓝牙/蓝牙那边找人,询问他们对此的看法。  感谢您的耐心等待。  

    也许您可以向我解释一下为什么需要降低INT_Port4的优先级?

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

    您好,John:

    非常感谢。  

    蓝牙配有UART调试控制台,使用USB/串行端口。 当我通过DMA为SPI添加中断管理时,我遇到了一个UART缺纸及其缓冲区溢出的问题。 为了解决这一问题,我增加了UART缓冲区的长度-从内存中它是~128字节,现在是1024字节-并且在调试UART代码中注意到此系统的优先级设置为高, 我降低了中断的优先级,以确保UART可以自由地处理自己的内容。 这两项都是稳定方案所必需的。 最后,我想完全取消激活控制台,但我仍在使用它进行调试,我还没有研究如何将其关闭。 我不会惊讶地发现问题与控制台有关,尽管我的系统在重置后仍能正常工作

    我尝试过的其他产品:

    -我将SPI-DMA初始化例程映射到通过蓝牙发送的命令上,以便在启动后手动重新初始化系统,但这不能解决问题。 似乎GPIO中断管理总体上被堵塞。

    我将在我的端尝试什么:

    -我将构建随MSPWare提供的GPIO示例,并在相同条件下进行测试,以查看发生的情况。

    *如果问题没有出现,我将根据该示例重新构建程序,直到找到触发错误的因素。

    *如果问题仍然存在,我们将排除除启动板上的GPIO中断之外的所有问题,这将缩小搜索范围。

    为了排除该元素,我还将使用另一个以相同方式配置的启动板进行测试。  

    我会随时向您发布最新信息,

    -弗雷德

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

    Fred,

    您是否能够将该程序作为附件提供给我(这是一个公共论坛,因此我理解不是每个人都愿意发布他们的源代码)。  

    既然您怀疑UART,现在也许是研究如何禁用它的好时机? 并查看在注释掉控制台之后,您的程序是否工作。

    我想说您是否检查过GPIO寄存器,确定为中断设置了正确的位(认为BLE堆栈可能会在某处重置这些位) ,但我怀疑这是问题所在,因为您说在调试模式下中断会触发,对吗?

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

    您好,John:

    再次感谢您的支持。 我将停用调试UART,但本周我需要处理另一项任务。 我无法逃脱,我需要修复此错误,因此请给我几天时间来总结一下其他问题,然后我将浏览我们确定的元素。

    我会在这里发布我的结果。

    很遗憾,我无法公开发布该计划。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    如果已经讨论/尝试过,请提前道歉。 我想知道您是否可以确定IO的状态,或者通过内部上拉来强制将其设置为高电平,以确保GPIO处于已知状态。

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

    您好,Chris:

    老实说,我不认为这会起什么作用,但考虑到这种假设很容易测试,我试了一下。

    因为我在生产线上安装了一个拉线,所以我没有再观察到该错误(测试次数超过5次),但我不明白为什么? 我完全理解上拉功能的作用,但为什么这能解决我的问题?

    在配置GPIO时,线路很可能处于浮动状态。 这是因为驱动元件(ADS1299)已关闭,但这如何阻止GPIO中断管理器的初始化?

    弗雷德

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

    更多反馈,添加上拉功能,极大地提高了系统的稳定性。 我仍需要在通电后发出重置脉冲,以便GPIO中断正常工作,但随后工作正常。 我知道安装在启动板上的TM4C在启动调试会话时会发出这样的脉冲,但它不会用于独立操作。 我将尝试使用围绕此IC http://www.ti.com/lit/ds/symlink/lm809.pdf或类似内容构建的电路来绕过手动重置脉冲。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    弗雷德里克
    我需要研究ADS1299器件,以便更好地了解驱动器功能,但正如您所指出的,上拉功能对高阻抗状态只有真正的帮助。

    ADS1299是否可能在MSP432之前启动,并且MSP432上的GPIO的电势高于DVCC? 我担心您正在通过GPIO为MSP432回电并处于不确定状态。 一旦VCC处于GPIO电压的二极管降下并应用了重置,设备应正常通电。

    您是否有任何方式确认此情况?

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

    您好,Chris:

    我明白了。

    我对未能早点看到它感到有点羞愧,但我没有正确理解GPIO中断的工作方式。  

    下面是我运行的错误代码:

    GPIO配置
    
    //DRDY引脚(WFP 4.4),此引脚触发中断
    GPIO_setAsInputPin (GPIO端口P4,GPIO _PIN4);
    
    //清除为该PIN设置的任何标志
    GPIO清除InterruptFlag (GPIO端口P4,GPIO _PIN4);
    //下降边缘灵敏度
    GPIO中断边缘选择(GPIO_PORT_P4,GPIO _PIN4,GPIO高电平转换);
    //为该引脚启用中断
    GPIO_enableInterrupt (GPIO端口P4,GPIO _PIN4);
    //降低优先级(这可防止HCI UART出现饥饿和导致BT崩溃)
    InterrupT_setPriority (INT_Port4,(1 <5));
    //为该端口启用中断
    InterrupT_enableInterrupt (INT_Port4);
    
    
    中断例程
    
    void Port4_IRQHandler (void)
    {
    UINT32_t状态;
    
    //获取并清除
    状态= MAP_GPIO _getEnabledInterruptStatus(GPIO_PORT_P4);
    MAP_GPIO清除InterruptFlag (GPIO端口P4,状态);
    
    //检查它是否为PIN4事件
    IF (状态和GPIO _PIN4)
    {
    //读取NB_bytes_read字节
    readBytes(nb_bytes_read);
    }
    
    }
    

    现在,您可能会注意到错误。 我想读取中断状态将返回哪个中断已激活。 结果显示,它返回销钉的状态。 考虑到我对高低转换很敏感,返回的值为'0'。

    因此,正确的中断例程是:

    /**
    * void Port4_IRQHandler(void)
    *@短暂DRDY中断,配置为下降边缘。 触发后,新数据为
    * 可用。 如果读数处于活动状态,请阅读。
    */
    void Port4_IRQHandler (void){
    
    UINT32_t状态;
    
    //获取并清除
    状态= MAP_GPIO _getEnabledInterruptStatus(GPIO_PORT_P4);
    MAP_GPIO清除InterruptFlag (GPIO端口P4,状态);
    
    //检查PIN4是否过低
    IF (~状态和GPIO _PIN4)
    {
    //读取NB_bytes_read字节
    readBytes(nb_bytes_read);
    }
    
    } 

    我仍然不明白为什么我的程序以前一直在工作,因为它确实工作不一致,但是现在它坚如磐石,而且一直在工作... 从其他方面来说,问题已经解决了!

    感谢每一位努力提供帮助的人,我们对此深表感谢。 问题结果比最初预期的简单,但我们只能在问题解决后才知道...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你。 我非常感谢您在周围转悠并提供如此详细的解释。

    此致,
    Chris