diff --git a/bsp/stm32f10x/drivers/SConscript b/bsp/stm32f10x/drivers/SConscript index 6a1ab42bb75586da26fadd6bc35e7eb1788245ea..1629fc691add3a06323dc6b110ae827792a8aaa9 100644 --- a/bsp/stm32f10x/drivers/SConscript +++ b/bsp/stm32f10x/drivers/SConscript @@ -39,6 +39,10 @@ if GetDepend('RT_USING_RTGUI'): elif rtconfig.RT_USING_LCD_TYPE == 'SSD1289': src += ['ssd1289.c'] +# add wdt driver. +if GetDepend('RT_USING_WDT'): + src += ['stm32f1_wdg.c'] + CPPPATH = [cwd] diff --git a/bsp/stm32f10x/drivers/stm32f1_wdg.c b/bsp/stm32f10x/drivers/stm32f1_wdg.c new file mode 100644 index 0000000000000000000000000000000000000000..fae575abc7d42310f9fddeb91e18897937f2dcf3 --- /dev/null +++ b/bsp/stm32f10x/drivers/stm32f1_wdg.c @@ -0,0 +1,118 @@ +/* + * File : stm32f1_wdg.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006-2013, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2017-01-18 aubrcool@qq.com 1st version + */ +#include "stm32f10x.h" +#include + +#ifdef RT_USING_WDT + +static rt_err_t stm32f1_wdg_init(rt_watchdog_t *wdt) +{ + return RT_EOK; +} +static rt_err_t stm32f1_wdg_control(rt_watchdog_t *wdt, int cmd, void *arg) +{ + rt_uint32_t timeout_ms = 0; + rt_uint32_t timeout_pow = 1; + switch(cmd) + { + case RT_DEVICE_CTRL_WDT_SET_TIMEOUT: + timeout_ms = (rt_uint32_t) arg; + IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); + if(timeout_ms >= 13107) + { + if(timeout_ms >= 26214) + { + timeout_ms = 26214; + } + IWDG_SetPrescaler(IWDG_Prescaler_256); + timeout_pow = 256; + } + else if(timeout_ms >= 6553) + { + IWDG_SetPrescaler(IWDG_Prescaler_128); + timeout_pow = 128; + } + else if(timeout_ms >= 3276) + { + IWDG_SetPrescaler(IWDG_Prescaler_64); + timeout_pow = 64; + } + else if(timeout_ms >= 1638) + { + IWDG_SetPrescaler(IWDG_Prescaler_32); + timeout_pow = 32; + } + else if(timeout_ms >= 819) + { + IWDG_SetPrescaler(IWDG_Prescaler_16); + timeout_pow = 16; + } + else if(timeout_ms >= 409) + { + IWDG_SetPrescaler(IWDG_Prescaler_8); + timeout_pow = 8; + } + else + { + IWDG_SetPrescaler(IWDG_Prescaler_4); + timeout_pow = 4; + } + timeout_ms = timeout_ms * 40 / timeout_pow; + if(timeout_ms > 0xFFF) + { + timeout_ms = 0xFFF; + } + IWDG_SetReload(timeout_ms); + IWDG_ReloadCounter(); + break; + case RT_DEVICE_CTRL_WDT_GET_TIMEOUT: + timeout_pow = IWDG->PR; + if(timeout_pow > 6) + { + timeout_pow = 6; + } + timeout_pow = 1 << (2 + timeout_pow); + timeout_ms = IWDG->RLR; + timeout_ms &= 0xFFF; + *((rt_uint32_t *) arg) = timeout_ms * timeout_pow / 40; + break; + case RT_DEVICE_CTRL_WDT_KEEPALIVE: + IWDG_ReloadCounter(); + break; + case RT_DEVICE_CTRL_WDT_START: + IWDG_Enable(); + break; + default: + return RT_EIO; + } + return RT_EOK; +} + +static const struct rt_watchdog_ops stm32f1_wdg_pos = +{ + stm32f1_wdg_init, + stm32f1_wdg_control, +}; +static rt_watchdog_t stm32f1_wdg; + +int rt_hw_wdg_init(void) +{ + stm32f1_wdg.ops = &stm32f1_wdg_pos; + rt_hw_watchdog_register(&stm32f1_wdg, "wdg", 0, RT_NULL); + return RT_EOK; +} + +INIT_BOARD_EXPORT(rt_hw_wdg_init); + +#endif /*RT_USING_WDT*/ diff --git a/components/drivers/include/drivers/watchdog.h b/components/drivers/include/drivers/watchdog.h index 15ae5a1f449ad7e94170cba19f7a08c198c3c47b..5c74dc82be61af81dfc05e2115ef48519a652762 100644 --- a/components/drivers/include/drivers/watchdog.h +++ b/components/drivers/include/drivers/watchdog.h @@ -38,7 +38,7 @@ struct rt_watchdog_ops; struct rt_watchdog_device { struct rt_device parent; - struct rt_watchdog_ops *ops; + const struct rt_watchdog_ops *ops; }; typedef struct rt_watchdog_device rt_watchdog_t;