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.

[参考译文] TM4C123GH6PZ:当屏蔽的中断状态为0时、SSI 中断被触发

Guru**** 1555210 points
Other Parts Discussed in Thread: ADC141S626, SEGGER
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/867983/tm4c123gh6pz-ssi-interrupt-is-triggered-while-the-masked-interrupt-status-is-0

器件型号:TM4C123GH6PZ
主题中讨论的其他器件:ADC141S626SEGGER

大家好、

我正在尝试调试一个问题、在这个问题上、当一个接收超时中断被触发但没有数据可用时、我希望从 SSI ISR 处理程序中读取数据。 当我们读取屏蔽的中断状态时、它是0。 这应该表明没有触发中断、那么为什么处理器跳转到中断处理程序?

我们要做的是:

我们使用 Timer 0A 中断、使用 TivaAware SSIDataPutNonBlocking API 启动 SSI 传输。 SSI 速度设置为1MHz、接收超时中断使能、因此 SSI 中断会触发~48uS (16位 SSI + 32时钟超时)。 我可以验证调试器的计时是否按预期工作。 这个问题是随机的、我们可以毫无问题地进行上千个数据传输、然后一个数据传输将失败。 我们可以运行一个系统数天、而另一个系统只能运行几分钟。

调试器屏幕截图:

相关代码片段:

#define ADC141_GPIO_Periph SYSCTL_PERIPH_GPIOH
#define ADC141_PERIPh SYSCTL_PERIPH_SSI2
#define ADC141_GPIO_base GPIO_Porth_BASE
#define ADC141_SSI_base SSI2_base

#define ADC141_SCLK_PIN GPIO_PIN_4
#define ADC141_CS_PIN GPIO_PIN_5
#define ADC141_SDO GPIO_PIN_6

#define ADC141_GPIO_SSICLK_CFG GPIO_PH4_SSI2CLK
#define ADC141_GPIO_SSIRX_CFG GPIO_PH6_SSI2RX
#define ADC141_GPIO_SSICS_CFG GPIO_PH5_SSI2FSS

#define ADC141_BAUD 1000000
#define ADC141_Protocol SSI_FRF_MOTO_MODE_3
#define ADC141_MODE SSI_MODE_MASTER
#define ADC141_DATAWIDTH 16

/*初始化代码*/
SysCtlPeripheralEnable (ADC141_GPIO_Periph);
SysCtlPeripheralEnable (ADC141_Periph);

GPIOPinConfigure (ADC141_GPIO_SSICLK_CFG);
GPIOPinConfigure (ADC141_GPIO_SSIRX_ICS);
GPIOPinConfigure (ADC141_GPICFG_GPIO_CFG);GPIOPENCI_GPIO

GPIOPinTypeSSI (ADC141_GPIO_base、ADC141_SCLK_PIN | ADC141_SDO | ADC141_CS_PIN);

SSIConfigSetExpClk (ADC141_SSI_base、SysCtlClockGet ()、ADC141_Protocol、ADC141_MODE、 ADC141_BAUD、ADC141_DATAWIDTH);
SSIIntEnable (ADC141_SSI_BASE、SSI_RXTO);

IntPrioritySet (INT_SSI2、 0xE0);
IntEnable (INT_SSI2);
SSIEnable (ADC141_SSI_base);

