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.

[参考译文] TMS320F28069:发生看门狗中断、计数器溢出、但不会发生复位?

Guru**** 2589265 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/873755/tms320f28069-a-watchdog-interrupt-occurs-the-counter-overflows-but-no-reset-occurs

器件型号:TMS320F28069

我使用了官方看门狗例程。 我没有在循环中馈入狗、但我发现程序未复位。 我应该怎么做?

以下是我的看门狗配置:

 我看到看门狗的计数器不断增加、甚至溢出、但系统没有复位。

我在官方双电机例程的看门狗例程中添加了配置

//######################################################################################################################
//
//文件:example_2806xWatchdog.c
//
//标题:看门狗中断测试示例
//
//! addtogroup f2806x_example_list
//!

看门狗中断测试(看门狗)


//!
//! 该程序会运行看门狗。
//!
//! 首先、看门狗连接到的 WAKEINT 中断
//! PIE 块。 然后将代码放入无限循环中。
//!
//! 用户可以选择是否馈入看门狗密钥寄存器
//! 在无限循环中注释以下代码行:
//! \b ServiceDog ();\n
//!
//! 如果看门狗键寄存器由 ServiceDog 函数馈送
//! 则不会产生 WAKEINT 中断。 如果密钥寄存器
//! 不由 ServiceDog 函数馈送、则将采用 WAKEINT。
//!
//! b 监视\b 变量\n
//! -\b LoopCount,表示通过无限循环的次数
//! -\b WakeCount,通过 WAKEINT 的次数
//
//######################################################################################################################
//$TI 发行版:F2806x 支持库 v2.04.00.00 $
//$Release Date:星期五5月24日03:37:28 CDT 2019 $
//版权所有:
//版权所有(C) 2009-2019德州仪器(TI)公司- http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,有无
//如果满足以下条件,则允许进行修改
//满足:
//
//重新分发源代码必须保留上述版权
//注意、此条件列表和以下免责声明。
//
//二进制形式的重新分发必须复制上述版权
//注意、中的条件列表和以下免责声明
//随提供的文档和/或其他材料
//分布。
//
//德州仪器公司的名称和的名称都不是
//其贡献者可用于认可或推广衍生产品
//未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
//$
//######################################################################################################################

//
//包含的文件
//
#include "DSP28x_Project.h"//器件头文件和示例 include 文件

//
//函数原型
//
_interrupt void WAKEINT_ISR (void);

//
//全局
//
uint32 WakeCount;
uint32环计数;

//
//主函
//
void main (void)

//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2806x_SYSCTRL.c 文件中。
//
InitSysCtrl();

//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2806x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
// InitGpio();//针对此示例跳过

//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2806x_PIECTRL.c 文件中。
//
InitPieCtrl();

//
//禁用 CPU 中断并清除所有 CPU 中断标志
//
IER = 0x0000;
IFR = 0x0000;

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2806x_PieVect.c 中找到
//
InitPieVectTable();

//
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.WAKEINT =&WAKEINT_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

//
//步骤4. 初始化所有器件外设:
//此函数可在 F2806x_InitPeripherals.c 中找到
//
//InitPeripheral();//本示例不需要

//
//步骤5. 特定于用户的代码、启用中断
//

//
//清除计数器
//
WakeCount = 0;//计数中断
LOOPCount = 0;//通过空闲循环的计数时间

//
//将看门狗连接到 PIE 的 WAKEINT 中断
//写入整个 SCSR 寄存器以避免清零 WDOVERRIDE 位
//
EALLOW;
SysCtrlRegs.SCSR = BIT1;
EDIS;

//
//在 PIE 中启用 WAKEINT:组1中断8
//启用连接到 WAKEINT 的 INT1:
//
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
PieCtrlRegs.PIEIER1.bit.INTx8 = 1;//启用 PIE gropu 1 INT8
IER |= M_INT1;//启用 CPU INT1
EINT;//启用全局中断

//
//重置看门狗计数器
//
ServiceDog ();

//
//启用看门狗
//
EALLOW;
SysCtrlRegs.WDCR = 0x0028;
EDIS;

//
//步骤6. 空闲循环。 只需坐下来循环(可选)
//
for (;;)

LoopCount++;

//
//取消注释 ServiceDog 以在此处循环
//注释 ServiceDog 以改用 WAKEINT
//
// ServiceDoG();

//
//步骤7. 插入所有本地中断服务例程(ISR)和函数
//此处:如果使用了本地 ISR,则在向量表中重新分配向量地址,如下所示
//如步骤5所示
//

//
// WAKEINT_ISR -
//
_interrupt void WAKEINT_ISR (void)

WakeCount++;

//
//确认此中断以从组1获取更多内容
//
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

//
//文件结束
//