Skip to content

Commit 3f239c6

Browse files
JohnK1987Jan Kamidra
andauthored
Add support of I2C API for STM32H5 family (#323)
* fix PWM pin map in context of Timer change * Note about DAC on Nucleo-H503RB * Add ADC and DAC for STM32H5 * Copyright fix * Add I2C for STM32H5 * fix I2C related code * ADC/DAC fix * Enable I2C API * Copyright fix * fix I2C device * fix I2C ASYNCH macro * fix revert back the stop variable position --------- Co-authored-by: Jan Kamidra <[email protected]>
1 parent 047bbc3 commit 3f239c6

File tree

6 files changed

+212
-8
lines changed

6 files changed

+212
-8
lines changed

targets/TARGET_STM/TARGET_STM32H5/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ target_sources(mbed-stm32h5
1313
analogin_device.c
1414
analogout_device.c
1515
gpio_irq_device.c
16+
i2c_device.c
1617
serial_device.c
1718
pwmout_device.c
1819
)
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/* mbed Microcontroller Library
2+
* SPDX-License-Identifier: BSD-3-Clause
3+
******************************************************************************
4+
*
5+
* Copyright (c) 2024 STMicroelectronics.
6+
* All rights reserved.
7+
*
8+
* This software component is licensed by ST under BSD 3-Clause license,
9+
* the "License"; You may not use this file except in compliance with the
10+
* License. You may obtain a copy of the License at:
11+
* opensource.org/licenses/BSD-3-Clause
12+
*
13+
******************************************************************************
14+
*/
15+
16+
#include "i2c_device.h"
17+
#include "mbed_assert.h"
18+
#include "mbed_error.h"
19+
#include "stm32h5xx_ll_rcc.h"
20+
21+
/* Define I2C Device */
22+
#if DEVICE_I2C
23+
24+
/**
25+
* @brief Get I2C clock source frequency according I2C instance used.
26+
* @param i2c I2C instance name.
27+
* @retval I2C clock source frequency in Hz.
28+
*/
29+
uint32_t i2c_get_pclk(I2CName i2c)
30+
{
31+
uint32_t clocksource;
32+
uint32_t pclk = 0;
33+
#if !defined(RCC_CR_PLL3ON)
34+
PLL2_ClocksTypeDef pll2clock; //STM32H503
35+
#else
36+
PLL3_ClocksTypeDef pll3clock; //STM32H563
37+
#endif
38+
39+
if (i2c == I2C_1) {
40+
clocksource = __HAL_RCC_GET_I2C1_SOURCE();
41+
switch (clocksource) {
42+
case RCC_I2C1CLKSOURCE_PCLK1:
43+
pclk = HAL_RCC_GetPCLK1Freq();
44+
break;
45+
case RCC_I2C1CLKSOURCE_CSI:
46+
pclk = CSI_VALUE;
47+
break;
48+
case RCC_I2C1CLKSOURCE_HSI:
49+
pclk = HSI_VALUE;
50+
break;
51+
#if !defined(RCC_CR_PLL3ON)
52+
case RCC_I2C1CLKSOURCE_PLL2R:
53+
HAL_RCCEx_GetPLL2ClockFreq(&pll2clock);
54+
pclk = pll2clock.PLL2_R_Frequency;
55+
break;
56+
#else
57+
case RCC_I2C1CLKSOURCE_PLL3R:
58+
HAL_RCCEx_GetPLL3ClockFreq(&pll3clock);
59+
pclk = pll3clock.PLL3_R_Frequency;
60+
break;
61+
#endif /* RCC_CR_PLL3ON */
62+
}
63+
}
64+
else if (i2c == I2C_2) {
65+
clocksource = __HAL_RCC_GET_I2C2_SOURCE();
66+
switch (clocksource) {
67+
case RCC_I2C2CLKSOURCE_PCLK1:
68+
pclk = HAL_RCC_GetPCLK1Freq();
69+
break;
70+
case RCC_I2C2CLKSOURCE_CSI:
71+
pclk = CSI_VALUE;
72+
break;
73+
case RCC_I2C2CLKSOURCE_HSI:
74+
pclk = HSI_VALUE;
75+
break;
76+
#if !defined(RCC_CR_PLL3ON)
77+
case RCC_I2C2CLKSOURCE_PLL2R:
78+
HAL_RCCEx_GetPLL2ClockFreq(&pll2clock);
79+
pclk = pll2clock.PLL2_R_Frequency;
80+
break;
81+
#else
82+
case RCC_I2C2CLKSOURCE_PLL3R:
83+
HAL_RCCEx_GetPLL3ClockFreq(&pll3clock);
84+
pclk = pll3clock.PLL3_R_Frequency;
85+
break;
86+
#endif /* RCC_CR_PLL3ON */
87+
}
88+
}
89+
#if defined I2C3_BASE
90+
else if (i2c == I2C_3) {
91+
clocksource = __HAL_RCC_GET_I2C3_SOURCE();
92+
switch (clocksource) {
93+
case RCC_I2C3CLKSOURCE_PCLK3:
94+
pclk = HAL_RCC_GetPCLK3Freq();
95+
break;
96+
case RCC_I2C3CLKSOURCE_CSI:
97+
pclk = CSI_VALUE;
98+
break;
99+
case RCC_I2C3CLKSOURCE_HSI:
100+
pclk = HSI_VALUE;
101+
break;
102+
#if defined(RCC_CR_PLL3ON)
103+
case RCC_I2C3CLKSOURCE_PLL3R:
104+
HAL_RCCEx_GetPLL3ClockFreq(&pll3clock);
105+
pclk = pll3clock.PLL3_R_Frequency;
106+
break;
107+
#endif
108+
}
109+
}
110+
#endif
111+
#if defined I2C4_BASE
112+
else if (i2c == I2C_4) {
113+
clocksource = __HAL_RCC_GET_I2C4_SOURCE();
114+
switch (clocksource) {
115+
case RCC_I2C4CLKSOURCE_PCLK3:
116+
pclk = HAL_RCC_GetPCLK3Freq();
117+
break;
118+
case RCC_I2C4CLKSOURCE_CSI:
119+
pclk = CSI_VALUE;
120+
break;
121+
case RCC_I2C4CLKSOURCE_HSI:
122+
pclk = HSI_VALUE;
123+
break;
124+
#if defined(RCC_CR_PLL3ON)
125+
case RCC_I2C4CLKSOURCE_PLL3R:
126+
HAL_RCCEx_GetPLL3ClockFreq(&pll3clock);
127+
pclk = pll3clock.PLL3_R_Frequency;
128+
break;
129+
#endif
130+
}
131+
}
132+
#endif
133+
else {
134+
// should not happend
135+
error("I2C: unknown instance");
136+
}
137+
return pclk;
138+
}
139+
#endif // DEVICE_I2C
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/* mbed Microcontroller Library
2+
* SPDX-License-Identifier: BSD-3-Clause
3+
******************************************************************************
4+
*
5+
* Copyright (c) 2015-2024 STMicroelectronics.
6+
* Copyright (c) 2020, Arduino SA.
7+
* All rights reserved.
8+
*
9+
* This software component is licensed by ST under BSD 3-Clause license,
10+
* the "License"; You may not use this file except in compliance with the
11+
* License. You may obtain a copy of the License at:
12+
* opensource.org/licenses/BSD-3-Clause
13+
*
14+
******************************************************************************
15+
*/
16+
17+
#ifndef MBED_I2C_DEVICE_H
18+
#define MBED_I2C_DEVICE_H
19+
20+
#include "PeripheralNames.h"
21+
22+
#ifdef __cplusplus
23+
extern "C" {
24+
#endif
25+
26+
/* Define I2C Device */
27+
#if DEVICE_I2C
28+
29+
/* Define IP version */
30+
#define I2C_IP_VERSION_V2
31+
32+
// Note: Below values are generated using STM32Cube IDE
33+
#define TIMING_VAL_250M_CLK_100KHZ 0xA0E1597A // Standard mode with Rise Time = 400ns and Fall Time = 100ns
34+
#define TIMING_VAL_250M_CLK_400KHZ 0x90810E23 // Fast mode with Rise Time = 250ns and Fall Time = 100ns
35+
#define TIMING_VAL_250M_CLK_1MHZ 0x10D51940 // Fast mode Plus with Rise Time = 60ns and Fall Time = 100ns
36+
#define I2C_PCLK_250M 250000000 // 250 MHz
37+
38+
#define I2C_IT_ALL (I2C_IT_ERRI|I2C_IT_TCI|I2C_IT_STOPI|I2C_IT_NACKI|I2C_IT_ADDRI|I2C_IT_RXI|I2C_IT_TXI)
39+
40+
/* Family specifc settings for clock source */
41+
#define I2CAPI_I2C1_CLKSRC RCC_I2C1CLKSOURCE_PCLK1
42+
#define I2CAPI_I2C2_CLKSRC RCC_I2C2CLKSOURCE_PCLK1
43+
#if I2C3_BASE
44+
#define I2CAPI_I2C3_CLKSRC RCC_I2C3CLKSOURCE_PCLK3
45+
#endif
46+
#if I2C4_BASE
47+
#define I2CAPI_I2C4_CLKSRC RCC_I2C4CLKSOURCE_PCLK3
48+
#endif
49+
50+
uint32_t i2c_get_pclk(I2CName i2c);
51+
uint32_t i2c_get_timing(I2CName i2c, uint32_t current_timing, int current_hz, int hz);
52+
53+
#if MBED_CONF_TARGET_I2C_TIMING_VALUE_ALGO
54+
uint32_t i2c_compute_timing(uint32_t clock_src_freq, uint32_t i2c_freq);
55+
void i2c_compute_presc_scldel_sdadel(uint32_t clock_src_freq, uint32_t I2C_speed);
56+
uint32_t i2c_compute_scll_sclh(uint32_t clock_src_freq, uint32_t I2C_speed);
57+
#endif // MBED_CONF_TARGET_I2C_TIMING_VALUE_ALGO
58+
59+
#endif // DEVICE_I2C
60+
61+
#ifdef __cplusplus
62+
}
63+
#endif
64+
65+
#endif

targets/TARGET_STM/i2c_api.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* mbed Microcontroller Library
22
*******************************************************************************
3-
* Copyright (c) 2015-2021, STMicroelectronics
3+
* Copyright (c) 2015-2024, STMicroelectronics
44
* All rights reserved.
55
* SPDX-License-Identifier: BSD-3-Clause
66
*
@@ -1472,6 +1472,7 @@ void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
14721472
/* Get object ptr based on handler ptr */
14731473
i2c_t *obj = get_i2c_obj(hi2c);
14741474
struct i2c_s *obj_s = I2C_S(obj);
1475+
#if DEVICE_I2C_ASYNCH
14751476
#ifdef I2C_IP_VERSION_V1
14761477
hi2c->PreviousState = I2C_STATE_NONE;
14771478
#elif defined(I2C_IP_VERSION_V2)
@@ -1487,7 +1488,8 @@ void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
14871488
obj_s->state = STM_I2C_IDLE;
14881489
}
14891490
}
1490-
#endif
1491+
#endif /* I2C_IP_VERSION_VX */
1492+
#endif /* DEVICE_I2C_ASYNCH */
14911493

