Subversion Repositories FuelGauge

Rev

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

Rev 2 Rev 6
Line 225... Line 225...
225
    =============================================
225
    =============================================
226
    [..]
226
    [..]
227
 
227
 
228
     The compilation flag USE_HAL_ADC_REGISTER_CALLBACKS, when set to 1,
228
     The compilation flag USE_HAL_ADC_REGISTER_CALLBACKS, when set to 1,
229
     allows the user to configure dynamically the driver callbacks.
229
     allows the user to configure dynamically the driver callbacks.
230
     Use Functions @ref HAL_ADC_RegisterCallback()
230
     Use Functions HAL_ADC_RegisterCallback()
231
     to register an interrupt callback.
231
     to register an interrupt callback.
232
    [..]
232
    [..]
233
 
233
 
234
     Function @ref HAL_ADC_RegisterCallback() allows to register following callbacks:
234
     Function HAL_ADC_RegisterCallback() allows to register following callbacks:
235
       (+) ConvCpltCallback               : ADC conversion complete callback
235
       (+) ConvCpltCallback               : ADC conversion complete callback
236
       (+) ConvHalfCpltCallback           : ADC conversion DMA half-transfer callback
236
       (+) ConvHalfCpltCallback           : ADC conversion DMA half-transfer callback
237
       (+) LevelOutOfWindowCallback       : ADC analog watchdog 1 callback
237
       (+) LevelOutOfWindowCallback       : ADC analog watchdog 1 callback
238
       (+) ErrorCallback                  : ADC error callback
238
       (+) ErrorCallback                  : ADC error callback
239
       (+) MspInitCallback                : ADC Msp Init callback
239
       (+) MspInitCallback                : ADC Msp Init callback
240
       (+) MspDeInitCallback              : ADC Msp DeInit callback
240
       (+) MspDeInitCallback              : ADC Msp DeInit callback
241
     This function takes as parameters the HAL peripheral handle, the Callback ID
241
     This function takes as parameters the HAL peripheral handle, the Callback ID
242
     and a pointer to the user callback function.
242
     and a pointer to the user callback function.
243
    [..]
243
    [..]
244
 
244
 
245
     Use function @ref HAL_ADC_UnRegisterCallback to reset a callback to the default
245
     Use function HAL_ADC_UnRegisterCallback to reset a callback to the default
246
     weak function.
246
     weak function.
247
    [..]
247
    [..]
248
 
248
 
249
     @ref HAL_ADC_UnRegisterCallback takes as parameters the HAL peripheral handle,
249
     HAL_ADC_UnRegisterCallback takes as parameters the HAL peripheral handle,
250
     and the Callback ID.
250
     and the Callback ID.
251
     This function allows to reset following callbacks:
251
     This function allows to reset following callbacks:
252
       (+) ConvCpltCallback               : ADC conversion complete callback
252
       (+) ConvCpltCallback               : ADC conversion complete callback
253
       (+) ConvHalfCpltCallback           : ADC conversion DMA half-transfer callback
253
       (+) ConvHalfCpltCallback           : ADC conversion DMA half-transfer callback
254
       (+) LevelOutOfWindowCallback       : ADC analog watchdog 1 callback
254
       (+) LevelOutOfWindowCallback       : ADC analog watchdog 1 callback
255
       (+) ErrorCallback                  : ADC error callback
255
       (+) ErrorCallback                  : ADC error callback
256
       (+) MspInitCallback                : ADC Msp Init callback
256
       (+) MspInitCallback                : ADC Msp Init callback
257
       (+) MspDeInitCallback              : ADC Msp DeInit callback
257
       (+) MspDeInitCallback              : ADC Msp DeInit callback
258
     [..]
258
     [..]
259
 
259
 
260
     By default, after the @ref HAL_ADC_Init() and when the state is @ref HAL_ADC_STATE_RESET
260
     By default, after the HAL_ADC_Init() and when the state is HAL_ADC_STATE_RESET
261
     all callbacks are set to the corresponding weak functions:
261
     all callbacks are set to the corresponding weak functions:
262
     examples @ref HAL_ADC_ConvCpltCallback(), @ref HAL_ADC_ErrorCallback().
262
     examples HAL_ADC_ConvCpltCallback(), HAL_ADC_ErrorCallback().
263
     Exception done for MspInit and MspDeInit functions that are
263
     Exception done for MspInit and MspDeInit functions that are
264
     reset to the legacy weak functions in the @ref HAL_ADC_Init()/ @ref HAL_ADC_DeInit() only when
264
     reset to the legacy weak functions in the HAL_ADC_Init()/ HAL_ADC_DeInit() only when
265
     these callbacks are null (not registered beforehand).
265
     these callbacks are null (not registered beforehand).
266
    [..]
266
    [..]
267
 
267
 
268
     If MspInit or MspDeInit are not null, the @ref HAL_ADC_Init()/ @ref HAL_ADC_DeInit()
268
     If MspInit or MspDeInit are not null, the HAL_ADC_Init()/ HAL_ADC_DeInit()
269
     keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state.
269
     keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state.
270
     [..]
