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 <odiin@windowslive.com>
pull/15530/head
JohnK1987 2024-08-19 09:29:35 +02:00 committed by GitHub
parent 047bbc3bd3
commit 3f239c6201
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 212 additions and 8 deletions

View File

@ -13,6 +13,7 @@ target_sources(mbed-stm32h5
analogin_device.c
analogout_device.c
gpio_irq_device.c
i2c_device.c
serial_device.c
pwmout_device.c
)

View File

@ -0,0 +1,139 @@
/* mbed Microcontroller Library
* SPDX-License-Identifier: BSD-3-Clause
******************************************************************************
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
#include "i2c_device.h"
#include "mbed_assert.h"
#include "mbed_error.h"
#include "stm32h5xx_ll_rcc.h"
/* Define I2C Device */
#if DEVICE_I2C
/**
* @brief Get I2C clock source frequency according I2C instance used.
* @param i2c I2C instance name.
* @retval I2C clock source frequency in Hz.
*/
uint32_t i2c_get_pclk(I2CName i2c)
{
uint32_t clocksource;
uint32_t pclk = 0;
#if !defined(RCC_CR_PLL3ON)
PLL2_ClocksTypeDef pll2clock; //STM32H503
#else
PLL3_ClocksTypeDef pll3clock; //STM32H563
#endif
if (i2c == I2C_1) {
clocksource = __HAL_RCC_GET_I2C1_SOURCE();
switch (clocksource) {
case RCC_I2C1CLKSOURCE_PCLK1:
pclk = HAL_RCC_GetPCLK1Freq();
break;
case RCC_I2C1CLKSOURCE_CSI:
pclk = CSI_VALUE;
break;
case RCC_I2C1CLKSOURCE_HSI:
pclk = HSI_VALUE;
break;
#if !defined(RCC_CR_PLL3ON)
case RCC_I2C1CLKSOURCE_PLL2R:
HAL_RCCEx_GetPLL2ClockFreq(&pll2clock);
pclk = pll2clock.PLL2_R_Frequency;
break;
#else
case RCC_I2C1CLKSOURCE_PLL3R:
HAL_RCCEx_GetPLL3ClockFreq(&pll3clock);
pclk = pll3clock.PLL3_R_Frequency;
break;
#endif /* RCC_CR_PLL3ON */
}
}
else if (i2c == I2C_2) {
clocksource = __HAL_RCC_GET_I2C2_SOURCE();
switch (clocksource) {
case RCC_I2C2CLKSOURCE_PCLK1:
pclk = HAL_RCC_GetPCLK1Freq();
break;
case RCC_I2C2CLKSOURCE_CSI:
pclk = CSI_VALUE;
break;
case RCC_I2C2CLKSOURCE_HSI:
pclk = HSI_VALUE;
break;
#if !defined(RCC_CR_PLL3ON)
case RCC_I2C2CLKSOURCE_PLL2R:
HAL_RCCEx_GetPLL2ClockFreq(&pll2clock);
pclk = pll2clock.PLL2_R_Frequency;
break;
#else
case RCC_I2C2CLKSOURCE_PLL3R:
HAL_RCCEx_GetPLL3ClockFreq(&pll3clock);
pclk = pll3clock.PLL3_R_Frequency;
break;
#endif /* RCC_CR_PLL3ON */
}
}
#if defined I2C3_BASE
else if (i2c == I2C_3) {
clocksource = __HAL_RCC_GET_I2C3_SOURCE();
switch (clocksource) {
case RCC_I2C3CLKSOURCE_PCLK3:
pclk = HAL_RCC_GetPCLK3Freq();
break;
case RCC_I2C3CLKSOURCE_CSI:
pclk = CSI_VALUE;
break;
case RCC_I2C3CLKSOURCE_HSI:
pclk = HSI_VALUE;
break;
#if defined(RCC_CR_PLL3ON)
case RCC_I2C3CLKSOURCE_PLL3R:
HAL_RCCEx_GetPLL3ClockFreq(&pll3clock);
pclk = pll3clock.PLL3_R_Frequency;
break;
#endif
}
}
#endif
#if defined I2C4_BASE
else if (i2c == I2C_4) {
clocksource = __HAL_RCC_GET_I2C4_SOURCE();
switch (clocksource) {
case RCC_I2C4CLKSOURCE_PCLK3:
pclk = HAL_RCC_GetPCLK3Freq();
break;
case RCC_I2C4CLKSOURCE_CSI:
pclk = CSI_VALUE;
break;
case RCC_I2C4CLKSOURCE_HSI:
pclk = HSI_VALUE;
break;
#if defined(RCC_CR_PLL3ON)
case RCC_I2C4CLKSOURCE_PLL3R:
HAL_RCCEx_GetPLL3ClockFreq(&pll3clock);
pclk = pll3clock.PLL3_R_Frequency;
break;
#endif
}
}
#endif
else {
// should not happend
error("I2C: unknown instance");
}
return pclk;
}
#endif // DEVICE_I2C

