主题中讨论的其他器件: CC2650、 CC2640
大家好!
我使用的是 Launchxl-CC2650。
BLE SDK 2_02_07_06
TI RTOS 2.21.1.08
CCS7.4
编译器 TI Ver.5.2.6。
我已经在 uart_echo 示例代码中添加了看门狗驱动程序的代码。
我可以看到 UART 可以成功在串行端口上打印。
CC2650也会在看门狗计时器到期时重新启动。
我正在对看门狗回调函数中的 UART 端口进行写入、但未调用该函数。
请帮助
谢谢!
D·萨尔维
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.
大家好!
我使用的是 Launchxl-CC2650。
BLE SDK 2_02_07_06
TI RTOS 2.21.1.08
CCS7.4
编译器 TI Ver.5.2.6。
我已经在 uart_echo 示例代码中添加了看门狗驱动程序的代码。
我可以看到 UART 可以成功在串行端口上打印。
CC2650也会在看门狗计时器到期时重新启动。
我正在对看门狗回调函数中的 UART 端口进行写入、但未调用该函数。
请帮助
谢谢!
D·萨尔维
/*
* ======== uartecho.c ========
*/
/* XDCtools Header files */
#include <xdc/std.h>
#include <xdc/runtime/System.h>
/* BIOS Header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
/* TI-RTOS Header files */
#include <ti/drivers/PIN.h>
#include <ti/drivers/UART.h>
/* Example/Board Header files */
#include "Board.h"
#include <stdint.h>
#include <ti/drivers/Watchdog.h>
#include <ti/drivers/watchdog/WatchdogCC26XX.h>
#include <stdio.h>
#include <string.h>
#define TASKSTACKSIZE 768
Task_Struct task0Struct;
Char task0Stack[TASKSTACKSIZE];
/* Global memory storage for a PIN_Config table */
static PIN_State ledPinState;
Watchdog_Params params;
Watchdog_Handle watchdog;
uint32_t tickValue;
/*
* Application LED pin configuration table:
* - All LEDs board LEDs are off.
*/
PIN_Config ledPinTable[] = {
Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Board_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
PIN_TERMINATE };
char str[] = "Watchdog System Reset Called\n";
UART_Handle uart;
/*
* ======== echoFxn ========
* Task for this function is created statically. See the project's .cfg file.
*/
Void echoFxn(UArg arg0, UArg arg1) {
char input;
UART_Params uartParams;
const char echoPrompt[] = "Starting Watchdog application:\r\n";
/* Create a UART with data processing off. */
UART_Params_init(&uartParams);
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_RETURN_FULL;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudRate = 115200;
uart = UART_open(Board_UART0, &uartParams);
if (uart == NULL) {
System_abort("Error opening the UART");
}
UART_write(uart, echoPrompt, sizeof(echoPrompt));
/* Loop forever echoing */
while (1) {
UART_read(uart, &input, 1);
UART_write(uart, &input, 1);
}
}
void UserCallbackFxn(UArg watchdog);
//typedef void (*Watchdog_Callback)(uintptr_t);
/*
* ======== main ========
*/
int main(void) {
PIN_Handle ledPinHandle;
Task_Params taskParams;
/* Call board init functions */
Board_initGeneral()
;
Board_initUART();
//start watchdog initialization code
Board_initWatchdog();
/* Create and enable a Watchdog with resets enabled */
Watchdog_Params_init(¶ms);
params.resetMode = Watchdog_RESET_OFF;
params.callbackFxn = (Watchdog_Callback)UserCallbackFxn;
params.debugStallMode = Watchdog_DEBUG_STALL_ON;
watchdog = Watchdog_open(Board_WATCHDOG0, ¶ms);
if (watchdog == NULL) {
System_printf("Failed to open Watchdog Driver\n");
System_flush();
} else {
System_printf("Watchdog Driver opened Successfully\n");
}
tickValue = Watchdog_convertMsToTicks(watchdog, 2000);
Watchdog_setReload(watchdog, tickValue);
/* Construct BIOS objects */
Task_Params_init(&taskParams);
taskParams.stackSize = TASKSTACKSIZE;
taskParams.stack = &task0Stack;
Task_construct(&task0Struct, (Task_FuncPtr) echoFxn, &taskParams, NULL);
/* Open LED pins */
ledPinHandle = PIN_open(&ledPinState, ledPinTable);
if (!ledPinHandle) {
System_abort("Error initializing board LED pins\n");
}
PIN_setOutputValue(ledPinHandle, Board_LED1, 1);
System_flush();
/* Start BIOS */
BIOS_start();
return (0);
}
void UserCallbackFxn(UArg watchdog) {
UART_write(uart, &str, sizeof(str));
} 附加了我的代码供您参考。 您好!
下面是我认为可能正在发生的情况:
文档中明确指出不能从看门狗计时器回调中调用 BIOS API、我假设 UART_WRITE 操作是非阻塞的、所以可以启动写入操作、但由于器件被复位、因此永远不会完成该操作。
换句话说、不能从看门狗计时器的回调中打印输出内容。
不过、我们可以从回调中清除看门狗计时器、防止复位、并在回调中设置标志。
然后、另一个任务可以检查此标志的状态并从非回调环境中输出你需要的任何数据。
希望这有助于您更好地了解看门狗的工作方式、
此致、
我将重新分配该主题、因此您会找到相关的专家。
我很抱歉我忘记了重置、但结果应该是一样的。
...
正如 watchdog.h 文件中提到的、并非所有目标都支持指向回调的指针。
因此、如果您查看位于 include 中的 watchdogCC26xx.h 文件、就会清楚地显示 "因此、从看门狗回调函数调用任何 OS API 都是不安全的。 这包括任何依赖于操作系统 API 的驱动程序调用。"
...
此致、
大家好、Dnyaneshvar、
感谢您在打开看门狗手柄后提供了寄存器的屏幕截图。 寄存器看起来正确、我可以看到您进行的配置实际上都用在了正确的位置。 当您运行调试会话时、您说从不会在回调函数中到达断点。 你能看到在 ICSR 寄存器中设置了任何 NMI 中断吗? 这可以帮助我们了解是否实际发生了看门狗中断。 如果在您配置看门狗过期的时间内、此处没有发生任何活动、则不会发生看门狗过期中断、这将解释未调用回调。 您能检查一下吗、稍后再联系我吗?
此致!
阿赫尤特
很好! 这意味着产生了一个中断! 这是一件好事,现在你发送的图像更有意义. 如果您检查在我要求您发送 NMIPENDSET 图像时发送的映像、则字段 ISRPENDING 具有值1、这意味着在某个位置有一个挂起的中断。 能否在 WDT 超时时时时尝试打开复位? 执行此操作时、请记住从 ISR 中清除计时器、否则器件将复位。 当开启"复位"时、首次计时器到期时会生成中断。 如果 ISR 不清除计时器、则器件会复位。
您可以在打开复位的情况下进行测试吗? 为了确保听起来不易理解、启用了复位、然后在 ISR 中将
Watchdog_clear(watchdog);作为第一行。 您能告诉我它对您的作用如何吗?
您好!
我添加了 Watchdog_Clear (看门狗)、其中在我随附的代码中显示了 A。
/*
* ======== uartecho.c ========
*/
/* XDCtools Header files */
#include <xdc/std.h>
#include <xdc/runtime/System.h>
/* BIOS Header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
/* TI-RTOS Header files */
#include <ti/drivers/PIN.h>
#include <ti/drivers/UART.h>
/* Example/Board Header files */
#include "Board.h"
#include <stdint.h>
#include <ti/drivers/Watchdog.h>
#include <ti/drivers/watchdog/WatchdogCC26XX.h>
#include <stdio.h>
#include <string.h>
#define TASKSTACKSIZE 768
Task_Struct task0Struct;
Char task0Stack[TASKSTACKSIZE];
/* Global memory storage for a PIN_Config table */
static PIN_State ledPinState;
Watchdog_Params params;
Watchdog_Handle watchdog;
uint32_t tickValue;
PIN_Handle ledPinHandle;
/*
* Application LED pin configuration table:
* - All LEDs board LEDs are off.
*/
PIN_Config ledPinTable[] = {
Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Board_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
PIN_TERMINATE };
char str[] = "Watchdog System Reset Called\n";
UART_Handle uart;
/*
* ======== echoFxn ========
* Task for this function is created statically. See the project's .cfg file.
*/
Void echoFxn(UArg arg0, UArg arg1) {
char input;
UART_Params uartParams;
const char echoPrompt[] = "Starting Watchdog application:\r\n";
/* Create a UART with data processing off. */
UART_Params_init(&uartParams);
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_RETURN_FULL;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudRate = 115200;
uart = UART_open(Board_UART0, &uartParams);
if (uart == NULL) {
System_abort("Error opening the UART");
}
UART_write(uart, echoPrompt, sizeof(echoPrompt));
/* Loop forever echoing */
while (1) {
UART_read(uart, &input, 1);
UART_write(uart, &input, 1);
}
}
void UserCallbackFxn(Watchdog_Handle watchdog);
//typedef void (*Watchdog_Callback)(uintptr_t);
/*
* ======== main ========
*/
int main(void) {
Task_Params taskParams;
/* Call board init functions */
Board_initGeneral()
;
Board_initUART();
//start watchdog initialization code
Board_initWatchdog();
/* Create and enable a Watchdog with resets enabled */
Watchdog_Params_init(¶ms);
params.resetMode = Watchdog_RESET_ON;
params.callbackFxn = (Watchdog_Callback)UserCallbackFxn;
params.debugStallMode = Watchdog_DEBUG_STALL_ON;
watchdog = Watchdog_open(Board_WATCHDOG0, ¶ms);
if (watchdog == NULL) {
System_printf("Failed to open Watchdog Driver\n");
System_flush();
} else {
System_printf("Watchdog Driver opened Successfully\n");
}
tickValue = Watchdog_convertMsToTicks(watchdog, 3000);
Watchdog_setReload(watchdog, tickValue);
/* Construct BIOS objects */
Task_Params_init(&taskParams);
taskParams.stackSize = TASKSTACKSIZE;
taskParams.stack = &task0Stack;
Task_construct(&task0Struct, (Task_FuncPtr) echoFxn, &taskParams, NULL);
/* Open LED pins */
ledPinHandle = PIN_open(&ledPinState, ledPinTable);
if (!ledPinHandle) {
System_abort("Error initializing board LED pins\n");
}
PIN_setOutputValue(ledPinHandle, Board_LED1, 1);
System_flush();
/* Start BIOS */
BIOS_start();
return (0);
}
void UserCallbackFxn(Watchdog_Handle watchdog) {
Watchdog_clear(watchdog);
PIN_setOutputValue(ledPinHandle, Board_LED1, 0);
UART_write(uart, &str, sizeof(str));
}
但器件正在复位