Rev 56 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 56 | Rev 61 | ||
---|---|---|---|
Line 36... | Line 36... | ||
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 @37KHz (LSI): ~108.1us / ~28.28s |
42 | The IWDG timeout may vary due to LSI clock frequency dispersion. |
42 | The IWDG timeout may vary due to LSI clock frequency dispersion. |
43 | STM32L1xx devices provide the capability to measure the LSI clock |
43 | STM32L1xx devices provide the capability to measure the LSI clock |
44 | frequency (LSI clock is internally connected to TIM16 CH1 input capture). |
44 | frequency (LSI clock is internally connected to TIM10 CH1 input capture). |
45 | The measured value can be used to have an IWDG timeout with an |
45 | The measured value can be used to have an IWDG timeout with an |
46 | acceptable accuracy. |
46 | acceptable accuracy. |
47 | 47 | ||
48 | [..] Default timeout value (necessary for IWDG_SR status register update): |
48 | [..] Default timeout value (necessary for IWDG_SR status register update): |
49 | Constant LSI_VALUE is defined based on the nominal LSI clock frequency. |
49 | Constant LSI_VALUE is defined based on the nominal LSI clock frequency. |
50 | This frequency being subject to variations as mentioned above, the |
50 | This frequency being subject to variations as mentioned above, the |
51 | default timeout value (defined through constant HAL_IWDG_DEFAULT_TIMEOUT |
51 | default timeout value (defined through constant HAL_IWDG_DEFAULT_TIMEOUT |
52 | below) may become too short or too long. |
52 | below) may become too short or too long. |
53 | In such cases, this default timeout value can be tuned by redefining |
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, |
54 | the constant LSI_VALUE at user-application level (based, for instance, |
55 | on the measured LSI clock frequency as explained above). |
55 | on the measured LSI clock frequency as explained above). |
Line 59... | Line 59... | ||
59 | [..] |
59 | [..] |
60 | (#) Use IWDG using HAL_IWDG_Init() function to : |
60 | (#) Use IWDG using HAL_IWDG_Init() function to : |
61 | (++) Enable instance by writing Start keyword in IWDG_KEY register. LSI |
61 | (++) Enable instance by writing Start keyword in IWDG_KEY register. LSI |
62 | clock is forced ON and IWDG counter starts counting down. |
62 | clock is forced ON and IWDG counter starts counting down. |
63 | (++) Enable write access to configuration registers: |
63 | (++) Enable write access to configuration registers: |
64 | IWDG_PR, IWDG_RLR and IWDG_WINR. |
64 | IWDG_PR and IWDG_RLR. |
65 | (++) Configure the IWDG prescaler and counter reload value. This reload |
65 | (++) Configure the IWDG prescaler and counter reload value. This reload |
66 | 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 |
67 | reloaded, then the IWDG will start counting down from this value. |
67 | reloaded, then the IWDG will start counting down from this value. |
68 | (++) Wait for status flags to be reset. |
68 | (++) Wait for status flags to be reset. |
69 | 69 | ||
Line 113... | Line 113... | ||
113 | * @{ |
113 | * @{ |
114 | */ |
114 | */ |
115 | /* Status register needs up to 5 LSI clock periods divided by the clock |
115 | /* Status register needs up to 5 LSI clock periods divided by the clock |
116 | prescaler to be updated. The number of LSI clock periods is upper-rounded to |
116 | prescaler to be updated. The number of LSI clock periods is upper-rounded to |
117 | 6 for the timeout value calculation. |
117 | 6 for the timeout value calculation. |
118 | The timeout value is also calculated using the highest prescaler (256) and |
118 | The timeout value is calculated using the highest prescaler (256) and |
119 | the LSI_VALUE constant. The value of this constant can be changed by the user |
119 | the LSI_VALUE constant. The value of this constant can be changed by the user |
120 | to take into account possible LSI clock period variations. |
120 | to take into account possible LSI clock period variations. |
121 | The timeout value is multiplied by 1000 to be converted in milliseconds. */ |
121 | The timeout value is multiplied by 1000 to be converted in milliseconds. |
- | 122 | LSI startup time is also considered here by adding LSI_STARTUP_TIMEOUT |
|
- | 123 | converted in milliseconds. */ |
|
122 | #define HAL_IWDG_DEFAULT_TIMEOUT ((6UL * 256UL * 1000UL) / LSI_VALUE) |
124 | #define HAL_IWDG_DEFAULT_TIMEOUT (((6UL * 256UL * 1000UL) / LSI_VALUE) + ((LSI_STARTUP_TIME / 1000UL) + 1UL)) |
- | 125 | #define IWDG_KERNEL_UPDATE_FLAGS (IWDG_SR_RVU | IWDG_SR_PVU) |
|
123 | /** |
126 | /** |
124 | * @} |
127 | * @} |
125 | */ |
128 | */ |
126 | 129 | ||
127 | /* Private macro -------------------------------------------------------------*/ |
130 | /* Private macro -------------------------------------------------------------*/ |
Line 174... | Line 177... | ||
174 | assert_param(IS_IWDG_RELOAD(hiwdg->Init.Reload)); |
177 | assert_param(IS_IWDG_RELOAD(hiwdg->Init.Reload)); |
175 | 178 | ||
176 | /* Enable IWDG. LSI is turned on automatically */ |
179 | /* Enable IWDG. LSI is turned on automatically */ |
177 | __HAL_IWDG_START(hiwdg); |
180 | __HAL_IWDG_START(hiwdg); |
178 | 181 | ||
179 | /* Enable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers by writing |
182 | /* Enable write access to IWDG_PR and IWDG_RLR registers by writing |
180 | 0x5555 in KR */ |
183 | 0x5555 in KR */ |
181 | IWDG_ENABLE_WRITE_ACCESS(hiwdg); |
184 | IWDG_ENABLE_WRITE_ACCESS(hiwdg); |
182 | 185 | ||
183 | /* Write to IWDG registers the Prescaler & Reload values to work with */ |
186 | /* Write to IWDG registers the Prescaler & Reload values to work with */ |
184 | hiwdg->Instance->PR = hiwdg->Init.Prescaler; |
187 | hiwdg->Instance->PR = hiwdg->Init.Prescaler; |
Line 186... | Line 189... | ||
186 | 189 | ||
187 | /* Check pending flag, if previous update not done, return timeout */ |
190 | /* Check pending flag, if previous update not done, return timeout */ |
188 | tickstart = HAL_GetTick(); |
191 | tickstart = HAL_GetTick(); |
189 | 192 | ||
190 | /* Wait for register to be updated */ |
193 | /* Wait for register to be updated */ |
191 | while (hiwdg->Instance->SR != 0x00u) |
194 | while ((hiwdg->Instance->SR & IWDG_KERNEL_UPDATE_FLAGS) != 0x00u) |
192 | { |
195 | { |
193 | if ((HAL_GetTick() - tickstart) > HAL_IWDG_DEFAULT_TIMEOUT) |
196 | if ((HAL_GetTick() - tickstart) > HAL_IWDG_DEFAULT_TIMEOUT) |
194 | { |
197 | { |
- | 198 | if ((hiwdg->Instance->SR & IWDG_KERNEL_UPDATE_FLAGS) != 0x00u) |
|
- | 199 | { |
|
195 | return HAL_TIMEOUT; |
200 | return HAL_TIMEOUT; |
- | 201 | } |
|
196 | } |
202 | } |
197 | } |
203 | } |
198 | 204 | ||
199 | /* Reload IWDG counter with value defined in the reload register */ |
205 | /* Reload IWDG counter with value defined in the reload register */ |
200 | __HAL_IWDG_RELOAD_COUNTER(hiwdg); |
206 | __HAL_IWDG_RELOAD_COUNTER(hiwdg); |
201 | 207 | ||
202 | /* Return function status */ |
208 | /* Return function status */ |
203 | return HAL_OK; |
209 | return HAL_OK; |
204 | } |
210 | } |
205 | 211 | ||
- | 212 | ||
206 | /** |
213 | /** |
207 | * @} |
214 | * @} |
208 | */ |
215 | */ |
209 | 216 | ||
210 | 217 | ||
Line 220... | Line 227... | ||
220 | 227 | ||
221 | @endverbatim |
228 | @endverbatim |
222 | * @{ |
229 | * @{ |
223 | */ |
230 | */ |
224 | 231 | ||
225 | - | ||
226 | /** |
232 | /** |
227 | * @brief Refresh the IWDG. |
233 | * @brief Refresh the IWDG. |
228 | * @param hiwdg pointer to a IWDG_HandleTypeDef structure that contains |
234 | * @param hiwdg pointer to a IWDG_HandleTypeDef structure that contains |
229 | * the configuration information for the specified IWDG module. |
235 | * the configuration information for the specified IWDG module. |
230 | * @retval HAL status |
236 | * @retval HAL status |
Line 236... | Line 242... | ||
236 | 242 | ||
237 | /* Return function status */ |
243 | /* Return function status */ |
238 | return HAL_OK; |
244 | return HAL_OK; |
239 | } |
245 | } |
240 | 246 | ||
- | 247 | ||
241 | /** |
248 | /** |
242 | * @} |
249 | * @} |
243 | */ |
250 | */ |
244 | 251 | ||
245 | /** |
252 | /** |