]> git.sur5r.net Git - freertos/blob
cc32739f0382143225a72463a2b4f477ea4a4d57
[freertos] /
1 /*\r
2  * @brief       Windowed Watchdog Timer Registers and functions\r
3  *\r
4  * @note\r
5  * Copyright(C) NXP Semiconductors, 2012\r
6  * All rights reserved.\r
7  *\r
8  * @par\r
9  * Software that is described herein is for illustrative purposes only\r
10  * which provides customers with programming information regarding the\r
11  * LPC products.  This software is supplied "AS IS" without any warranties of\r
12  * any kind, and NXP Semiconductors and its licensor disclaim any and\r
13  * all warranties, express or implied, including all implied warranties of\r
14  * merchantability, fitness for a particular purpose and non-infringement of\r
15  * intellectual property rights.  NXP Semiconductors assumes no responsibility\r
16  * or liability for the use of the software, conveys no license or rights under any\r
17  * patent, copyright, mask work right, or any other intellectual property rights in\r
18  * or to any products. NXP Semiconductors reserves the right to make changes\r
19  * in the software without notification. NXP Semiconductors also makes no\r
20  * representation or warranty that such application will be suitable for the\r
21  * specified use without further testing or modification.\r
22  *\r
23  * @par\r
24  * Permission to use, copy, modify, and distribute this software and its\r
25  * documentation is hereby granted, under NXP Semiconductors' and its\r
26  * licensor's relevant copyrights in the software, without fee, provided that it\r
27  * is used in conjunction with NXP Semiconductors microcontrollers.  This\r
28  * copyright, permission, and disclaimer notice must appear in all copies of\r
29  * this code.\r
30  */\r
31 \r
32 #ifndef __WWDT_001_H_\r
33 #define __WWDT_001_H_\r
34 \r
35 #include "sys_config.h"\r
36 #include "cmsis.h"\r
37 \r
38 #ifdef __cplusplus\r
39 extern "C" {\r
40 #endif\r
41 \r
42 /** @defgroup IP_WWDT_001 IP: WWDT register block and driver\r
43  * @ingroup IP_Drivers\r
44  * Windowed Watchdog\r
45  * @{\r
46  */\r
47 #if !defined(CHIP_LPC175X_6X) && !defined(CHIP_LPC11CXX) && !defined(CHIP_LPC1343)\r
48 #define WATCHDOG_WINDOW_SUPPORT\r
49 #endif\r
50 \r
51 #if defined(CHIP_LPC11AXX) || defined(CHIP_LPC11EXX) || defined(CHIP_LPC11UXX) || defined(CHIP_LPC175X_6X) \\r
52         || defined(CHIP_LPC1347)\r
53 #define WATCHDOG_CLKSEL_SUPPORT\r
54 #endif\r
55 \r
56 /**\r
57  * @brief Windowed Watchdog register block structure\r
58  */\r
59 typedef struct {                                /*!< WWDT Structure         */\r
60         __IO uint32_t  MOD;                     /*!< Watchdog mode register. This register contains the basic mode and status of the Watchdog Timer. */\r
61         __IO uint32_t  TC;                      /*!< Watchdog timer constant register. This register determines the time-out value. */\r
62         __O  uint32_t  FEED;            /*!< Watchdog feed sequence register. Writing 0xAA followed by 0x55 to this register reloads the Watchdog timer with the value contained in WDTC. */\r
63         __I  uint32_t  TV;                      /*!< Watchdog timer value register. This register reads out the current value of the Watchdog timer. */\r
64 #ifdef WATCHDOG_CLKSEL_SUPPORT\r
65         __IO uint32_t CLKSEL;           /*!< Watchdog clock select register. */\r
66 #else\r
67         __I  uint32_t  RESERVED0;\r
68 #endif\r
69 #ifdef WATCHDOG_WINDOW_SUPPORT\r
70         __IO uint32_t  WARNINT;         /*!< Watchdog warning interrupt register. This register contains the Watchdog warning interrupt compare value. */\r
71         __IO uint32_t  WINDOW;          /*!< Watchdog timer window register. This register contains the Watchdog window value. */\r
72 #endif\r
73 } IP_WWDT_001_T;\r
74 \r
75 /**\r
76  * @brief Watchdog Mode register definitions\r
77  */\r
78 /** Watchdog Mode Bitmask */\r
79 #define WWDT_WDMOD_BITMASK          ((uint32_t) 0x1F)\r
80 /** WWDT interrupt enable bit */\r
81 #define WWDT_WDMOD_WDEN             ((uint32_t) (1 << 0))\r
82 /** WWDT interrupt enable bit */\r
83 #define WWDT_WDMOD_WDRESET          ((uint32_t) (1 << 1))\r
84 /** WWDT time out flag bit */\r
85 #define WWDT_WDMOD_WDTOF            ((uint32_t) (1 << 2))\r
86 /** WDT Time Out flag bit */\r
87 #define WWDT_WDMOD_WDINT            ((uint32_t) (1 << 3))\r
88 #if !defined(CHIP_LPC175X_6X)\r
89 /** WWDT Protect flag bit */\r
90 #define WWDT_WDMOD_WDPROTECT        ((uint32_t) (1 << 4))\r
91 #endif\r
92 #if defined(WATCHDOG_CLKSEL_SUPPORT)\r
93 /**\r
94  * @brief Watchdog Timer Clock Source Selection register definitions\r
95  */\r
96 /** Clock source select bitmask */\r
97 #define WWDT_CLKSEL_BITMASK         ((uint32_t) 0x10000003)\r
98 /** Clock source select */\r
99 #define WWDT_CLKSEL_SOURCE(n)       ((uint32_t) (n & 0x03))\r
100 /** Lock the clock source selection */\r
101 #define WWDT_CLKSEL_LOCK            ((uint32_t) (1 << 31))\r
102 #endif /* defined(WATCHDOG_CLKSEL_SUPPORT) */\r
103 \r
104 /**\r
105  * @brief       Initialize the Watchdog Timer\r
106  * @param       pWWDT   : pointer to WWDT register block\r
107  * @return      None\r
108  */\r
109 void IP_WWDT_Init(IP_WWDT_001_T *pWWDT);\r
110 \r
111 /**\r
112  * @brief       De-initialize the Watchdog Timer\r
113  * @param       pWWDT   : pointer to WWDT register block\r
114  * @return      None\r
115  */\r
116 STATIC INLINE void IP_WWDT_DeInit(IP_WWDT_001_T *pWWDT)\r
117 {}\r
118 \r
119 /**\r
120  * @brief       Set WDT timeout constant value used for feed\r
121  * @param       pWWDT   : pointer to WWDT register block\r
122  * @param       timeout : WDT timeout in ticks\r
123  * @return      none\r
124  */\r
125 STATIC INLINE void IP_WWDT_SetTimeOut(IP_WWDT_001_T *pWWDT, uint32_t timeout)\r
126 {\r
127         pWWDT->TC = timeout;\r
128 }\r
129 \r
130 #if defined(WATCHDOG_CLKSEL_SUPPORT)\r
131 /**\r
132  * @brief       Clock selection for Watchdog Timer\r
133  * @param       pWWDT   : pointer to WWDT register block\r
134  * @param       src     : Clock source selection (Or-ed value of WWDT_CLKSEL_*)\r
135  * @return      none\r
136  */\r
137 STATIC INLINE void IP_WWDT_SelClockSource(IP_WWDT_001_T *pWWDT, uint32_t src)\r
138 {\r
139         pWWDT->CLKSEL = src & WWDT_CLKSEL_BITMASK;\r
140 }\r
141 \r
142 #endif /*WATCHDOG_CLKSEL_SUPPORT*/\r
143 \r
144 /**\r
145  * @brief       Feed watchdog timer\r
146  * @param       pWWDT   : pointer to WWDT register block\r
147  * @return      None\r
148  * @note        If this function isn't called, a watchdog timer warning will occur.\r
149  * After the warning, a timeout will occur if a feed has happened.\r
150  */\r
151 STATIC INLINE void IP_WWDT_Feed(IP_WWDT_001_T *pWWDT)\r
152 {\r
153         pWWDT->FEED = 0xAA;\r
154         pWWDT->FEED = 0x55;\r
155 }\r
156 \r
157 #if defined(WATCHDOG_WINDOW_SUPPORT)\r
158 /**\r
159  * @brief       Set WWDT warning interrupt\r
160  * @param       pWWDT   : pointer to WWDT register block\r
161  * @param       timeout : WDT warning in ticks, between 0 and 1023\r
162  * @return      None\r
163  * @note        This is the number of ticks after the watchdog interrupt that the\r
164  * warning interrupt will be generated.\r
165  */\r
166 STATIC INLINE void IP_WWDT_SetWarning(IP_WWDT_001_T *pWWDT, uint32_t timeout)\r
167 {\r
168         pWWDT->WARNINT = timeout;\r
169 }\r
170 \r
171 /**\r
172  * @brief       Set WWDT window time\r
173  * @param       pWWDT   : pointer to WWDT register block\r
174  * @param       timeout : WDT timeout in ticks\r
175  * @return      none\r
176  * @note        The watchdog timer must be fed between the timeout from the IP_WWDT_SetTimeOut()\r
177  * function and this function, with this function defining the last tick before the\r
178  * watchdog window interrupt occurs.\r
179  */\r
180 STATIC INLINE void IP_WWDT_SetWindow(IP_WWDT_001_T *pWWDT, uint32_t timeout)\r
181 {\r
182         pWWDT->WINDOW = timeout;\r
183 }\r
184 \r
185 #endif /* defined(WATCHDOG_WINDOW_SUPPORT) */\r
186 \r
187 /**\r
188  * @brief       Enable watchdog timer options\r
189  * @param       pWWDT   : pointer to WWDT register block\r
190  * @param       options : An or'ed set of options of values\r
191  *                                              WWDT_WDMOD_WDEN, WWDT_WDMOD_WDRESET, and WWDT_WDMOD_WDPROTECT\r
192  * @return      None\r
193  * @note        You can enable more than one option at once (ie, WWDT_WDMOD_WDRESET |\r
194  * WWDT_WDMOD_WDPROTECT), but use the WWDT_WDMOD_WDEN after all other options\r
195  * are set (or unset) with no other options.\r
196  */\r
197 STATIC INLINE void IP_WWDT_SetOption(IP_WWDT_001_T *pWWDT, uint32_t options)\r
198 {\r
199         pWWDT->MOD |= options;\r
200 }\r
201 \r
202 /**\r
203  * @brief       Disable/clear watchdog timer options\r
204  * @param       pWWDT   : pointer to WWDT register block\r
205  * @param       options : An or'ed set of options of values\r
206  *                                              WWDT_WDMOD_WDEN, WWDT_WDMOD_WDRESET, and WWDT_WDMOD_WDPROTECT\r
207  * @return      None\r
208  * @note        You can disable more than one option at once (ie, WWDT_WDMOD_WDRESET |\r
209  * WWDT_WDMOD_WDTOF).\r
210  */\r
211 STATIC INLINE void IP_WWDT_UnsetOption(IP_WWDT_001_T *pWWDT, uint32_t options)\r
212 {\r
213         pWWDT->MOD &= (~options) & WWDT_WDMOD_BITMASK;\r
214 }\r
215 \r
216 /**\r
217  * @brief       Enable WWDT activity\r
218  * @param       pWWDT   : pointer to WWDT register block\r
219  * @return      None\r
220  */\r
221 STATIC INLINE void IP_WWDT_Start(IP_WWDT_001_T *pWWDT)\r
222 {\r
223         IP_WWDT_SetOption(pWWDT, WWDT_WDMOD_WDEN);\r
224         IP_WWDT_Feed(pWWDT);\r
225 }\r
226 \r
227 /**\r
228  * @brief       Read WWDT status flag\r
229  * @param       pWWDT   : pointer to WWDT register block\r
230  * @return      Watchdog status, an Or'ed value of WWDT_WDMOD_*\r
231  */\r
232 STATIC INLINE uint32_t IP_WWDT_GetStatus(IP_WWDT_001_T *pWWDT)\r
233 {\r
234         return pWWDT->MOD;\r
235 }\r
236 \r
237 /**\r
238  * @brief       Clear WWDT interrupt status flags\r
239  * @param       pWWDT   : pointer to WWDT register block\r
240  * @param       status  : Or'ed value of status flag(s) that you want to clear, should be:\r
241  *              - WWDT_WDMOD_WDTOF: Clear watchdog timeout flag\r
242  *              - WWDT_WDMOD_WDINT: Clear watchdog warning flag\r
243  * @return      None\r
244  */\r
245 void IP_WWDT_ClearStatusFlag(IP_WWDT_001_T *pWWDT, uint32_t status);\r
246 \r
247 /**\r
248  * @brief       Get the current value of WDT\r
249  * @return      current value of WDT\r
250  */\r
251 STATIC INLINE uint32_t IP_WWDT_GetCurrentCount(IP_WWDT_001_T *pWWDT)\r
252 {\r
253         return pWWDT->TV;\r
254 }\r
255 \r
256 /**\r
257  * @}\r
258  */\r
259 \r
260 #ifdef __cplusplus\r
261 }\r
262 #endif\r
263 \r
264 #endif /* __WWDT_001_H_ */\r