14921494
// Set event flag. Note: We still get the complete callback even if an error was encountered,
14931495
// so use |= to preserve any error flags.
@@ -1909,6 +1911,7 @@ void i2c_abort_asynch(i2c_t *obj)
19091911

19101912
STM_I2C_SET_STATE(obj_s, STM_I2C_IDLE);
19111913
}
1914+
#endif // DEVICE_I2C_ASYNCH
19121915

19131916
#if MBED_CONF_TARGET_I2C_TIMING_VALUE_ALGO
19141917
/**
@@ -2397,6 +2400,4 @@ uint32_t i2c_get_timing(I2CName i2c, uint32_t current_timing, int current_hz,
23972400

23982401
#endif /* I2C_IP_VERSION_V2 */
23992402

2400-
#endif // DEVICE_I2C_ASYNCH
2401-
24022403
#endif // DEVICE_I2C

targets/TARGET_STM/stm_i2c_api.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* mbed Microcontroller Library
2-
* Copyright (c) 2016-2022 STMicroelectronics
2+
* Copyright (c) 2016-2024 STMicroelectronics
33
* SPDX-License-Identifier: Apache-2.0
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -64,6 +64,7 @@ struct i2c_s {
6464
volatile uint8_t event;
6565

6666
int current_hz;
67+
6768
#if DEVICE_I2CSLAVE
6869
uint8_t slave;
6970
volatile uint8_t pending_slave_tx_master_rx;

targets/targets.json5

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3100,9 +3100,6 @@
31003100
"LPTICKER",
31013101
"CAN",
31023102
"SERIAL_FC",
3103-
"I2C",
3104-
"I2C_ASYNCH",
3105-
"I2CSLAVE",
31063103
"SPI",
31073104
"SPISLAVE",
31083105
"SPI_ASYNCH",

0 commit comments

Comments
 (0)