Subversion Repositories FuelGauge

Rev

Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2 Rev 6
Line 14... Line 14...
14
  ==============================================================================
14
  ==============================================================================
15
  [..]
15
  [..]
16
    (+) The IWDG can be started by either software or hardware (configurable
16
    (+) The IWDG can be started by either software or hardware (configurable
17
        through option byte).
17
        through option byte).
18
 
18
 
19
    (+) The IWDG is clocked by Low-Speed clock (LSI) and thus stays active even
19
    (+) The IWDG is clocked by the Low-Speed Internal clock (LSI) and thus stays
20
        if the main clock fails.
20
        active even if the main clock fails.
21
 
21
 
22
    (+) Once the IWDG is started, the LSI is forced ON and both can not be
22
    (+) Once the IWDG is started, the LSI is forced ON and both cannot be
23
        disabled. The counter starts counting down from the reset value (0xFFF).
23
        disabled. The counter starts counting down from the reset value (0xFFF).
24
        When it reaches the end of count value (0x000) a reset signal is
24
        When it reaches the end of count value (0x000) a reset signal is
25
        generated (IWDG reset).
25
        generated (IWDG reset).
26
 
26
 
27
    (+) Whenever the key value 0x0000 AAAA is written in the IWDG_KR register,
27
    (+) Whenever the key value 0x0000 AAAA is written in the IWDG_KR register,
28
        the IWDG_RLR value is reloaded in the counter and the watchdog reset is
28
        the IWDG_RLR value is reloaded into the counter and the watchdog reset
29
        prevented.
29
        is prevented.
30
 
30
 
31
    (+) The IWDG is implemented in the VDD voltage domain that is still functional
31
    (+) The IWDG is implemented in the VDD voltage domain that is still functional
32
        in STOP and STANDBY mode (IWDG reset can wake-up from STANDBY).
32
        in STOP and STANDBY mode (IWDG reset can wake up the CPU from STANDBY).
33
        IWDGRST flag in RCC_CSR register can be used to inform when an IWDG
33
        IWDGRST flag in RCC_CSR register can be used to inform when an IWDG
34
        reset occurs.
34
        reset occurs.
35
 
35
 
36
    (+) Debug mode : When the microcontroller enters debug mode (core halted),
36
    (+) Debug mode: When the microcontroller enters debug mode (core halted),
37
        the IWDG counter either continues to work normally or stops, depending
37
        the IWDG counter either continues to work normally or stops, depending
38
        on DBG_IWDG_STOP configuration bit in DBG module, accessible through
38
        on DBG_IWDG_STOP configuration bit in DBG module, accessible through
39
        __HAL_DBGMCU_FREEZE_IWDG() and __HAL_DBGMCU_UNFREEZE_IWDG() macros.
39
        __HAL_DBGMCU_FREEZE_IWDG() and __HAL_DBGMCU_UNFREEZE_IWDG() macros.
40
 
40
 
41
    [..] Min-max timeout value @32KHz (LSI): ~125us / ~32.7s
41
    [..] Min-max timeout value @32KHz (LSI): ~125us / ~32.7s
42
         The IWDG timeout may vary due to LSI frequency dispersion. STM32F0xx
42
         The IWDG timeout may vary due to LSI clock frequency dispersion.
43
         devices provide the capability to measure the LSI frequency (LSI clock
43
         STM32F0xx devices provide the capability to measure the LSI clock
44
         connected internally to TIM16 CH1 input capture). The measured value
44
         frequency (LSI clock is internally connected to TIM16 CH1 input capture).
45
         can be used to have an IWDG timeout with an acceptable accuracy.
45
         The measured value can be used to have an IWDG timeout with an
-
 
46
         acceptable accuracy.
-
 
47
 
-
 
48
    [..] Default timeout value (necessary for IWDG_SR status register update):
-
 
49
         Constant LSI_VALUE is defined based on the nominal LSI clock frequency.
-
 
50
         This frequency being subject to variations as mentioned above, the
-
 
51
         default timeout value (defined through constant HAL_IWDG_DEFAULT_TIMEOUT
-
 
52
         below) may become too short or too long.
-
 
53
         In such cases, this default timeout value can be tuned by redefining
-
 
54
         the constant LSI_VALUE at user-application level (based, for instance,
-
 
55
         on the measured LSI clock frequency as explained above).
46
 
56
 
47
                     ##### How to use this driver #####
57
                     ##### How to use this driver #####
48
  ==============================================================================
58
  ==============================================================================
49
  [..]
59
  [..]
