1 ////////////////////////////////////////////////////////////////////////////////
2 /// @file     hal_iwdg.c
3 /// @author   AE TEAM
4 /// @brief    THIS FILE PROVIDES ALL THE IWDG FIRMWARE FUNCTIONS.
5 ////////////////////////////////////////////////////////////////////////////////
6 /// @attention
7 ///
8 /// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
9 /// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
10 /// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
11 /// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
12 /// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
13 /// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
14 ///
15 /// <H2><CENTER>&COPY; COPYRIGHT MINDMOTION </CENTER></H2>
16 ////////////////////////////////////////////////////////////////////////////////
17 
18 // Define to prevent recursive inclusion
19 #define _HAL_IWDG_C_
20 
21 // Files includes
22 #include "hal_iwdg.h"
23 
24 ////////////////////////////////////////////////////////////////////////////////
25 /// @addtogroup MM32_Hardware_Abstract_Layer
26 /// @{
27 
28 ////////////////////////////////////////////////////////////////////////////////
29 /// @addtogroup IWDG_HAL
30 /// @{
31 
32 ////////////////////////////////////////////////////////////////////////////////
33 /// @addtogroup IWDG_Exported_Functions
34 /// @{
35 
36 ////////////////////////////////////////////////////////////////////////////////
37 /// @brief  Enables or disables write access to IWDG_PR and IWDG_RLR
38 ///   registers.
39 /// @param  write_access: new state of write access to IWDG_PR and
40 ///   IWDG_RLR registers.
41 ///   This parameter can be one of the following values:
42 /// @arg IWDG_WriteAccess_Enable: Enable write access to
43 ///   IWDG_PR and IWDG_RLR registers
44 /// @arg IWDG_WriteAccess_Disable: Disable write access to
45 ///   IWDG_PR and IWDG_RLR registers
46 /// @retval None.
47 ////////////////////////////////////////////////////////////////////////////////
IWDG_WriteAccessCmd(u16 write_access)48 void IWDG_WriteAccessCmd(u16 write_access)
49 {
50     IWDG->KR = write_access;
51 }
52 
53 ////////////////////////////////////////////////////////////////////////////////
54 /// @brief  Sets IWDG Prescaler value.
55 /// @param  prescaler: specifies the IWDG Prescaler value.
56 ///         This parameter can be one of the following values:
57 /// @arg    IWDG_Prescaler_4: IWDG prescaler set to 4
58 /// @arg    IWDG_Prescaler_8: IWDG prescaler set to 8
59 /// @arg    IWDG_Prescaler_16: IWDG prescaler set to 16
60 /// @arg    IWDG_Prescaler_32: IWDG prescaler set to 32
61 /// @arg    IWDG_Prescaler_64: IWDG prescaler set to 64
62 /// @arg    IWDG_Prescaler_128: IWDG prescaler set to 128
63 /// @arg    IWDG_Prescaler_256: IWDG prescaler set to 256
64 /// @retval None.
65 ////////////////////////////////////////////////////////////////////////////////
IWDG_SetPrescaler(u8 prescaler)66 void IWDG_SetPrescaler(u8 prescaler)
67 {
68     IWDG->PR = prescaler;
69     PVU_CheckStatus();
70 }
71 
72 ////////////////////////////////////////////////////////////////////////////////
73 /// @brief  Set IWDG reload value.
74 /// @param  reload: specifies the IWDG reload value.
75 ///         This parameter must be a number between 0 and 0x0FFF.
76 /// @retval None.
77 ////////////////////////////////////////////////////////////////////////////////
IWDG_SetReload(u16 reload)78 void IWDG_SetReload(u16 reload)
79 {
80     IWDG->RLR = reload;
81     RVU_CheckStatus();
82 }
83 
84 ////////////////////////////////////////////////////////////////////////////////
85 /// @brief  Get IWDG reload value.
86 /// @param  None.
87 /// @retval reload: specifies the IWDG reload value.
88 ////////////////////////////////////////////////////////////////////////////////
IWDG_GetReload(void)89 u32 IWDG_GetReload(void)
90 {
91     return IWDG->RLR;
92 }
93 
94 ////////////////////////////////////////////////////////////////////////////////
95 /// @brief  Reloads IWDG counter with value defined in the reload register
96 ///   (write access to IWDG_PR and IWDG_RLR registers disabled).
97 /// @param  None.
98 /// @retval None.
99 ////////////////////////////////////////////////////////////////////////////////
IWDG_ReloadCounter(void)100 void IWDG_ReloadCounter(void)
101 {
102     IWDG->KR = KR_KEY_Reload;
103 }
104 
105 ////////////////////////////////////////////////////////////////////////////////
106 /// @brief  Enables IWDG (write access to IWDG_PR and IWDG_RLR registers
107 ///         disabled).
108 /// @param  None.
109 /// @retval None.
110 ////////////////////////////////////////////////////////////////////////////////
IWDG_Enable(void)111 void IWDG_Enable(void)
112 {
113     IWDG->KR = KR_KEY_Enable;
114 }
115 
116 ////////////////////////////////////////////////////////////////////////////////
117 /// @brief  Checks whether the specified IWDG flag is set or not.
118 /// @param  flag: specifies the flag to check.
119 ///   This parameter can be one of the following values:
120 /// @arg    IWDG_FLAG_PVU: Prescaler Value Update on going
121 /// @arg    IWDG_FLAG_RVU: reload Value Update on going
122 /// @retval The new state of flag (SET or RESET).
123 ////////////////////////////////////////////////////////////////////////////////
IWDG_GetFlagStatus(u16 flag)124 FlagStatus IWDG_GetFlagStatus(u16 flag)
125 {
126     return ((IWDG->SR & flag) != (u32)RESET) ? SET : RESET;
127 }
128 
129 ////////////////////////////////////////////////////////////////////////////////
130 /// @brief  Checks prescaler value has been updated.
131 /// @param  None.
132 /// @retval None.
133 ////////////////////////////////////////////////////////////////////////////////
PVU_CheckStatus(void)134 void PVU_CheckStatus(void)
135 {
136     while (IWDG_GetFlagStatus(IWDG_FLAG_PVU) == SET);
137 }
138 
139 ////////////////////////////////////////////////////////////////////////////////
140 /// @brief  Checks count relead value has been updated.
141 /// @param  None.
142 /// @retval None.
143 ////////////////////////////////////////////////////////////////////////////////
RVU_CheckStatus(void)144 void RVU_CheckStatus(void)
145 {
146     while (IWDG_GetFlagStatus(IWDG_FLAG_RVU) == SET);
147 }
148 
149 ////////////////////////////////////////////////////////////////////////////////
150 /// @brief  IWDG overflow configuration.
151 /// @param  overflow_config
152 /// @arg    IWDG_Overflow_Interrupt: Interrupt after overflow.
153 /// @arg    IWDG_Overflow_Reset:     Reset after overflow.
154 /// @retval None.
155 ////////////////////////////////////////////////////////////////////////////////
IWDG_OverflowConfig(IWDGOverflowConfig_TypeDef overflow_config)156 void IWDG_OverflowConfig(IWDGOverflowConfig_TypeDef overflow_config)
157 {
158     IWDG->CR &= ~IWDG_CR_IRQSEL;
159     IWDG->CR |= overflow_config;
160 }
161 
162 ////////////////////////////////////////////////////////////////////////////////
163 /// @brief  Clear interrupt flag
164 /// @param  None.
165 /// @retval None.
166 ////////////////////////////////////////////////////////////////////////////////
IWDG_ClearITPendingBit(void)167 void IWDG_ClearITPendingBit(void)
168 {
169     IWDG->CR |= IWDG_CR_IRQCLR;//write 1 clear interrupt Flag
170 }
171 
172 ////////////////////////////////////////////////////////////////////////////////
173 /// @brief  Clear interrupt flag
174 /// @param  None.
175 /// @retval None.
176 ////////////////////////////////////////////////////////////////////////////////
IWDG_ClearIT(void)177 void IWDG_ClearIT(void)
178 {
179     IWDG->CR |= IWDG_CR_IRQCLR;//write 1 clear interrupt Flag
180 }
181 
182 ////////////////////////////////////////////////////////////////////////////////
183 /// @brief  Enable IWDG interrupt function
184 /// @param  None.
185 /// @retval None.
186 ////////////////////////////////////////////////////////////////////////////////
IWDG_EnableIT(void)187 void IWDG_EnableIT(void)
188 {
189     IWDG->CR |= IWDG_CR_IRQSEL;
190 }
191 
192 ////////////////////////////////////////////////////////////////////////////////
193 /// @brief  Disable IWDG interrupt function
194 /// @param  None.
195 /// @retval None.
196 ////////////////////////////////////////////////////////////////////////////////
IWDG_Reset(void)197 void IWDG_Reset(void)
198 {
199     IWDG->CR &= ~IWDG_CR_IRQSEL;
200 }
201 
202 
203 
204 /// @}
205 
206 /// @}
207 
208 /// @}
209