270
     [..]
271
 
271
 
272
     Callbacks can be registered/unregistered in @ref HAL_ADC_STATE_READY state only.
272
     Callbacks can be registered/unregistered in HAL_ADC_STATE_READY state only.
273
     Exception done MspInit/MspDeInit functions that can be registered/unregistered
273
     Exception done MspInit/MspDeInit functions that can be registered/unregistered
274
     in @ref HAL_ADC_STATE_READY or @ref HAL_ADC_STATE_RESET state,
274
     in HAL_ADC_STATE_READY or HAL_ADC_STATE_RESET state,
275
     thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.
275
     thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.
276
    [..]
276
    [..]
277
 
277
 
278
     Then, the user first registers the MspInit/MspDeInit user callbacks
278
     Then, the user first registers the MspInit/MspDeInit user callbacks
279
     using @ref HAL_ADC_RegisterCallback() before calling @ref HAL_ADC_DeInit()
279
     using HAL_ADC_RegisterCallback() before calling HAL_ADC_DeInit()
280
     or @ref HAL_ADC_Init() function.
280
     or HAL_ADC_Init() function.
281
     [..]
281
     [..]
282
 
282
 
283
     When the compilation flag USE_HAL_ADC_REGISTER_CALLBACKS is set to 0 or
283
     When the compilation flag USE_HAL_ADC_REGISTER_CALLBACKS is set to 0 or
284
     not defined, the callback registration feature is not available and all callbacks
284
     not defined, the callback registration feature is not available and all callbacks
285
     are set to the corresponding weak functions.
285
     are set to the corresponding weak functions.
Line 1190... Line 1190...
1190
    /* Check if timeout is disabled (set to infinite wait) */
1190
    /* Check if timeout is disabled (set to infinite wait) */
1191
    if(Timeout != HAL_MAX_DELAY)
1191
    if(Timeout != HAL_MAX_DELAY)
1192
    {
1192
    {
1193
      if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
1193
      if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
1194
      {
1194
      {
-
 
1195
        /* New check to avoid false timeout detection in case of preemption */
-
 
1196
        if(HAL_IS_BIT_CLR(hadc->Instance->ISR, tmp_Flag_EOC))
-
 
1197
        {
1195
        /* Update ADC state machine to timeout */
1198
          /* Update ADC state machine to timeout */
1196
        SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
1199
          SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
1197
       
1200
 
1198
        /* Process unlocked */
1201
          /* Process unlocked */
1199
        __HAL_UNLOCK(hadc);
1202
          __HAL_UNLOCK(hadc);
1200
       
1203
 
1201
        return HAL_TIMEOUT;
1204
          return HAL_TIMEOUT;
-
 
1205
        }
1202
      }
1206
      }
1203
    }
1207
    }
1204
  }
1208
  }
1205
   
1209
   
1206
  /* Update ADC state machine */
1210
  /* Update ADC state machine */
Line 1280... Line 1284...
1280
    /* Check if timeout is disabled (set to infinite wait) */
1284
    /* Check if timeout is disabled (set to infinite wait) */
1281
    if(Timeout != HAL_MAX_DELAY)
1285
    if(Timeout != HAL_MAX_DELAY)
1282
    {
1286
    {
1283
      if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout))
1287
      if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout))
1284
      {
1288
      {
-
 
1289
        /* New check to avoid false timeout detection in case of preemption */
-
 
1290
        if(__HAL_ADC_GET_FLAG(hadc, EventType) == RESET)
-
 
1291
        {
1285
        /* Update ADC state machine to timeout */
1292
          /* Update ADC state machine to timeout */
1286
        SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
1293
          SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
1287
       
1294
 
1288
        /* Process unlocked */
1295
          /* Process unlocked */
1289
        __HAL_UNLOCK(hadc);
1296
          __HAL_UNLOCK(hadc);
1290
       
1297
 
1291
        return HAL_TIMEOUT;
1298
          return HAL_TIMEOUT;
-
 
1299
        }
1292
      }
1300
      }
1293
    }
1301
    }
1294
  }
1302
  }
1295
 
1303
 
1296
  switch(EventType)
1304
  switch(EventType)
Line 1581... Line 1589...
1581
    /* Disable ADC DMA (ADC DMA configuration ADC_CFGR_DMACFG is kept) */
1589
    /* Disable ADC DMA (ADC DMA configuration ADC_CFGR_DMACFG is kept) */
1582
    hadc->Instance->CFGR1 &= ~ADC_CFGR1_DMAEN;
1590
    hadc->Instance->CFGR1 &= ~ADC_CFGR1_DMAEN;
1583
   
1591
   
1584
    /* Disable the DMA channel (in case of DMA in circular mode or stop while */
1592
    /* Disable the DMA channel (in case of DMA in circular mode or stop while */
1585
    /* while DMA transfer is on going)                                        */
1593
    /* while DMA transfer is on going)                                        */
1586
    tmp_hal_status = HAL_DMA_Abort(hadc->DMA_Handle);  
-
 
1587
   
-
 
1588
    /* Check if DMA channel effectively disabled */
