fix based on https://gist.github.com/timbrom/1942280
[DSO138] / Libraries / STM32F10x_StdPeriph_Driver / src / stm32f10x_wwdg.c
1 /**\r
2   ******************************************************************************\r
3   * @file    stm32f10x_wwdg.c\r
4   * @author  MCD Application Team\r
5   * @version V3.3.0\r
6   * @date    04/16/2010\r
7   * @brief   This file provides all the WWDG firmware functions.\r
8   ******************************************************************************\r
9   * @copy\r
10   *\r
11   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
12   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE\r
13   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY\r
14   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING\r
15   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE\r
16   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
17   *\r
18   * <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>\r
19   */ \r
20 \r
21 /* Includes ------------------------------------------------------------------*/\r
22 #include "stm32f10x_wwdg.h"\r
23 #include "stm32f10x_rcc.h"\r
24 \r
25 /** @addtogroup STM32F10x_StdPeriph_Driver\r
26   * @{\r
27   */\r
28 \r
29 /** @defgroup WWDG \r
30   * @brief WWDG driver modules\r
31   * @{\r
32   */\r
33 \r
34 /** @defgroup WWDG_Private_TypesDefinitions\r
35   * @{\r
36   */\r
37 \r
38 /**\r
39   * @}\r
40   */\r
41 \r
42 /** @defgroup WWDG_Private_Defines\r
43   * @{\r
44   */\r
45 \r
46 /* ----------- WWDG registers bit address in the alias region ----------- */\r
47 #define WWDG_OFFSET       (WWDG_BASE - PERIPH_BASE)\r
48 \r
49 /* Alias word address of EWI bit */\r
50 #define CFR_OFFSET        (WWDG_OFFSET + 0x04)\r
51 #define EWI_BitNumber     0x09\r
52 #define CFR_EWI_BB        (PERIPH_BB_BASE + (CFR_OFFSET * 32) + (EWI_BitNumber * 4))\r
53 \r
54 /* --------------------- WWDG registers bit mask ------------------------ */\r
55 \r
56 /* CR register bit mask */\r
57 #define CR_WDGA_Set       ((uint32_t)0x00000080)\r
58 \r
59 /* CFR register bit mask */\r
60 #define CFR_WDGTB_Mask    ((uint32_t)0xFFFFFE7F)\r
61 #define CFR_W_Mask        ((uint32_t)0xFFFFFF80)\r
62 #define BIT_Mask          ((uint8_t)0x7F)\r
63 \r
64 /**\r
65   * @}\r
66   */\r
67 \r
68 /** @defgroup WWDG_Private_Macros\r
69   * @{\r
70   */\r
71 \r
72 /**\r
73   * @}\r
74   */\r
75 \r
76 /** @defgroup WWDG_Private_Variables\r
77   * @{\r
78   */\r
79 \r
80 /**\r
81   * @}\r
82   */\r
83 \r
84 /** @defgroup WWDG_Private_FunctionPrototypes\r
85   * @{\r
86   */\r
87 \r
88 /**\r
89   * @}\r
90   */\r
91 \r
92 /** @defgroup WWDG_Private_Functions\r
93   * @{\r
94   */\r
95 \r
96 /**\r
97   * @brief  Deinitializes the WWDG peripheral registers to their default reset values.\r
98   * @param  None\r
99   * @retval None\r
100   */\r
101 void WWDG_DeInit(void)\r
102 {\r
103   RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, ENABLE);\r
104   RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, DISABLE);\r
105 }\r
106 \r
107 /**\r
108   * @brief  Sets the WWDG Prescaler.\r
109   * @param  WWDG_Prescaler: specifies the WWDG Prescaler.\r
110   *   This parameter can be one of the following values:\r
111   *     @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1\r
112   *     @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2\r
113   *     @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4\r
114   *     @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8\r
115   * @retval None\r
116   */\r
117 void WWDG_SetPrescaler(uint32_t WWDG_Prescaler)\r
118 {\r
119   uint32_t tmpreg = 0;\r
120   /* Check the parameters */\r
121   assert_param(IS_WWDG_PRESCALER(WWDG_Prescaler));\r
122   /* Clear WDGTB[1:0] bits */\r
123   tmpreg = WWDG->CFR & CFR_WDGTB_Mask;\r
124   /* Set WDGTB[1:0] bits according to WWDG_Prescaler value */\r
125   tmpreg |= WWDG_Prescaler;\r
126   /* Store the new value */\r
127   WWDG->CFR = tmpreg;\r
128 }\r
129 \r
130 /**\r
131   * @brief  Sets the WWDG window value.\r
132   * @param  WindowValue: specifies the window value to be compared to the downcounter.\r
133   *   This parameter value must be lower than 0x80.\r
134   * @retval None\r
135   */\r
136 void WWDG_SetWindowValue(uint8_t WindowValue)\r
137 {\r
138   __IO uint32_t tmpreg = 0;\r
139 \r
140   /* Check the parameters */\r
141   assert_param(IS_WWDG_WINDOW_VALUE(WindowValue));\r
142   /* Clear W[6:0] bits */\r
143 \r
144   tmpreg = WWDG->CFR & CFR_W_Mask;\r
145 \r
146   /* Set W[6:0] bits according to WindowValue value */\r
147   tmpreg |= WindowValue & (uint32_t) BIT_Mask;\r
148 \r
149   /* Store the new value */\r
150   WWDG->CFR = tmpreg;\r
151 }\r
152 \r
153 /**\r
154   * @brief  Enables the WWDG Early Wakeup interrupt(EWI).\r
155   * @param  None\r
156   * @retval None\r
157   */\r
158 void WWDG_EnableIT(void)\r
159 {\r
160   *(__IO uint32_t *) CFR_EWI_BB = (uint32_t)ENABLE;\r
161 }\r
162 \r
163 /**\r
164   * @brief  Sets the WWDG counter value.\r
165   * @param  Counter: specifies the watchdog counter value.\r
166   *   This parameter must be a number between 0x40 and 0x7F.\r
167   * @retval None\r
168   */\r
169 void WWDG_SetCounter(uint8_t Counter)\r
170 {\r
171   /* Check the parameters */\r
172   assert_param(IS_WWDG_COUNTER(Counter));\r
173   /* Write to T[6:0] bits to configure the counter value, no need to do\r
174      a read-modify-write; writing a 0 to WDGA bit does nothing */\r
175   WWDG->CR = Counter & BIT_Mask;\r
176 }\r
177 \r
178 /**\r
179   * @brief  Enables WWDG and load the counter value.                  \r
180   * @param  Counter: specifies the watchdog counter value.\r
181   *   This parameter must be a number between 0x40 and 0x7F.\r
182   * @retval None\r
183   */\r
184 void WWDG_Enable(uint8_t Counter)\r
185 {\r
186   /* Check the parameters */\r
187   assert_param(IS_WWDG_COUNTER(Counter));\r
188   WWDG->CR = CR_WDGA_Set | Counter;\r
189 }\r
190 \r
191 /**\r
192   * @brief  Checks whether the Early Wakeup interrupt flag is set or not.\r
193   * @param  None\r
194   * @retval The new state of the Early Wakeup interrupt flag (SET or RESET)\r
195   */\r
196 FlagStatus WWDG_GetFlagStatus(void)\r
197 {\r
198   return (FlagStatus)(WWDG->SR);\r
199 }\r
200 \r
201 /**\r
202   * @brief  Clears Early Wakeup interrupt flag.\r
203   * @param  None\r
204   * @retval None\r
205   */\r
206 void WWDG_ClearFlag(void)\r
207 {\r
208   WWDG->SR = (uint32_t)RESET;\r
209 }\r
210 \r
211 /**\r
212   * @}\r
213   */\r
214 \r
215 /**\r
216   * @}\r
217   */\r
218 \r
219 /**\r
220   * @}\r
221   */\r
222 \r
223 /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/\r