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.
您好
如何在 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
}