void TIMER0A_Handler (void)
{
TimerIntClear (TIMER0_BASE、TIMER0_BASE (TIMER0_BASE、false));

SSIDataPutNonBlocking (ADC141_SSI_BASE、
}


void SSI2_Handler (void)
{
uint32_t countSamples = 0;
Int32_t recv = 0;

uint32_t ssiStatusRegister = HWREG (ADC141_SSI_base + SSI_O_SR);
uint32_t ssiRawstockedStatus = HWREG (ADC141_SSI_base + SSI_RS_0


);UINT32_SSI_RUSTRIS = US_TRIS_0 (US_SS_SS_TRIS);u_TRIS_TRIS_TRIS_0)= US_TRIS_TRIS_TRIS_TRIS_0 (_TRIS_TRIS_TRIS_0_TRUS_TRIS_TRIS_TRIS_TRIS_TRIS_0_TRIS_TR




//从 SSI 接收 FIFO 读取、返回读取
的元素数量 Samples =(uint32_t) SSIDataGetNonBlocking (ADC141_SSI_base、(uint32_t *)&recv);
SSIIntClear (ADC141_SSI_base、SSIIntStatus (ADC141_SSI_base、false);

/* snip */
}

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

    我怀疑问题是您在中断服务程序的末尾清除 SSI 中断状态寄存器。 对外设的写入被缓冲、这样在返回重新使能中断之前中断请求有可能没有被清除。  添加 SSIIntStatus 的虚拟读取应该可以解决这个问题、因为在前一个外设写入完成之前、该读取不会发生。

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

    尊敬的 Bob:

    我从 ISR 处理程序末尾删除了我认为与问题无关的代码。 如果重新进入系统分析仪窗口、系统分析仪窗口还应该显示两个 SSI 中断。 我已经根据您的建议重新运行了测试、但未能解决问题。 完整的未编程 SSI 处理程序代码如下:

    void SSI2_Handler (void)
    {
    uint32_t countSamples = 0;
    Int32_t recv = 0;
    
    uint32_t ssiStatusRegister = HWREG (ADC141_SSI_base + SSI_O_SR);
    uint32_t ssiRawstockedStatus = HWREG (ADC141_SSI_base + SSI_RS_0
    
    
    );UINT32_SSI_RUSTRIS = US_TRIS_0 (US_SS_SS_TRIS);u_TRIS_TRIS_TRIS_0)= US_TRIS_TRIS_TRIS_TRIS_0 (_TRIS_TRIS_TRIS_0_TRUS_TRIS_TRIS_TRIS_TRIS_TRIS_0_TRIS_TR
    
    
    
    
    //从 SSI 接收 FIFO 读取、返回读取
    的元素数量 Samples =(uint32_t) SSIDataGetNonBlocking (ADC141_SSI_base、(uint32_t *)&recv);
    SSIIntClear (ADC141_SSI_base、SSIIntStatus (ADC141_SSI_base、false);
    (void) SSIIntStatus (ADC141_SSI_base、true);
    //如果 FIFO 中没有可用的样本、则表示存在严重错误。
    //断言将在无限循环中旋转,并在
    
    以下情况下间接导致 WDG 复位:(countSamples =0)
    {__asm("BKPT
    0");
    }//*
    
    符号扩展差分 ADC 读数。 符号位位于位14中
    、因此我们*上下移位以将14位读数扩展到32位
    */
    recv <= 18;
    recv >=18;
    
    ADCSample.sampleData[ADCPort]= recv;
    
    /*在要采样的最后一个输入通道的中断上、我们将
    包含所有多路复用输入通道样本的*结构发送到
    第2代 CS 任务的*队列
    中*/
    if (ADCPort ==(ADC141_NUM_CHANNELS -1)
    ){
    void) OSALQueueFromSendISR (adc141SampleQueue、ADCSample_Channels);
    }
    
    //选择要以循环方式读取的下一个 ADCPort,以及在
    //最后一个通道回绕到第一个通道
    ADCPort++;
    if (ADCPort >=ADC141_NUM_CHANNES)
    {
    ADCPort =0;
    }
    
    MAX4052Select (ADCPort);
    } 

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

    好的、这很有趣。 您能否在调用 SSIIntClear ()之前移动"countSamples == 0"内的断点,并在断点上实际停止,然后捕获 SSI2寄存器的映像?

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

    外设视图窗口似乎不是读取寄存器的可靠方法。 我依靠将它们存储到局部变量中并在观察窗口中进行检查。

    这是两个屏幕截图。 第一个示例显示了我在寄存器中期望的值:状态= 0x7、原始中断状态= 0xA、屏蔽后的中断状态= 0x2。 第二个示例显示了计数器=0断点被命中时的寄存器:状态= 0x3、原始中断状态= 0x8、屏蔽中断状态= 0x0。

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

    [引用用户="Eric Wilson85"]外设视图窗口似乎不是读取寄存器的可靠方法[/quot]

    这不是很好。 您使用的是什么调试器?  

    您运行的是 RTOS 吗? 是否可以有其他线程写入 SSI2寄存器?  

    TimerA 中断的时序是多少? 在有机会读取 SSI RX FIFO 之前、是否可能启动第二次 SSI2传输? (不确定这是否是一个问题、但这看起来像是某种临界情况。) 问题是在代码启动时还是在几次成功的传输和接收后出现? 我注意到我们所有的 SSI 示例在开始前都清除了接收 FIFO。 很抱歉所有问题、但这个问题让我偶然发现、因此我尝试获取更多信息、以便找到解决方案。

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

    [引用 user="Bob Crosby"]

    这不是很好。 您使用的是什么调试器?

    [/报价]

    我们将 Keil uVision 与 ULINK Pro 结合使用。 我想我需要联系 Keil 来了解外设查看器为什么不能为我提供预期的结果。

    [引用 user="Bob Crosby"]

    您运行的是 RTOS 吗? 是否可以有其他线程写入 SSI2寄存器?

    [/报价]

    我们正在运行 FreeRTOS。 在代码库中搜索任何其他提及 SSI2的内容时、不会显示任何访问该代码的其他代码。 当然、存取存储器的内容可能不是它应该有的、但我很难找到任何能够完全实现我们所看到的内容的内容。

    [引用 user="Bob Crosby"]

    TimerA 中断的时序是多少? 在有机会读取 SSI RX FIFO 之前、是否可能启动第二次 SSI2传输? (不确定这是否是一个问题、但这看起来像是某种临界情况。) 问题是在代码启动时还是在几次成功的传输和接收后出现? 我注意到我们所有的 SSI 示例在开始前都清除了接收 FIFO。 很抱歉所有问题、但这个问题让我偶然发现、因此我尝试获取更多信息、以便找到解决方案。

    [/报价]

    TimerA 每250us 触发一次。 我们预计 SSI 传输+超时将在~48uS - 50uS 内完成、并且我可以通过系统分析器窗口和跟踪数据来确认该时序。 这就额外留出了200us 的余量、其中可能会出现一些其他中断、但我们并未看到这一点。 从趣闻角度讲、通常在启动后的几分钟内、在前约100k 个样本内、该问题变得更为常见。 如果是清除 FIFO 的问题、我预计问题将是第一个采样、但没有影响尝试。

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

    您好!

    我们只能同意供应商 Bob 对"有趣"的评估。    (两者)海报和 Bob 所呈现的细节(尤其是逻辑流程)必须受到赞扬。

    令我们印象深刻的是、"多系统"(不仅仅是一个)上报告了此类问题-正如诊断人员的祸根所说的、"单板/设备异常"。

    出于"完整性"的考虑: (此处的大多数问题分析(可能)"展示了"大图"-这(可能)是"系统(而不仅仅是 MCU 问题!")

    • 是否存在"保留 SPI 器件"及其"连接、隔离距离和供电是否充足?"
    • 并且-至少暂时-切换到另一个 MCU 的 SPI 通道(以确定这种(不寻常)影响是否仍然存在?)      
    • 此外-此问题(可能)的随机性表明、"功率、噪声或(不需要的)射频级别"是可疑的。   所有这些都应该是"尽可能减少"。
    • 挂图的 MCU 显示(不)在"LPAD"中填充。   "123 LPAD"是否可以按"快速/轻松"的方式投入使用、以确定"此问题的严重程度?"   (即、这是否是" MCU 类"问题?)

    我们的小型技术团队倾向于:"将我们的代码缩减为"仅处理手头的问题"-(尤其是禁用任何/所有噪声、电力驱动或"已知"射频源) -然后"重新启动并仔细观察"犯罪的频率(即复发)"。   (在多种情况下、此类"原则"(以及对系统问题的"意识") 有助于高效地解决问题...)

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

    由于将 SSI2用作主机、因此在每次传输完成后、您应该会得到一个接收超时中断。 您能告诉我们是获得额外的中断、还是获得正确数量的 SSI2中断、但 FIFO 为空吗? 如果您还不知道、也许可以添加一个全局有符号变量、该变量在每次传输时递增、在每次接收字节时递减。 该变量应在0和1之间交替。 如果它开始递增、那么我们知道接收超时中断是正确的、但 FIFO 之前已被清空。

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

    “***相似***”按钮在哪里?

    然而、故障发生的可变性(可能强烈)为潜在的"系统问题"进行了论证。    (之前已注释...)

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

    [引用 user="Bob Crosby"]

    也许您可以添加一个全局有符号变量、该变量在每次传输时递增、在每次接收字节时递减。 该变量应在0和1之间交替。 如果它开始递增、那么我们知道接收超时中断是正确的、但 FIFO 之前已被清空。

    [/报价]

    现在这很有趣! 我做了两件事:

    1.我已大幅剥离了系统。 此时、只有 timer0A 和 SSI2中断正在运行。 FreeRTOS 被删除,初始化后剩下的所有操作都是 main()末尾的 while (1)。

    2.按照建议添加了变量。

    我看到计数器缓慢递增。 如果计数器大于一个小阈值、我在定时器中断中设置一个断点、我可以从系统分析仪上看到 SSI 中断没有发生。 但是、如何清空 FIFO 呢? 我已删除应用程序的所有其他部分。

    [引用 USER="CB1_MOBILE"]

    出于"完整性"的考虑: (此处的大多数问题分析(可能)"展示了"大图"-这(可能)是"系统(而不仅仅是 MCU 问题!")

    • 是否存在"保留 SPI 器件"及其"连接、隔离距离和供电是否充足?"
    • 并且-至少暂时-切换到另一个 MCU 的 SPI 通道(以确定这种(不寻常)影响是否仍然存在?)      
    • 此外-此问题(可能)的随机性表明、"功率、噪声或(不需要的)射频级别"是可疑的。   所有这些都应该是"尽可能减少"。
    • 挂图的 MCU 显示(不)在"LPAD"中填充。   "123 LPAD"是否可以按"快速/轻松"的方式投入使用、以确定"此问题的严重程度?"   (即、这是否是" MCU 类"问题?)

    [/报价]

    远程 SPI 器件是一款 ADC141S626。 已连接芯片选择、时钟和 MCU 接收引脚、MCU 发送引脚未连接、因为 ADC 仅需要时钟序列将其数据传输到 MCU。 芯片距离 MCU ~1英寸。 确定功率是否足够将需要我连接示波器、这将需要一些工作。

    RF 是一种可能性、尽管我没有内部设备来确定我的特定测试板的级别

    我想我有一个123垫圈或两个垫圈在周围。 我将尝试挖掘这些问题、以测试我是否能够首先消除其他一些可能的问题。

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

    这在某种程度上与 Keil 调试器的读取有关吗? 如果计数值大于1、是否可以运行此已分离版本切换引脚、然后在未连接调试器的情况下使用示波器监控引脚?

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

    [引用 user="Bob Crosby"]

    这在某种程度上与 Keil 调试器的读取有关吗? 如果计数值大于1、是否可以运行此已分离版本切换引脚、然后在未连接调试器的情况下使用示波器监控引脚?

    [/报价]

    确实如此! 如果我只需在启动应用程序之前关闭 SSI2外设视图窗口,那么我就可以无问题读取>2M 个样本。 只要我再次打开窗口、就会命中断点以检查中断是否平衡。 因此、这是一个"系统"问题。

    现在、我需要回答的问题是、如果我无法信任该调试器、不会干扰系统、我可以信任它吗? 或者、该 MCU 的每个调试器是否会出现相同的基本问题?

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

    我不知道 Keil 调试器、但我知道 TI 的 Code Composer Studio 可以挂起 CPU 进行读取。 问题在于系统不再是实时系统。 使用 DAP (调试访问端口)、调试器可以读取存储器(包括外设)、而不会影响 CPU 的执行。 但是、您需要注意阅读的任何后果。

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

    完美的诊断问候

    并向那些诊断了"系统问题"的人表示喝彩。

    Bob -我记得、在过去(使用 LM3S 器件)、我们使用"Register View"(从 IAR 中使用)会导致类似的"错误读数"。   IIRC 这在 ADC 寄存器组中发生(尤其是)。   员工提前检查-我们可以发现、"没有此类注意事项"涉及此(潜在)错误生成(但高度意外)情况。   和... 重要-这个"错误读取条件"在所有调试器(至少 FTDI、Keil、IAR、Segger 和 CCS 下)发生。   同样、存在"唯一寄存器灵敏度"的特殊警告 (如果您"监控/这些寄存器-您"收集/使数据无效")- 我相信这些警告会随着时间的推移而减少-并且在检查将近一小时后的员工-找不到任何 MCU 手册提及!

    您可能知道并告知/建议-"正常调试用法何时及何地会"造成此类严重破坏?"    (它看起来"不是到处都有"-至少在过去...)   非常感谢!

    仍然令人关切的是,我们过去的问题是"不可改变的"(即始终发生)。   然而、这里的海报展示了一个问题、它揭示了"数千成功"-因此(部分)"FUD"(必然)仍然存在-它不是吗?

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

    还有更多...

    遵循此海报中的两个关键字:

    • "这个问题是随机的、我们可以毫无问题地进行上千次数据传输、然后一个将失败。   我们可以运行一个系统数天、而另一个系统只能运行几分钟。"

    • "外设视图窗口似乎不是读取寄存器的可靠方法。   我依靠将它们存储到局部变量中并在监视窗口中进行检查。"

    我现在还记得-这是"过去使用监视窗口"-"传了 (部分但不是全部)被监视的值!"   (即"某些"寄存器被视为"敏感!")     我记得(IAR 和 Keil)中的这一点-我们(从来没有)是供应商无关 IDE 的(其他)粉丝(因此我们的主要客户和投资者不允许 CCS)。

    我们可以问、"这是我们的主题吗?"   而且-"使用监视窗口时要格外小心-今天是否继续?"的指导   和-"特定"寄存器(尤其是)是否易于"敏感?"

    也许-这个主题是否值得、"将它应用到您的(计划/预先制定的)"API 更新?"   (作为剩余指南...)

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

    CB1、

    您提出了一些非常好的问题。 根据我对 TM4C "内幕揭秘"的了解、我将尝试解释我认为正在发生的情况、但我将猜测 IAR 和 Keil 调试器的实际实现情况。

    使用 JTAG、有两种方法可以读取 TM4C 器件地址空间中的任何内容。 第一种方法是扫描 M4 CPU 干扰执行读取或写入的指令、并恢复 CPU 的初始状态。 这是通过发出全局"挂起"信号来完成的、该信号可防止外设改变状态(存在一些可编程的异常)。 这是 TI Code Composer 通常使用的方法、所有调试器都使用此方法来读取内部 CPU 寄存器。 这种方法的问题是、它一定会使 CPU 停止一段时间。

    第二种方法是使用 ARM DAP 的功能(调试访问端口)。 在这个模式中、DAP 运行为一个由 JTAG 扫描链控制的总线主控。 将其视为 JTAG 的小型 DMA。 使用 DAP、JTAG 接口可以在不停止 CPU 的情况下提前进行读取和写入周期。 缺点是这些读取和写入周期是在没有"挂起"被置为有效的情况下完成的、因此它们的影响与 uDMA 已经完成的影响相同。 在这种情况下、对 SSIDR 的 DAP 读取从 SSI RX FIFO 中弹出一个值。 我怀疑这是 Keil 和 IAR 调试器使用的模式。

    那么、Eric 为什么会看到问题的随机性质? 我怀疑 Eric 使用的 Keil 调试器在代码运行时定期更新监视窗口。 如果调试器在接收到发送到 CPU 在中断例程中读取 FIFO 的短时间内读取 SSIDR 寄存器、就会无意中将 FIFO 清零。 发生这种情况的频率是中断延迟和调试器更新速率的函数。

    哪些寄存器会受到影响? 通过读取更改的任何寄存器都可能受影响。 明显的候选对象是接收 FIFO。  

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

    ( 一天后... 节日问候 Bob、"

    非常感谢-非常有洞察力-您对"内幕揭秘"的描述非常感激。   (尤其是从大学中"年轻员工(逃学)"-提升他们的技术技能(当然是为了获得大学学分)、同时从我们的"(有点微型化) Ft "中"提取"(但更多)。 诺克斯...)

    我们仍然对这张海报所报告的巨大变化(错误发生)"不安"。   再次-报告说、"连续运行数天不存在问题"和"只工作了几分钟!"    我们无法"确定"此问题可能"挂起" (仅限调试器)。

    多个寄存器说明(在"特定寄存器详细信息的级联"中-在 MCU 外设中)提供了"寄存器灵敏度的特别说明!"   (当然、我们还没有找到-并具体展示给您评论和/或"内幕揭秘"闪光灯...)

    如果我们的海报仍然是"在调试器始终连接的情况下执行的所有此类测试"、   如果是这样、(更重要的是)根据 Bob 的敏锐发现、这是否是一个"适当的程序"?   (可能是"Bob"亲切/在有能力时-对海报进行回应?   非常感谢。。。)

    [编辑] 09:48 CST  员工报告说、IAR 的"实时监视"使我们认为"关键"的寄存器能够"实时(即实时)查看"-并且在避免(可怕的)寄存器更改的同时、看起来是这样做的!    (我们从未尝试过“实时监视”任何 FIFO -我们今天已经开始对付费 IAR 对各种寄存器监视机制的描述进行“深度研究”... 并应报告...)    希望可能存在证明对许多人(不仅仅是 IAR 用户)有益的"发现"。。

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

    [引用 USER="CB1_MOBIST"]我们仍然因此海报所报告的巨大变化(错误发生)而"未解决"。   再次-报告说、"连续运行数天不存在问题"和"只工作了几分钟!"    我们无法"确定"此问题可能会"挂起" (仅限调试器)。

    我怀疑在这两个运行中打开的是不同的观察窗口。 我认为 Eric 是唯一能评论差异的人。

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

    大家好、

    我今天下班后回到办公室、可以报告一些事情。

    当设备"运行数天而无问题"时、设备未连接到调试器

    当单元"只工作几分钟"时、单元始终连接到调试器、SSI 寄存器观察窗口打开、"定期窗口更新"功能打开。 我相信 Bob 的结论是正确的、即调试器的时序恰好与中断时序完全一致、并且在代码有机会之前读取数据寄存器。

    但是、我在假期中将设备留在连接了调试器的位置、关闭了 SSI 监视窗口、关闭了定期更新功能。 我在~678M 个样本(运行时大约48小时)后再次登录 countSamples == 0 breakpont。 从跟踪数据可以看出、SSI 处理器被调用了两次、第二次调用在 FIFO 中没有任何数据、这是可以理解的。 我将进一步调查、并在发现问题时发布另一条回复。

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

    您好!

    我现在对我们的第二个问题非常肯定。 如果 SSI 中断在从接收 FIFO 读取数据之前被清除、那么该中断可能会重新触发。 我们曾尝试将 SSIIntClear ()调用移动到原来的位置,但由于调试器的问题,没有看到什么不同。 根据我对数据表的理解、我没有想到会出现这种情况。 据我所知、接收超时计数器应在 EMPTY -> NOT EMPTY 转换时开始、但计数器似乎会在 FIFO 中同时存在数据且中断未挂起时运行。

    下面是我要试验的 ISR 代码。 如果 SSIIntClear 被及早调用、由于中断重新触发、断点将在几秒钟后被命中。 任何其他点和断点都不会被命中、包括根本没有调用 SSIIntClear

    #define SSI_INT_CLEAR_NONE 0
    #define SSI_INT_CLEAR_EARLY 1
    #define SSI_INT_CLEAR_FACT_READ 2
    #define SSI_INT_CLEAR_Late 3
    
    #define SSI_INT_POINT SSINT_Late
    
    void SSI2_Handler (void)
    {
    uint32_t countsples = 0;
    int32_t CLEAR_CAP =
    
    
    0;INT_SSIFT_SSIFG (void = 0)
    、INT_SSIFT_SSIFG = INT_SSIFG (void)、INT_SSIFG = 0;INT_SSIFG = INT_SSIFG (IE_C141 (void)、INT_SSIFG = INT_SSIFG = INT_SSIFG (void
    busyWait_US (15);
    #endif
    
    //从 SSI 接收 FIFO 中读取、返回读取
    计数的元素数量=(uint32_t) SSIDataGetNonBlocking (ADC141_SSI_base、(uint32_t *)&recv);
    
    #if SSI_clear_point = SSI_blocking (ADC141_SSIF_SS_base、(UINT32_t *)、ADC141 (sSI_base
    
    )、ADC141_SSINT_SSIF_IE_SSIF_SSIFn (s_SSIF_SSIF_SSIF_SSIFn)、ADC141 (void)、ADC141 (s_Is_Is_Is_clase)、
    #endif
    
    
    //如果 FIFO 中没有可用的样本,则会出现严重错误。
    //断言将在无限循环中旋转,并在
    以下情况下间接导致 WDG 复位:(countSamples == 0)
    {__asm("BKPT
    0");
    }
    否则
    {sitxRxCounter--;}/*
    
    
    
    符号扩展差动 ADC 读数。 符号位位于位14中
    、因此我们*上下移位以将14位读数扩展到32位
    */
    recv <= 18;
    recv >=18;
    
    ADCSample.sampleData[ADCPort]= recv;
    
    /*在要采样的最后一个输入通道的中断上、我们将
    包含所有多路复用输入通道样本的*结构发送到
    第2代 CS 任务的*队列
    中*/
    if (ADCPort ==(ADC141_NUM_CHANNELS -1)
    ){
    void) OSALQueueFromSendISR (adc141SampleQueue、ADCSample_Channels);
    }
    
    //选择下一个以循环方式读取的 ADCPort 以及之后
    //最后一个通道回绕到第一个通道
    ADCPort++;
    if (ADCPort >= ADC141_NUM_CHANNELS)
    {
    ADCPort = 0;
    }
    
    MAX4052Select (ADCPort);
    
    #if SSI_CLEAR_POINT = SSI_INT_CLEAR_CHANNEL_SSIFG (SSIFS_INT_SSIF_SITE)
    
    、ADC141 (ID_SIT_L_BASE)、ADC141 (ADC141)(ID_SI_IN_SI_IN_SITE)、INT_ISI 状态(ID_BASE);ADC141 (ADC141 (ID_BIST_BIST_BASE)
    #endif
    } 

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

    数据表的第956页 表示接收超时中断应该在 FIFO 被读取后被清除。