Skip to content

Commit 0459155

Browse files
committed
library: wire: enhance i2c_getClkFreq()
Some series provides the HAL_RCCEx_GetPeriphCLKFreq() which returns the peripheral clock frequency based on Peripheral clock identifier. Signed-off-by: Frederic Pillon <frederic.pillon@st.com>
1 parent a8f9f66 commit 0459155

File tree

1 file changed

+156
-111
lines changed
  • libraries/Wire/src/utility

1 file changed

+156
-111
lines changed

libraries/Wire/src/utility/twi.c

Lines changed: 156 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -189,192 +189,237 @@ static I2C_HandleTypeDef *i2c_handles[I2C_NUM];
189189
static uint32_t i2c_getClkFreq(I2C_TypeDef *i2c)
190190
{
191191
uint32_t clkSrcFreq = 0;
192-
#if !defined(STM32MP1xx)
193192
#ifdef STM32H7xx
194193
PLL3_ClocksTypeDef PLL3_Clocks;
195194
#endif
196-
#if defined I2C1_BASE
195+
#if defined(I2C1_BASE)
197196
if (i2c == I2C1) {
198-
switch (__HAL_RCC_GET_I2C1_SOURCE()) {
199-
case RCC_I2C1CLKSOURCE_HSI:
200-
clkSrcFreq = HSI_VALUE;
201-
break;
197+
#if defined(RCC_PERIPHCLK_I2C1) || defined(RCC_PERIPHCLK_I2C12)
198+
#ifdef RCC_PERIPHCLK_I2C1
199+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C1);
200+
#else
201+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C12);
202+
#endif
203+
if (clkSrcFreq == 0)
204+
#endif
205+
{
206+
switch (__HAL_RCC_GET_I2C1_SOURCE()) {
207+
#ifdef RCC_I2C1CLKSOURCE_HSI
208+
case RCC_I2C1CLKSOURCE_HSI:
209+
clkSrcFreq = HSI_VALUE;
210+
break;
211+
#endif
202212
#ifdef RCC_I2C1CLKSOURCE_SYSCLK
203-
case RCC_I2C1CLKSOURCE_SYSCLK:
204-
clkSrcFreq = SystemCoreClock;
205-
break;
213+
case RCC_I2C1CLKSOURCE_SYSCLK:
214+
clkSrcFreq = SystemCoreClock;
215+
break;
206216
#endif
207217
#if defined(RCC_I2C1CLKSOURCE_PCLK1) || defined(RCC_I2C1CLKSOURCE_D2PCLK1)
208218
#ifdef RCC_I2C1CLKSOURCE_PCLK1
209-
case RCC_I2C1CLKSOURCE_PCLK1:
219+
case RCC_I2C1CLKSOURCE_PCLK1:
210220
#endif
211221
#ifdef RCC_I2C1CLKSOURCE_D2PCLK1
212-
case RCC_I2C1CLKSOURCE_D2PCLK1:
222+
case RCC_I2C1CLKSOURCE_D2PCLK1:
213223
#endif
214-
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
215-
break;
224+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
225+
break;
216226
#endif
217227
#ifdef RCC_I2C1CLKSOURCE_CSI
218-
case RCC_I2C1CLKSOURCE_CSI:
219-
clkSrcFreq = CSI_VALUE;
220-
break;
228+
case RCC_I2C1CLKSOURCE_CSI:
229+
clkSrcFreq = CSI_VALUE;
230+
break;
221231
#endif
222232
#ifdef RCC_I2C1CLKSOURCE_PLL3
223-
case RCC_I2C1CLKSOURCE_PLL3:
224-
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
225-
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
226-
break;
233+
case RCC_I2C1CLKSOURCE_PLL3:
234+
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
235+
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
236+
break;
227237
#endif
228-
default:
229-
Error_Handler();
238+
default:
239+
Error_Handler();
240+
}
230241
}
231242
}
232243
#endif // I2C1_BASE
233-
#if defined I2C2_BASE
244+
#if defined(I2C2_BASE)
234245
if (i2c == I2C2) {
246+
#if defined(RCC_PERIPHCLK_I2C2) || defined(RCC_PERIPHCLK_I2C12)
247+
#ifdef RCC_PERIPHCLK_I2C2
248+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C2);
249+
#else
250+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C12);
251+
#endif
252+
if (clkSrcFreq == 0)
253+
#endif
254+
{
235255
#ifdef __HAL_RCC_GET_I2C2_SOURCE
236-
switch (__HAL_RCC_GET_I2C2_SOURCE()) {
237-
case RCC_I2C2CLKSOURCE_HSI:
238-
clkSrcFreq = HSI_VALUE;
239-
break;
256+
switch (__HAL_RCC_GET_I2C2_SOURCE()) {
257+
case RCC_I2C2CLKSOURCE_HSI:
258+
clkSrcFreq = HSI_VALUE;
259+
break;
240260
#ifdef RCC_I2C2CLKSOURCE_SYSCLK
241-
case RCC_I2C2CLKSOURCE_SYSCLK:
242-
clkSrcFreq = SystemCoreClock;
243-
break;
261+
case RCC_I2C2CLKSOURCE_SYSCLK:
262+
clkSrcFreq = SystemCoreClock;
263+
break;
244264
#endif
245265
#if defined(RCC_I2C2CLKSOURCE_PCLK1) || defined(RCC_I2C2CLKSOURCE_D2PCLK1)
246266
#ifdef RCC_I2C2CLKSOURCE_PCLK1
247-
case RCC_I2C2CLKSOURCE_PCLK1:
267+
case RCC_I2C2CLKSOURCE_PCLK1:
248268
#endif
249269
#ifdef RCC_I2C2CLKSOURCE_D2PCLK1
250-
case RCC_I2C2CLKSOURCE_D2PCLK1:
270+
case RCC_I2C2CLKSOURCE_D2PCLK1:
251271
#endif
252-
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
253-
break;
272+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
273+
break;
254274
#endif
255275
#ifdef RCC_I2C2CLKSOURCE_CSI
256-
case RCC_I2C2CLKSOURCE_CSI:
257-
clkSrcFreq = CSI_VALUE;
258-
break;
276+
case RCC_I2C2CLKSOURCE_CSI:
277+
clkSrcFreq = CSI_VALUE;
278+
break;
259279
#endif
260280
#ifdef RCC_I2C2CLKSOURCE_PLL3
261-
case RCC_I2C2CLKSOURCE_PLL3:
262-
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
263-
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
264-
break;
281+
case RCC_I2C2CLKSOURCE_PLL3:
282+
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
283+
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
284+
break;
265285
#endif
266-
default:
267-
Error_Handler();
268-
}
286+
default:
287+
Error_Handler();
288+
}
269289
#else
270-
/* STM32 L0/G0 I2C2 has no independent clock */
271-
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
290+
/* STM32 L0/G0 I2C2 has no independent clock */
291+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
272292
#endif
293+
}
273294
}
274295
#endif // I2C2_BASE
275-
#if defined I2C3_BASE
296+
#if defined(I2C3_BASE)
276297
if (i2c == I2C3) {
298+
#if defined(RCC_PERIPHCLK_I2C3) || defined(RCC_PERIPHCLK_I2C35)
299+
#ifdef RCC_PERIPHCLK_I2C3
300+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C3);
301+
#else
302+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C35);
303+
#endif
304+
if (clkSrcFreq == 0)
305+
#endif
306+
{
277307
#if defined(__HAL_RCC_GET_I2C3_SOURCE)
278-
switch (__HAL_RCC_GET_I2C3_SOURCE()) {
279-
case RCC_I2C3CLKSOURCE_HSI:
280-
clkSrcFreq = HSI_VALUE;
281-
break;
308+
switch (__HAL_RCC_GET_I2C3_SOURCE()) {
309+
case RCC_I2C3CLKSOURCE_HSI:
310+
clkSrcFreq = HSI_VALUE;
311+
break;
282312
#ifdef RCC_I2C3CLKSOURCE_SYSCLK
283-
case RCC_I2C3CLKSOURCE_SYSCLK:
284-
clkSrcFreq = SystemCoreClock;
285-
break;
313+
case RCC_I2C3CLKSOURCE_SYSCLK:
314+
clkSrcFreq = SystemCoreClock;
315+
break;
286316
#endif
287317
#if defined(RCC_I2C3CLKSOURCE_PCLK1) || defined(RCC_I2C3CLKSOURCE_D2PCLK1)
288318
#ifdef RCC_I2C3CLKSOURCE_PCLK1
289-
case RCC_I2C3CLKSOURCE_PCLK1:
319+
case RCC_I2C3CLKSOURCE_PCLK1:
290320
#endif
291321
#ifdef RCC_I2C3CLKSOURCE_D2PCLK1
292-
case RCC_I2C3CLKSOURCE_D2PCLK1:
322+
case RCC_I2C3CLKSOURCE_D2PCLK1:
293323
#endif
294-
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
295-
break;
324+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
325+
break;
296326
#endif
297327
#ifdef RCC_I2C3CLKSOURCE_CSI
298-
case RCC_I2C3CLKSOURCE_CSI:
299-
clkSrcFreq = CSI_VALUE;
300-
break;
328+
case RCC_I2C3CLKSOURCE_CSI:
329+
clkSrcFreq = CSI_VALUE;
330+
break;
301331
#endif
302332
#ifdef RCC_I2C3CLKSOURCE_PLL3
303-
case RCC_I2C3CLKSOURCE_PLL3:
304-
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
305-
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
306-
break;
333+
case RCC_I2C3CLKSOURCE_PLL3:
334+
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
335+
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
336+
break;
307337
#endif
308-
default:
309-
Error_Handler();
310-
}
338+
default:
339+
Error_Handler();
340+
}
311341
#else
312-
/* STM32 G0 I2C3 has no independent clock */
313-
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
342+
/* STM32 G0 I2C3 has no independent clock */
343+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
314344
#endif
345+
}
315346
}
316347
#endif // I2C3_BASE
317-
#if defined I2C4_BASE
348+
#if defined(I2C4_BASE)
318349
if (i2c == I2C4) {
319-
switch (__HAL_RCC_GET_I2C4_SOURCE()) {
320-
case RCC_I2C4CLKSOURCE_HSI:
321-
clkSrcFreq = HSI_VALUE;
322-
break;
350+
#if defined(RCC_PERIPHCLK_I2C4) || defined(RCC_PERIPHCLK_I2C46)
351+
#ifdef RCC_PERIPHCLK_I2C4
352+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C4);
353+
#else
354+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C46);
355+
#endif
356+
if (clkSrcFreq == 0)
357+
#endif
358+
{
359+
#if defined(__HAL_RCC_GET_I2C4_SOURCE)
360+
switch (__HAL_RCC_GET_I2C4_SOURCE()) {
361+
#ifdef RCC_I2C4CLKSOURCE_HSI
362+
case RCC_I2C4CLKSOURCE_HSI:
363+
clkSrcFreq = HSI_VALUE;
364+
break;
365+
#endif
323366
#ifdef RCC_I2C4CLKSOURCE_SYSCLK
324-
case RCC_I2C4CLKSOURCE_SYSCLK:
325-
clkSrcFreq = SystemCoreClock;
326-
break;
367+
case RCC_I2C4CLKSOURCE_SYSCLK:
368+
clkSrcFreq = SystemCoreClock;
369+
break;
327370
#endif
328371
#ifdef RCC_I2C4CLKSOURCE_PCLK1
329-
case RCC_I2C4CLKSOURCE_PCLK1:
330-
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
331-
break;
372+
case RCC_I2C4CLKSOURCE_PCLK1:
373+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
374+
break;
332375
#endif
333376
#ifdef RCC_I2C4CLKSOURCE_D3PCLK1
334-
case RCC_I2C4CLKSOURCE_D3PCLK1:
335-
clkSrcFreq = HAL_RCCEx_GetD3PCLK1Freq();
336-
break;
377+
case RCC_I2C4CLKSOURCE_D3PCLK1:
378+
clkSrcFreq = HAL_RCCEx_GetD3PCLK1Freq();
379+
break;
337380
#endif
338381
#ifdef RCC_I2C4CLKSOURCE_CSI
339-
case RCC_I2C4CLKSOURCE_CSI:
340-
clkSrcFreq = CSI_VALUE;
341-
break;
382+
case RCC_I2C4CLKSOURCE_CSI:
383+
clkSrcFreq = CSI_VALUE;
384+
break;
342385
#endif
343386
#ifdef RCC_I2C4CLKSOURCE_PLL3
344-
case RCC_I2C4CLKSOURCE_PLL3:
345-
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
346-
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
347-
break;
387+
case RCC_I2C4CLKSOURCE_PLL3:
388+
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
389+
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
390+
break;
391+
#endif
392+
default:
393+
Error_Handler();
394+
}
348395
#endif
349-
default:
350-
Error_Handler();
351396
}
352397
}
353398
#endif // I2C4_BASE
354-
355-
#elif defined(STM32MP1xx)
356-
if (i2c == I2C1) {
357-
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C12);
358-
}
359-
if (i2c == I2C2) {
360-
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C12);
361-
}
362-
if (i2c == I2C3) {
363-
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C35);
364-
}
365-
if (i2c == I2C4) {
366-
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C46);
367-
}
368-
#endif // STM32MP1xx
369-
370-
#if defined I2C5_BASE
399+
#if defined(I2C5_BASE)
371400
if (i2c == I2C5) {
401+
#if defined(RCC_PERIPHCLK_I2C5) || defined(RCC_PERIPHCLK_I2C35)
402+
#ifdef RCC_PERIPHCLK_I2C5
403+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C5);
404+
#else
372405
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C35);
406+
#endif
407+
if (clkSrcFreq == 0)
408+
#endif
409+
{
410+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C35);
411+
}
373412
}
374413
#endif // I2C5_BASE
375-
#if defined I2C6_BASE
414+
#if defined(I2C6_BASE)
376415
if (i2c == I2C6) {
416+
#if defined(RCC_PERIPHCLK_I2C6) || defined(RCC_PERIPHCLK_I2C46)
417+
#ifdef RCC_PERIPHCLK_I2C6
418+
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C6);
419+
#else
377420
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C46);
421+
#endif
422+
#endif
378423
}
379424
#endif // I2C6_BASE
380425
return clkSrcFreq;

0 commit comments

Comments
 (0)