HPM SDK
HPMicro Software Development Kit
hpm_wdg_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2023,2025 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_WDG_DRV_H
9 #define HPM_WDG_DRV_H
10 
19 #include "hpm_common.h"
20 #include "hpm_wdg_regs.h"
21 
25 typedef enum reset_interval_enum {
37 
61 
65 typedef enum wdg_clksrc_enum {
70 
75 typedef struct wdg_control_struct {
78  bool reset_enable;
81  bool wdg_enable;
83 
84 #define WDG_WRITE_ENABLE_MAGIC_NUM (0x5AA5UL)
85 #define WDG_RESTART_MAGIC_NUM (0xCAFEUL)
87 #define WDG_EXT_CLK_FREQ (32768UL)
88 #define PWDG_PERIPH_CLK_FREQ (24000000UL)
90 #ifdef __cplusplus
91 extern "C" {
92 #endif
93 
99 static inline void wdg_write_enable(WDG_Type *base)
100 {
102 }
103 
109 static inline void wdg_enable(WDG_Type *base)
110 {
111  wdg_write_enable(base);
112  base->CTRL |= WDG_CTRL_EN_MASK;
113 }
114 
120 static inline void wdg_disable(WDG_Type *base)
121 {
122  wdg_write_enable(base);
123  base->CTRL &= ~WDG_CTRL_EN_MASK;
124 }
125 
131 static inline void wdg_reset_enable(WDG_Type *base)
132 {
133  wdg_write_enable(base);
134  base->CTRL |= WDG_CTRL_RSTEN_MASK;
135 }
136 
142 static inline void wdg_reset_disable(WDG_Type *base)
143 {
144  wdg_write_enable(base);
145  base->CTRL &= ~WDG_CTRL_RSTEN_MASK;
146 }
147 
148 
154 static inline void wdg_interrupt_enable(WDG_Type *base)
155 {
156  wdg_write_enable(base);
157  base->CTRL |= WDG_CTRL_INTEN_MASK;
158 }
159 
165 static inline void wdg_interrupt_disable(WDG_Type *base)
166 {
167  wdg_write_enable(base);
168  base->CTRL &= ~WDG_CTRL_INTEN_MASK;
169 }
170 
179 static inline void wdg_clksrc_select(WDG_Type *base, wdg_clksrc_t clksrc)
180 {
181  if (clksrc == wdg_clksrc_extclk) {
182  base->CTRL &= ~WDG_CTRL_CLKSEL_MASK;
183  } else {
184  base->CTRL |= WDG_CTRL_CLKSEL_MASK;
185  }
186 }
187 
193 static inline void wdg_restart(WDG_Type *base)
194 {
195  wdg_write_enable(base);
197 }
198 
205 static inline uint32_t wdg_get_status(WDG_Type *base)
206 {
207  return base->ST;
208 }
209 
216 static inline void wdg_clear_status(WDG_Type *base, uint32_t status_mask)
217 {
218  base->ST = status_mask;
219 }
220 
228 hpm_stat_t wdg_init(WDG_Type *base, wdg_control_t *wdg_ctrl);
229 
238 reset_interval_t wdg_convert_reset_interval_from_us(const uint32_t src_freq, const uint32_t reset_us);
239 
248  uint64_t wdg_convert_interrupt_interval_to_us(const uint32_t src_freq, interrupt_interval_t interval);
249 
258 uint32_t wdg_convert_reset_interval_to_us(const uint32_t src_freq, reset_interval_t interval);
259 
268 interrupt_interval_t wdg_convert_interrupt_interval_from_us(const uint32_t src_freq, uint32_t interval_us);
269 
277 uint64_t wdg_get_interrupt_interval_in_us(WDG_Type *base, const uint32_t src_freq);
278 
286 uint64_t wdg_get_total_reset_interval_in_us(WDG_Type *base, const uint32_t src_freq);
287 
288 #ifdef __cplusplus
289 }
290 #endif
291 
296 #endif /* HPM_WDG_DRV_H */
#define WDG_CTRL_RSTEN_MASK
Definition: hpm_wdg_regs.h:73
#define WDG_CTRL_CLKSEL_MASK
Definition: hpm_wdg_regs.h:97
#define WDG_CTRL_EN_MASK
Definition: hpm_wdg_regs.h:109
#define WDG_CTRL_INTEN_MASK
Definition: hpm_wdg_regs.h:85
uint32_t hpm_stat_t
Definition: hpm_common.h:135
reset_interval_enum
WDG Reset Interval definitions.
Definition: hpm_wdg_drv.h:25
static void wdg_reset_disable(WDG_Type *base)
WDG reset disable function.
Definition: hpm_wdg_drv.h:142
static void wdg_interrupt_enable(WDG_Type *base)
WDG interrupt enable function.
Definition: hpm_wdg_drv.h:154
static void wdg_enable(WDG_Type *base)
WDG Enable function.
Definition: hpm_wdg_drv.h:109
#define WDG_WRITE_ENABLE_MAGIC_NUM
Definition: hpm_wdg_drv.h:84
enum wdg_clksrc_enum wdg_clksrc_t
WDG clock source definitions.
wdg_clksrc_enum
WDG clock source definitions.
Definition: hpm_wdg_drv.h:65
static void wdg_write_enable(WDG_Type *base)
WDG write enable function.
Definition: hpm_wdg_drv.h:99
uint64_t wdg_get_interrupt_interval_in_us(WDG_Type *base, const uint32_t src_freq)
Get Actual WDG Interrupt Interval in terms of microseconds.
Definition: hpm_wdg_drv.c:166
interrupt_interval_enum
WDG Interrupt interval definitions.
Definition: hpm_wdg_drv.h:41
static void wdg_clksrc_select(WDG_Type *base, wdg_clksrc_t clksrc)
WDG Clock Source selection function.
Definition: hpm_wdg_drv.h:179
reset_interval_t wdg_convert_reset_interval_from_us(const uint32_t src_freq, const uint32_t reset_us)
Convert the Reset interval value based on the WDG source clock frequency and the expected reset inter...
Definition: hpm_wdg_drv.c:94
hpm_stat_t wdg_init(WDG_Type *base, wdg_control_t *wdg_ctrl)
WDG initialization function.
Definition: hpm_wdg_drv.c:58
#define WDG_RESTART_MAGIC_NUM
Definition: hpm_wdg_drv.h:85
uint64_t wdg_get_total_reset_interval_in_us(WDG_Type *base, const uint32_t src_freq)
Get Actual WDG Reset Interval in terms of microseconds.
Definition: hpm_wdg_drv.c:178
enum interrupt_interval_enum interrupt_interval_t
WDG Interrupt interval definitions.
static void wdg_interrupt_disable(WDG_Type *base)
WDG interrupt disable function.
Definition: hpm_wdg_drv.h:165
static void wdg_disable(WDG_Type *base)
WDG Disable function.
Definition: hpm_wdg_drv.h:120
static void wdg_restart(WDG_Type *base)
WDG restart function.
Definition: hpm_wdg_drv.h:193
static void wdg_clear_status(WDG_Type *base, uint32_t status_mask)
WDG clear status function.
Definition: hpm_wdg_drv.h:216
interrupt_interval_t wdg_convert_interrupt_interval_from_us(const uint32_t src_freq, uint32_t interval_us)
Convert the interrupt interval value based on the WDG source clock frequency and the expected interru...
Definition: hpm_wdg_drv.c:116
uint32_t wdg_convert_reset_interval_to_us(const uint32_t src_freq, reset_interval_t interval)
Convert the Reset interval value based on the WDG source clock frequency and the expected reset inter...
Definition: hpm_wdg_drv.c:152
struct wdg_control_struct wdg_control_t
WDG Control configuration structure.
static uint32_t wdg_get_status(WDG_Type *base)
WDG Get Status function.
Definition: hpm_wdg_drv.h:205
enum reset_interval_enum reset_interval_t
WDG Reset Interval definitions.
static void wdg_reset_enable(WDG_Type *base)
WDG reset enable function.
Definition: hpm_wdg_drv.h:131
uint64_t wdg_convert_interrupt_interval_to_us(const uint32_t src_freq, interrupt_interval_t interval)
Convert the interrupt interval value based on the WDG source clock frequency and the expected interru...
Definition: hpm_wdg_drv.c:136
@ reset_interval_max
Definition: hpm_wdg_drv.h:34
@ reset_interval_clock_period_mult_256
Definition: hpm_wdg_drv.h:27
@ reset_interval_clock_period_mult_8k
Definition: hpm_wdg_drv.h:32
@ reset_interval_clock_period_mult_1k
Definition: hpm_wdg_drv.h:29
@ reset_interval_clock_period_mult_16k
Definition: hpm_wdg_drv.h:33
@ reset_interval_clock_period_mult_512
Definition: hpm_wdg_drv.h:28
@ reset_interval_out_of_range
Definition: hpm_wdg_drv.h:35
@ reset_interval_clock_period_mult_128
Definition: hpm_wdg_drv.h:26
@ reset_interval_clock_period_mult_2k
Definition: hpm_wdg_drv.h:30
@ reset_interval_clock_period_mult_4k
Definition: hpm_wdg_drv.h:31
@ wdg_clksrc_pclk
Definition: hpm_wdg_drv.h:67
@ wdg_clksrc_extclk
Definition: hpm_wdg_drv.h:66
@ wdg_clksrc_max
Definition: hpm_wdg_drv.h:68
@ interrupt_interval_out_of_range
Definition: hpm_wdg_drv.h:59
@ interrupt_interval_clock_period_multi_512m
Definition: hpm_wdg_drv.h:56
@ interrupt_interval_clock_period_multi_2m
Definition: hpm_wdg_drv.h:52
@ interrupt_interval_clock_period_multi_256
Definition: hpm_wdg_drv.h:43
@ interrupt_interval_clock_period_multi_2k
Definition: hpm_wdg_drv.h:45
@ interrupt_interval_clock_period_multi_512k
Definition: hpm_wdg_drv.h:51
@ interrupt_interval_clock_period_multi_1k
Definition: hpm_wdg_drv.h:44
@ interrupt_interval_clock_period_multi_16k
Definition: hpm_wdg_drv.h:48
@ interrupt_interval_clock_period_multi_8k
Definition: hpm_wdg_drv.h:47
@ interrupt_interval_clock_period_multi_2g
Definition: hpm_wdg_drv.h:57
@ interrupt_interval_clock_period_multi_128k
Definition: hpm_wdg_drv.h:50
@ interrupt_interval_clock_period_multi_128m
Definition: hpm_wdg_drv.h:55
@ interrupt_interval_clock_period_multi_32k
Definition: hpm_wdg_drv.h:49
@ interrupt_interval_clock_period_multi_4k
Definition: hpm_wdg_drv.h:46
@ interrupt_interval_max
Definition: hpm_wdg_drv.h:58
@ interrupt_interval_clock_period_multi_8m
Definition: hpm_wdg_drv.h:53
@ interrupt_interval_clock_period_multi_64
Definition: hpm_wdg_drv.h:42
@ interrupt_interval_clock_period_multi_32m
Definition: hpm_wdg_drv.h:54
Definition: hpm_wdg_regs.h:12
__RW uint32_t CTRL
Definition: hpm_wdg_regs.h:14
__W uint32_t WREN
Definition: hpm_wdg_regs.h:16
__W uint32_t RESTART
Definition: hpm_wdg_regs.h:15
__W uint32_t ST
Definition: hpm_wdg_regs.h:17
WDG Control configuration structure.
Definition: hpm_wdg_drv.h:75
reset_interval_t reset_interval
Definition: hpm_wdg_drv.h:76
interrupt_interval_t interrupt_interval
Definition: hpm_wdg_drv.h:77
bool reset_enable
Definition: hpm_wdg_drv.h:78
bool interrupt_enable
Definition: hpm_wdg_drv.h:79
bool wdg_enable
Definition: hpm_wdg_drv.h:81
wdg_clksrc_t clksrc
Definition: hpm_wdg_drv.h:80