Other Parts Discussed in Thread: EK-TM4C1294XL, UNIFLASH
Thread 中讨论的其他器件:EK-TM4C1294XL、 UNIFLASH、 SYSBIOS
您好
如何在 ti RTOS 中配置看门狗计时器。 以便我可以在指定的时间刷新看门狗计时器。 我在 TI RTOS 中找到了一个看门狗的示例、但我 找不到任何方法来控制它。 有人能帮我解决这个问题吗。任何说明它的文档或教程都是受欢迎的
提前感谢!
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.
Other Parts Discussed in Thread: EK-TM4C1294XL, UNIFLASH
您好
如何在 ti RTOS 中配置看门狗计时器。 以便我可以在指定的时间刷新看门狗计时器。 我在 TI RTOS 中找到了一个看门狗的示例、但我 找不到任何方法来控制它。 有人能帮我解决这个问题吗。任何说明它的文档或教程都是受欢迎的
提前感谢!
您好!
[quote userid="564247" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1231778/tm4c129encpdt-watchdog 如何在 ti rtos 中配置看门狗计时器。 以便我可以在指定的时间内刷新看门狗计时器。我想您是在问如何配置 WD 计时器值。 请查看项目中的 EK-TM4C1294XL.c。 默认情况下、重载值设置为120000000、超时时间为1秒。 您可以根据应用程序进行更改。
/*
*=================================================== 看门狗===================================
*/
/*放置在子段中以允许 TI 链接器正确删除项目*/
#if defined (__TI_Compiler_version__)
#pragma DATA_SECTION (Watchdog_config、".const:Watchdog_config")
#pragma DATA_SECTION (watchdogTivaHWAttrs、".const:watchdogTivaHWAttrs")
#endif
#包含
#包含
WatchdogTiva_Object WatchdogTivaObjects [EK_TM4C1294XL_WATCHDOGCOUNT ];
const WatchdogTiva_HWAttrs 观察装置 TivaHWAttrs[EK_TM4C1294XL_WATCHDOGCOUNT ={
{
.baseAddr = WATCHDOG0_BASE、
.intNum = INT_WATCHDOG、
.intPriority =(~0)、
.reloadValue = 120000000 //默认的 CPU 时钟频率具有1秒的周期
}、
};
尊敬的 Charles:
感谢您的回复、 看门狗固件出现了问题。运行固件后、无法调试或连接到任何其他工具。 我已经尝试使用 uniflash 工具擦除闪存、但失败。我在尝试调试时收到的消息是"Cortex_M4_0:连接到目标时出错 "
以下是我的代码。
*=========== watchdog.c =========
*/
#包含
/* XDCtools 头文件*/
#包含
#包含
/* BIOS 头文件*/
#包含
#包含
/* TI-RTOS 头文件*/
#包含
#包含
/*示例/板头文件*/
#include "board.h"
#定义 TASKSTACKSIZE 512
bool flag = false;
Task_Struct task0Struct;
char task0Stack[TASKSTACKSIZE];
Watchdog_Handle watchdogHandle;
/*
*=========== WatchdogCallback =========
*看门狗中断回调函数。 它会切换、LED 也会亮起、
*未被按下、清除看门狗中断标志。
*/
void watchdogCallback (uintptr_t 未使用)
{
/*清除看门狗中断标志*/
System_printf ("咬狗...");
system_flush();
WATCHDOG_CLEAR (watchdogHandle);
GPIO_toggle (Board_LED0);
}
/*
*=========== gpioButtonFxn =========
* Board_BUTTON0上 GPIO 中断的回调函数。
*/
void gpioButtonFxn (unsigned int index)
{
flag ^= true;
GPIO_WRITE (Board_LED0、BOARD_LED_ON);
}
/*
*=========== taskFxn ===========
*如果按钮已被按下、则设置标志并清除看门狗计时器。
*/
void taskFxn (UArg arg0、UArg arg1)
{
while (真){
/*如果按下按钮,则阻止触发看门狗 ISR */
if (flag){
WATCHDOG_CLEAR (watchdogHandle);
}
}
}
/*
*=========== 主线====
*/
int main (空)
{
Task_Params taskParams;
WATCHDOG_PARAMS 参数;
/*调用板初始化函数*/
Board_initGeneral();
Board_initGPIO();
Board_initWatchdog();
/*构造 BIOS 对象*/
Task_Params_init (&taskParams);
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =&task0Stack;
Task_structure (&task0Structurt、taskFxn、&taskParams、NULL);
/*打开用户 LED */
GPIO_WRITE (Board_LED0、BOARD_LED_ON);
/*安装按钮回调*/
GPIO_setCallback (Board_BUTTON0、gpioButtonFxn);
/*启用中断*/
GPIO_enableInt (Board_BUTTON0);
System_printf ("启动看门狗示例\n 系统提供程序设置为"
"SysMin。 Halt the target to view any SysMin contents in "(停止目标以查看中的任何 SysMin 内容)
" ROV.\n");
/* SysMin 仅在您调用 flush 或 exit 时打印到控制台*/
system_flush();
/*创建并启用禁用复位的看门狗*/
WATCHDOG_PARAMS_INIT (¶ms);
params.callbackFxn =(Watchdog_Callback)看门狗回调;
params.resetMode = Watchdog_reset_on;
WatchdogHandle = Watchdog_open (Board_WATCHDOG0、¶ms);
if (watchdogHandle == NULL){
system_abort ("打开看门狗时出错!\n");
}
WATCHDOG_setReload (watchdogHandle、2000);//将超时设置为5秒
// uint32_t ticks =(毫秒* Clock_tickPeriod)/ 1000;
/*启动 BIOS */
BIOS_start();
返回(0);
}
Watchdog_setReload (watchdogHandle、2000);//将超时设置为5秒
[/报价]虽然您的注释显示5秒超时、但您实际上输入了2000、CPU 周期在120MHz 时等于16.5uS。 这意味着它将每16.5us 置位一次 WD 复位。 这一次可能太短、无法连接调试器。 如果您可以 在 WD 到期之前刚好按 BOARD_BUTTON0足够快的顺序、您可能有机会停止 WD 生成未来的复位。 但我不知道你成功的机会。 您可能需要使用函数发生器来强制 Board_BUTTON0为低电平、而不是使用您的手指。
您也可以尝试解锁器件以使器件进入出厂设置。 我在这里也不知道成功率、如前所述、WD 复位出现得太快。 如果您使用的是 XDS 调试探头、请按照本应用手册中的第5.3.2节使用 dbgjtag.exe 来解锁器件。 https://www.ti.com/lit/pdf/spma075
如果可以解锁器件、我会建议将来在启用 WD 之前添加一些依赖于 GPIO 输入引脚状态的代码。 如果未满足预期的引脚状态、它只会旋转、不会进一步进行。 这样、您就可以防止任何 导致调试器无法连接的错误 WD 设置。
您好!
您有什么调试探针? 在我上次的回复中、我说过如果使用 XDS200等调试探针、您可以使用 dbgjtag.exe 来解锁器件。 请再次参阅应用手册的第5.3.2节。 https://www.ti.com/lit/pdf/spma075
另请参阅第4.8节中的相同应用手册、其中您可以使用 LaunchPad 调试定制板。 使用 LaunchPad 时、可以使用 LM 闪存编程器或 Uniflash 通过选择 ICDI 调试探针来解锁器件。
您好、Charles、
感谢您的答复。 我能够通过添加和重置按钮擦除闪存。但我的代码卡在"Task_SupportProxy_swap ((ptr)&prepTask -> context、
(ptr)&Task_module->curTask->context);"。
这是我的代码、
void watchdogCallback (uintptr_t 未使用)
{
/*清除看门狗中断标志*/
WATCHDOG_CLEAR (watchdogHandle);
System_printf ("咬狗...");
system_flush();
UartWrite (((char*)"\n\n\rdog bit...\n\n");
WATCHDOG_setReload (watchdogHandle、600000000);//将超时设置为5秒((120000000*5000/1000))= 600000000
GPIO_WRITE (Board_LED0、1);
}
void taskFxn (UArg arg0、UArg arg1)
{
while (1)
{
WATCHDOG_CLEAR (watchdogHandle);
GPIO_toggle (Board_LED1);
UartWrite (((char*)"\n\r 来自任务函数的 Hello ...\n\r");
WATCHDOG_setReload (watchdogHandle、600000000);//将超时设置为5秒((120000000*5000/1000))= 600000000
}
}
/*
*=========== 主线====
*/
int main (空)
{
/*调用板初始化函数*/
Board_initGeneral();
Board_initGPIO();
Board_initWatchdog();
watchdog_init();
/*构造 BIOS 对象*/
Task_Params_init (&taskParams);
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =&task0Stack;
Task_structure (&task0Structurt、taskFxn、&taskParams、NULL);
GPIO_setConfig (Board_LED1、GPIO_CFG_OUTPUT | GPIO_CFG_OUT_HIGH);
GPIO_setConfig (Board_LED0、GPIO_CFG_OUTPUT | GPIO_CFG_OUT_HIGH);
GPIO_WRITE (Board_LED0、1);
GPIO_WRITE (Board_LED1、0);
System_printf ("启动看门狗示例\n 系统提供程序设置为"
"SysMin。 Halt the target to view any SysMin contents in "(停止目标以查看中的任何 SysMin 内容)
" ROV.\n");
/* SysMin 仅在您调用 flush 或 exit 时打印到控制台*/
system_flush();
/*创建并启用禁用复位的看门狗*/
WATCHDOG_PARAMS_INIT (¶ms);
params.callbackFxn =(Watchdog_Callback)看门狗回调;
params.resetMode = Watchdog_reset_on;
WatchdogHandle = Watchdog_open (Board_WATCHDOG0、¶ms);
if (watchdogHandle == NULL){
system_abort ("打开看门狗时出错!\n");
}
WATCHDOG_setReload (watchdogHandle、600000000);//将超时设置为5秒((120000000*5000/1000))= 600000000
// uint32_t ticks =(毫秒* Clock_tickPeriod)/ 1000;
/*启动 BIOS */
BIOS_start();
返回(0);
}
您能帮助我解决这个问题吗?
在您的任务 Fxn 中、您处于永久 while 循环中、不断清除看门狗、切换 GPIO 并将数据发送到 UART。 您将造成系统崩溃。 与此函数中的任何事件没有同步。 为什么不尝试使用库存示例、只需使用 Watchdog_setReload 将看门狗超时更改为5秒。 首先获取基本的工作,并根据您的应用要求逐渐修改。
void taskFxn (UArg arg0、UArg arg1)
{
while (1)
{
WATCHDOG_CLEAR (watchdogHandle);
GPIO_toggle (Board_LED1);
UartWrite (((char*)"\n\r 来自任务函数的 Hello ...\n\r");
WATCHDOG_setReload (watchdogHandle、600000000);//将超时设置为5秒((120000000*5000/1000))= 600000000
}