View File

@ -0,0 +1,65 @@
/* mbed Microcontroller Library
* SPDX-License-Identifier: BSD-3-Clause
******************************************************************************
*
* Copyright (c) 2015-2024 STMicroelectronics.
* Copyright (c) 2020, Arduino SA.
* All rights reserved.
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
#ifndef MBED_I2C_DEVICE_H
#define MBED_I2C_DEVICE_H
#include "PeripheralNames.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Define I2C Device */
#if DEVICE_I2C
/* Define IP version */
#define I2C_IP_VERSION_V2
// Note: Below values are generated using STM32Cube IDE
#define TIMING_VAL_250M_CLK_100KHZ 0xA0E1597A // Standard mode with Rise Time = 400ns and Fall Time = 100ns
#define TIMING_VAL_250M_CLK_400KHZ 0x90810E23 // Fast mode with Rise Time = 250ns and Fall Time = 100ns
#define TIMING_VAL_250M_CLK_1MHZ 0x10D51940 // Fast mode Plus with Rise Time = 60ns and Fall Time = 100ns
#define I2C_PCLK_250M 250000000 // 250 MHz
#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)
/* Family specifc settings for clock source */
#define I2CAPI_I2C1_CLKSRC RCC_I2C1CLKSOURCE_PCLK1
#define I2CAPI_I2C2_CLKSRC RCC_I2C2CLKSOURCE_PCLK1
#if I2C3_BASE
#define I2CAPI_I2C3_CLKSRC RCC_I2C3CLKSOURCE_PCLK3
#endif
#if I2C4_BASE
#define I2CAPI_I2C4_CLKSRC RCC_I2C4CLKSOURCE_PCLK3
#endif
uint32_t i2c_get_pclk(I2CName i2c);
uint32_t i2c_get_timing(I2CName i2c, uint32_t current_timing, int current_hz, int hz);
#if MBED_CONF_TARGET_I2C_TIMING_VALUE_ALGO
uint32_t i2c_compute_timing(uint32_t clock_src_freq, uint32_t i2c_freq);
void i2c_compute_presc_scldel_sdadel(uint32_t clock_src_freq, uint32_t I2C_speed);
uint32_t i2c_compute_scll_sclh(uint32_t clock_src_freq, uint32_t I2C_speed);
#endif // MBED_CONF_TARGET_I2C_TIMING_VALUE_ALGO
#endif // DEVICE_I2C
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,6 +1,6 @@
/* mbed Microcontroller Library
*******************************************************************************
* Copyright (c) 2015-2021, STMicroelectronics
* Copyright (c) 2015-2024, STMicroelectronics
* All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause
*
@ -1472,6 +1472,7 @@ void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
/* Get object ptr based on handler ptr */
i2c_t *obj = get_i2c_obj(hi2c);
struct i2c_s *obj_s = I2C_S(obj);
#if DEVICE_I2C_ASYNCH
#ifdef I2C_IP_VERSION_V1
hi2c->PreviousState = I2C_STATE_NONE;
#elif defined(I2C_IP_VERSION_V2)
@ -1487,7 +1488,8 @@ void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
obj_s->state = STM_I2C_IDLE;
}
}
#endif
#endif /* I2C_IP_VERSION_VX */
#endif /* DEVICE_I2C_ASYNCH */
// Set event flag. Note: We still get the complete callback even if an error was encountered,
// so use |= to preserve any error flags.
@ -1909,6 +1911,7 @@ void i2c_abort_asynch(i2c_t *obj)
STM_I2C_SET_STATE(obj_s, STM_I2C_IDLE);
}
#endif // DEVICE_I2C_ASYNCH
#if MBED_CONF_TARGET_I2C_TIMING_VALUE_ALGO
/**
@ -2397,6 +2400,4 @@ uint32_t i2c_get_timing(I2CName i2c, uint32_t current_timing, int current_hz,
#endif /* I2C_IP_VERSION_V2 */
#endif // DEVICE_I2C_ASYNCH
#endif // DEVICE_I2C

View File

@ -1,5 +1,5 @@
/* mbed Microcontroller Library
* Copyright (c) 2016-2022 STMicroelectronics
* Copyright (c) 2016-2024 STMicroelectronics
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -64,6 +64,7 @@ struct i2c_s {
volatile uint8_t event;
int current_hz;
#if DEVICE_I2CSLAVE
uint8_t slave;
volatile uint8_t pending_slave_tx_master_rx;

View File

@ -3100,9 +3100,6 @@
"LPTICKER",
"CAN",
"SERIAL_FC",
"I2C",
"I2C_ASYNCH",
"I2CSLAVE",
"SPI",
"SPISLAVE",
"SPI_ASYNCH",