samples: drivers: watchdog: Handle watchdog event

Also modified to timeout to 1000ms in order to support watchdogs like
WWDG with smaller timeouts.

Signed-off-by: Ioannis Konstantelias <ikonstadel@gmail.com>
This commit is contained in:
Ioannis Konstantelias 2019-07-15 17:56:25 +03:00 committed by Kumar Gala
commit e8b0f5644f
3 changed files with 46 additions and 9 deletions

View file

@ -0,0 +1,11 @@
# 2MHz system clock
CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=2000000
# SYSCLK selection
CONFIG_CLOCK_STM32_SYSCLK_SRC_MSI=y
# produce 2MHz clock at MSI RC output
CONFIG_CLOCK_STM32_MSI_RANGE=5
# select buses prescalers
CONFIG_CLOCK_STM32_AHB_PRESCALER=1
CONFIG_CLOCK_STM32_APB1_PRESCALER=1
CONFIG_CLOCK_STM32_APB2_PRESCALER=1

View file

@ -13,3 +13,18 @@ tests:
- "Waiting for reset..."
- "Watchdog sample application"
depends_on: watchdog
platform_exclude: nucleo_l496zg nucleo_f401re
sample.driver.window_watchdog_nucleo_l496zg:
tags: drivers
harness: console
harness_config:
type: multi_line
ordered: true
regex:
- "Watchdog sample application"
- "Feeding watchdog..."
- "Waiting for reset..."
- "Watchdog sample application"
depends_on: watchdog
platform_whitelist: nucleo_l496zg
extra_args: CONF_FILE="prj.conf;nucleo_l496zg.conf"

View file

@ -1,6 +1,7 @@
/*
* Copyright (c) 2015 Intel Corporation
* Copyright (c) 2018 Nordic Semiconductor
* Copyright (c) 2019 Centaur Analytics, Inc
*
* SPDX-License-Identifier: Apache-2.0
*/
@ -9,6 +10,7 @@
#include <device.h>
#include <drivers/watchdog.h>
#include <sys/printk.h>
#include <stdbool.h>
#define WDT_FEED_TRIES 5
@ -16,16 +18,25 @@
#ifdef CONFIG_WDT_0_NAME
#define WDT_DEV_NAME CONFIG_WDT_0_NAME
#else
#ifdef CONFIG_WWDG_STM32
#define WDT_DEV_NAME DT_WWDT_0_NAME
#else
#define WDT_DEV_NAME DT_WDT_0_NAME
#endif
#endif
static void wdt_callback(struct device *wdt_dev, int channel_id)
{
ARG_UNUSED(wdt_dev);
ARG_UNUSED(channel_id);
/* Watchdog timer expired. Handle it here.
* Remember that SoC reset will be done soon.
*/
static bool handled_event;
if (handled_event) {
return;
}
wdt_feed(wdt_dev, channel_id);
printk("Handled things..ready to reset\n");
handled_event = true;
}
void main(void)
@ -46,9 +57,9 @@ void main(void)
/* Reset SoC when watchdog timer expires. */
wdt_config.flags = WDT_FLAG_RESET_SOC;
/* Expire watchdog after 5000 milliseconds. */
/* Expire watchdog after 1000 milliseconds. */
wdt_config.window.min = 0U;
wdt_config.window.max = 5000U;
wdt_config.window.max = 1000U;
/* Set up watchdog callback. Jump into it when watchdog expired. */
wdt_config.callback = wdt_callback;
@ -75,12 +86,12 @@ void main(void)
for (int i = 0; i < WDT_FEED_TRIES; ++i) {
printk("Feeding watchdog...\n");
wdt_feed(wdt, wdt_channel_id);
k_sleep(1000);
k_sleep(50);
}
/* Waiting for the SoC reset. */
printk("Waiting for reset...\n");
while (1) {
k_yield();
};
}
}