-
 
1589
    if (tmp_hal_status != HAL_OK)
1594
    if (hadc->DMA_Handle->State == HAL_DMA_STATE_BUSY)
1590
    {
1595
    {
-
 
1596
      tmp_hal_status = HAL_DMA_Abort(hadc->DMA_Handle);  
-
 
1597
     
-
 
1598
      /* Check if DMA channel effectively disabled */
-
 
1599
      if (tmp_hal_status != HAL_OK)
-
 
1600
      {
1591
      /* Update ADC state machine to error */
1601
        /* Update ADC state machine to error */
1592
      SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
1602
        SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
-
 
1603
      }
1593
    }
1604
    }
1594
   
1605
   
1595
    /* Disable ADC overrun interrupt */
1606
    /* Disable ADC overrun interrupt */
1596
    __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR);
1607
    __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR);
1597
   
1608
   
Line 2225... Line 2236...
2225
    /* Wait for ADC effectively enabled */
2236
    /* Wait for ADC effectively enabled */
2226
    while(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_RDY) == RESET)
2237
    while(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_RDY) == RESET)
2227
    {
2238
    {
2228
      if((HAL_GetTick() - tickstart) > ADC_ENABLE_TIMEOUT)
2239
      if((HAL_GetTick() - tickstart) > ADC_ENABLE_TIMEOUT)
2229
      {
2240
      {
-
 
2241
        /* New check to avoid false timeout detection in case of preemption */
-
 
2242
        if(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_RDY) == RESET)
-
 
2243
        {
2230
        /* Update ADC state machine to error */
2244
          /* Update ADC state machine to error */
2231
        SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
2245
          SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
2232
     
2246
 
2233
        /* Set ADC error code to ADC IP internal error */
2247
          /* Set ADC error code to ADC IP internal error */
2234
        SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
2248
          SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
2235
     
2249
 
2236
        return HAL_ERROR;
2250
          return HAL_ERROR;
-
 
2251
        }
2237
      }
2252
      }
2238
    }  
-
 
2239
   
2253
    }
2240
  }
2254
  }
2241
   
2255
   
2242
  /* Return HAL status */
2256
  /* Return HAL status */
2243
  return HAL_OK;
2257
  return HAL_OK;
2244
}
2258
}
Line 2282... Line 2296...
2282
   
2296
   
2283
    while(HAL_IS_BIT_SET(hadc->Instance->CR, ADC_CR_ADEN))
2297
    while(HAL_IS_BIT_SET(hadc->Instance->CR, ADC_CR_ADEN))
2284
    {
2298
    {
2285
      if((HAL_GetTick() - tickstart) > ADC_DISABLE_TIMEOUT)
2299
      if((HAL_GetTick() - tickstart) > ADC_DISABLE_TIMEOUT)
2286
      {
2300
      {
-
 
2301
        /* New check to avoid false timeout detection in case of preemption */
-
 
2302
        if(HAL_IS_BIT_SET(hadc->Instance->CR, ADC_CR_ADEN))
-
 
2303
        {
2287
        /* Update ADC state machine to error */
2304
          /* Update ADC state machine to error */
2288
        SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
2305
          SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
2289
     
2306
 
2290
        /* Set ADC error code to ADC IP internal error */
2307
          /* Set ADC error code to ADC IP internal error */
2291
        SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
2308
          SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
2292
       
2309
 
2293
        return HAL_ERROR;
2310
          return HAL_ERROR;
-
 
2311
        }
2294
      }
2312
      }
2295
    }
2313
    }
2296
  }
2314
  }
2297
 
2315
 
2298
  /* Return HAL status */
2316
  /* Return HAL status */
Line 2334... Line 2352...
2334
     
2352
     
2335
    while((hadc->Instance->CR & ADC_CR_ADSTART) != RESET)
2353
    while((hadc->Instance->CR & ADC_CR_ADSTART) != RESET)
2336
    {
2354
    {
2337
      if((HAL_GetTick() - tickstart) > ADC_STOP_CONVERSION_TIMEOUT)
2355
      if((HAL_GetTick() - tickstart) > ADC_STOP_CONVERSION_TIMEOUT)
2338
      {
2356
      {
-
 
2357
        /* New check to avoid false timeout detection in case of preemption */
-
 
2358
        if((hadc->Instance->CR & ADC_CR_ADSTART) != RESET)
-
 
2359
        {
2339
        /* Update ADC state machine to error */
2360
          /* Update ADC state machine to error */
2340
        SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
2361
          SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
2341
     
2362
 
2342
        /* Set ADC error code to ADC IP internal error */
2363
          /* Set ADC error code to ADC IP internal error */
2343
        SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
2364
          SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
2344
       
2365
 
2345
        return HAL_ERROR;
2366
          return HAL_ERROR;
-
 
2367
        }
2346
      }
2368
      }
2347
    }
2369
    }
2348
   
-
 
2349
  }
2370
  }
2350
   
2371
   
2351
  /* Return HAL status */
2372
  /* Return HAL status */
2352
  return HAL_OK;
2373
  return HAL_OK;
2353
}
2374
}