50
    (#) Use IWDG using HAL_IWDG_Init() function to :
60
    (#) Use IWDG using HAL_IWDG_Init() function to :
Line 53... Line 63...
53
      (++) Enable write access to configuration registers:
63
      (++) Enable write access to configuration registers:
54
          IWDG_PR, IWDG_RLR and IWDG_WINR.
64
          IWDG_PR, IWDG_RLR and IWDG_WINR.
55
      (++) Configure the IWDG prescaler and counter reload value. This reload
65
      (++) Configure the IWDG prescaler and counter reload value. This reload
56
           value will be loaded in the IWDG counter each time the watchdog is
66
           value will be loaded in the IWDG counter each time the watchdog is
57
           reloaded, then the IWDG will start counting down from this value.
67
           reloaded, then the IWDG will start counting down from this value.
58
      (++) Wait for status flags to be reset.
-
 
59
      (++) Depending on window parameter:
68
      (++) Depending on window parameter:
60
        (+++) If Window Init parameter is same as Window register value,
69
        (+++) If Window Init parameter is same as Window register value,
61
             nothing more is done but reload counter value in order to exit
70
             nothing more is done but reload counter value in order to exit
62
             function with exact time base.
71
             function with exact time base.
63
        (+++) Else modify Window register. This will automatically reload
72
        (+++) Else modify Window register. This will automatically reload
64
             watchdog counter.
73
             watchdog counter.
-
 
74
      (++) Wait for status flags to be reset.
65
 
75
 
66
    (#) Then the application program must refresh the IWDG counter at regular
76
    (#) Then the application program must refresh the IWDG counter at regular
67
        intervals during normal operation to prevent an MCU reset, using
77
        intervals during normal operation to prevent an MCU reset, using
68
        HAL_IWDG_Refresh() function.
78
        HAL_IWDG_Refresh() function.
69
 
79
 
Line 106... Line 116...
106
/* Private typedef -----------------------------------------------------------*/
116
/* Private typedef -----------------------------------------------------------*/
107
/* Private define ------------------------------------------------------------*/
117
/* Private define ------------------------------------------------------------*/
108
/** @defgroup IWDG_Private_Defines IWDG Private Defines
118
/** @defgroup IWDG_Private_Defines IWDG Private Defines
109
  * @{
119
  * @{
110
  */
120
  */
111
/* Status register need 5 RC LSI divided by prescaler clock to be updated. With
121
/* Status register needs up to 5 LSI clock periods divided by the clock
112
   higher prescaler (256), and according to LSI variation, we need to wait at
122
   prescaler to be updated. The number of LSI clock periods is upper-rounded to
-
 
123
   6 for the timeout value calculation.
-
 
124
   The timeout value is calculated using the highest prescaler (256) and
-
 
125
   the LSI_VALUE constant. The value of this constant can be changed by the user
-
 
126
   to take into account possible LSI clock period variations.
-
 
127
   The timeout value is multiplied by 1000 to be converted in milliseconds.
-
 
128
   LSI startup time is also considered here by adding LSI_STARTUP_TIMEOUT
113
   least 6 cycles so 48 ms. */
129
   converted in milliseconds. */
114
#define HAL_IWDG_DEFAULT_TIMEOUT            48u
130
#define HAL_IWDG_DEFAULT_TIMEOUT        (((6UL * 256UL * 1000UL) / LSI_VALUE) + ((LSI_STARTUP_TIME / 1000UL) + 1UL))
-
 
131
#define IWDG_KERNEL_UPDATE_FLAGS        (IWDG_SR_WVU | IWDG_SR_RVU | IWDG_SR_PVU)
115
/**
132
/**
116
  * @}
133
  * @}
117
  */
134
  */
118
 
135
 
119
/* Private macro -------------------------------------------------------------*/
136
/* Private macro -------------------------------------------------------------*/
Line 180... Line 197...
180
 
197
 
181
  /* Check pending flag, if previous update not done, return timeout */
198
  /* Check pending flag, if previous update not done, return timeout */
182
  tickstart = HAL_GetTick();
199
  tickstart = HAL_GetTick();
183
 
200
 
184
  /* Wait for register to be updated */
201
  /* Wait for register to be updated */
185
  while (hiwdg->Instance->SR != 0x00u)
202
  while ((hiwdg->Instance->SR & IWDG_KERNEL_UPDATE_FLAGS) != 0x00u)
186
  {
203
  {
187
    if ((HAL_GetTick() - tickstart) > HAL_IWDG_DEFAULT_TIMEOUT)
204
    if ((HAL_GetTick() - tickstart) > HAL_IWDG_DEFAULT_TIMEOUT)
188
    {
205
    {
-
 
206
      if ((hiwdg->Instance->SR & IWDG_KERNEL_UPDATE_FLAGS) != 0x00u)
-
 
207
      {
189
      return HAL_TIMEOUT;
208
        return HAL_TIMEOUT;
-
 
209
      }
190
    }
210
    }
191
  }
211
  }
192
 
212
 
193
  /* If window parameter is different than current value, modify window
213
  /* If window parameter is different than current value, modify window
194
  register */
214
  register */
Line 207... Line 227...
207
 
227
 
208
  /* Return function status */
228
  /* Return function status */
209
  return HAL_OK;
229
  return HAL_OK;
210
}
230
}
211
 
231
 
-
 
232
 
212
/**
233
/**
213
  * @}
234
  * @}
214
  */
235
  */
215
 
236
 
216
 
237
 
Line 226... Line 247...
226
 
247
 
227
@endverbatim
248
@endverbatim
228
  * @{
249
  * @{
229
  */
250
  */
230
 
251
 
231
 
-
 
232
/**
252
/**
233
  * @brief  Refresh the IWDG.
253
  * @brief  Refresh the IWDG.
234
  * @param  hiwdg  pointer to a IWDG_HandleTypeDef structure that contains
254
  * @param  hiwdg  pointer to a IWDG_HandleTypeDef structure that contains
235
  *                the configuration information for the specified IWDG module.
255
  *                the configuration information for the specified IWDG module.
236
  * @retval HAL status
256
  * @retval HAL status
Line 242... Line 262...
242
 
262
 
243
  /* Return function status */
263
  /* Return function status */
244
  return HAL_OK;
264
  return HAL_OK;
245
}
265
}
246
 
266
 
-
 
267
 
247
/**
268
/**
248
  * @}
269
  * @}
249
  */
270
  */
250
 
271
 
251
/**
272
/**