主题: C2000WARE 中讨论的其他器件
工具/软件:
您好:
我使用的是 TMS320F280025微控制器和安全诊断库 v4.01.00。 我目前遇到以下问题:
1.每次执行 HWBIST 微运行测试后、都会触发一个意外的计时器2中断。
2.有时、在 HWBIST 微运行测试之后、我必须手动清除 PIE 中断组的确认位、就像正在生成虚假中断一样。
这些行为是否符合预期?
是否有防止或处理这些问题的建议方法?
提前感谢您的支持。
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.
工具/软件:
您好:
我使用的是 TMS320F280025微控制器和安全诊断库 v4.01.00。 我目前遇到以下问题:
1.每次执行 HWBIST 微运行测试后、都会触发一个意外的计时器2中断。
2.有时、在 HWBIST 微运行测试之后、我必须手动清除 PIE 中断组的确认位、就像正在生成虚假中断一样。
这些行为是否符合预期?
是否有防止或处理这些问题的建议方法?
提前感谢您的支持。
Andrea、
这看起来与此勘误表相关:
但是、在与 SDL 所有者交谈后、勘误表中提到的解决方法应包含在您正在使用的 SDL V4.01中。
您能否在 stl_hwbist_s.asm 文件中查找它、以验证您看到的内容与勘误表中提到的内容类似?
此致、
Matthew
Andrea、
我目前正在尝试重现上面的第1点;我这边还有一些问题:
您是否可以提供正在运行的系统时钟设置(即120MHz 或其他设置)以及主时钟源。 此处的默认值为 INTOSC2。
[quote userid="653552" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1510748/tms320f280025-spurious-interrupts-after-hwbist-test 有时、在 HWBIST 微运行测试之后、我必须手动清除 PIE 中断组的确认位、就像正在生成虚假中断一样。您是否还能提供哪些 PIE 国际财务报告准则?
这些中断是您在正常代码执行中期望实现的、还是与您的应用完全无关?
如果上述问题的答案是肯定的、那么所涉及的模块是在 HWBIST 执行时保持运行还是禁用了这些模块?
此致、
Matthew
您好 Matthew、
SYSCLK 在100 MHz 下运行 、根据使用以下 PLLSYSCLK 配置的外部晶体振荡器(XTAL)得出:12 MHz (XTAL_OSC)× 50 (IMULT)/[2 (REFDIV)× 3 (ODIV)× 1 (SYSDIV)]。
计时器2由 INTOSC1提供时钟、预分频器为1、并配置为每500ms 生成一个中断 。 STL_HWBIST_runMicro()
会在每个55 µs 中执行。 每次执行后STL_HWBIST_runMicro()
、我都会观察到计时器2 ISR 被触发。
PIE IFRS 对应于在执行 HWBIST 测试期间启用并可能发生的中断。
经过进一步调查后、似乎(尽管不确定)该问题仅在 HWBIST 执行期间发生中断事件时出现。
在这种情况下、需要调用Interrupt_clearACKGroup()
(如下面的代码所示)、否则不再触发相应的 ISR。
代码如下所示:
// ADC ISR
中断无效 ADC_ISR (void)
{
//一些代码...
//确认中断组1以允许来自该组的进一步中断
INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_GROUP1);
//一些代码...
//执行 HWBIST 微运行
STL_HWBIST_runMicro ();
//一些代码...
//此确认不是必需的
INTERRUPT_CLEARACKGROUP (HWREGH (PIECTRL_BASE + PIE_O_ACK));
}
此致、
Andrea
PIE IFRS 对应于在执行 HWBIST 测试期间启用并可能发生的中断。
经过进一步调查后、似乎(尽管不确定)该问题仅在 HWBIST 执行期间发生中断事件时出现。
在这种情况下、需要调用Interrupt_clearACKGroup()
(如下面的代码所示)、否则不再触发相应的 ISR。
Andrea、感谢这一点;从我们这边来看、这是预期的行为、HWBIST 会将在 HWBIST 执行期间发生的所有中断记录到缓冲区中、然后在执行完成后将这些中断恢复到系统中。 https://www.ti.com/lit/an/spraca7a/spraca7a.pdf (第5页)
我将使用上面#1上的设置来查看是否可以在我的设备上复制此行为。
此致、
Matthew
Andrea、
我想我得到了答案、在 stl_hwbist_s.asm 文件中假设用户正在清除计时器 ISR 中的 TIF (计时器中断标志)位15。 但是、对于重复的计时器 ISR、清除 TIF 位并非绝对必要、因此我需要您检查是否在计时器2 ISR 中执行此操作。
如果未清除 TIF、那么您将在每次 HWBIST 运行时获得一个计时器2 INT (这是您看到的内容)。即使您清除该位、也可能会发生这种情况、但这会假设计时器2周期与微运行之间的时间~μ s 相同、我认为情况并非如此。
背景如下:
在我们在 HWBIST 微运行之前启用中断记录之前、我们先保存 Timer1和 timer2 TCR 寄存器(包含 TIF 和 tie (计时器中断使能)的状态、然后再清除 tie 位以避免虚假 ISR、如上所述
MOVW DP, #TmrRegs MOV AL, @TMR1TCR ; Save TCR registers in the ACC MOV AH, @TMR2TCR AND @TMR1TCR, #~(3 << 14) ; Clear TIE bit without clearing TIF AND @TMR2TCR, #~(3 << 14) ; Clear TIE bit without clearing TIF EALLOW MOVW DP, #HWBRegs MOVW @CSTCGCR3, #0x0A ; Start logging interrupts
现在、当我们从微运行恢复上下文恢复时、我们在以下代码中重新查看 TCR 寄存器的存储版本。
; Restore the CPU Timer 1 & 2 interrupt enable status. If the TCR.TIF bit ; is set and interrupts were enabled force the corresponding bit in IFR. ; MOVW DP, #TmrRegs TBIT AL, #14 ; Branch if TIE wasn't set SB noEnableTIE1, NTC TBIT @TMR1TCR, #15 ; Branch if TIE was set, but TIF isn't SB enableTIE1, NTC OR IFR, #(1 << 12) ; Set the IFR flag for INT13 enableTIE1: MOV AL, @TMR1TCR ; Reenable CPU Timer 1 interrupts AND AL, #~(1 << 15) ; TIF is W1C, so take care not to clear it OR AL, #(1 << 14) MOV @TMR1TCR, AL noEnableTIE1: TBIT AH, #14 ; Check if TIE was set SB noEnableTIE2, NTC TBIT @TMR2TCR, #15 ; Branch if TIE was set, but TIF isn't SB enableTIE2, NTC OR IFR, #(1 << 13) ; Set the IFR flag for INT14 enableTIE2: MOV AL, @TMR2TCR ; Reenable CPU Timer 2 interrupts AND AL, #~(1 << 15) ; TIF is W1C, so take care not to clear it OR AL, #(1 << 14) MOV @TMR2TCR, AL noEnableTIE2:
如果没有设置 TIE 位(意味着用户没有使用计时器中断)、我们跳到下一个计时器、因为我们不关心 TIF (根据计时器的工作方式、这些计时器在复位后启用、因此即使未使用、也会设置 TIF)。
本例中、由于未使用计时器1、因此我们跳过它并继续介绍计时器2。
现在、由于计时器2设置了连接、我们完成了评估、然后继续评估位15 TIF。 如果在我们启动 HWBIST 之前设置了它、则假设我们在为 ISR 提供服务之前捕获了它、因此在我们返回时需要为其提供服务。
如果用户未有意清除计时器2 ISR 中的 TIF、则始终设置该位;因此 ASM 代码将手动设置与计时器2相对应的 IFR 位。
因此、我们有两种选择:
1)清除计时器2 ISR 中的 TIF 位。 我认为这是最简单的
2)更改代码 stl_hwbist_s.asm 以在保存上下文时特意清除 TIF 位。 最糟糕的是、这会将计时器2 ISR 延迟一个计时器2周期。 这样做的缺点是我们必须重新编译 stl_diagnostic.lib、因为 asm 文件是该库的一部分。 该工程确实存在于 C2000Ware 中、因此不会太难、而是需要额外执行一个步骤、具体取决于您要如何继续。
此致、
Matthew