Newer
Older
mbed-os / targets / TARGET_STM / TARGET_STM32H7 / i2c_device.c
@Jerome Coutant Jerome Coutant on 14 Feb 2022 3 KB STM32H7 : fix I2C5 build error
/* mbed Microcontroller Library
 * SPDX-License-Identifier: BSD-3-Clause
 ******************************************************************************
 *
 * Copyright (c) 2021 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 "stm32h7xx_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;
    PLL3_ClocksTypeDef pll3_clocks;
    if ((i2c == I2C_1) || (i2c == I2C_2) || (i2c == I2C_3)) {
        clocksource = __HAL_RCC_GET_I2C123_SOURCE();
        switch (clocksource) {
            case RCC_I2C123CLKSOURCE_D2PCLK1:
                pclk = HAL_RCC_GetPCLK1Freq();
                break;
            case RCC_I2C123CLKSOURCE_PLL3:
                HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
                pclk = pll3_clocks.PLL3_R_Frequency;
                break;
            case RCC_I2C123CLKSOURCE_HSI:
                pclk = HSI_VALUE;
                break;
            case RCC_I2C123CLKSOURCE_CSI:
                pclk = CSI_VALUE;
                break;
            default:
                // should not happend
                error("I2C123: Invalid clock source");
                break;
        }
    }
#if defined I2C4_BASE
    else if (i2c == I2C_4) {
        clocksource = __HAL_RCC_GET_I2C4_SOURCE();
        switch (clocksource) {
            case RCC_I2C4CLKSOURCE_D3PCLK1:
                pclk = HAL_RCCEx_GetD3PCLK1Freq();
                break;
            case RCC_I2C4CLKSOURCE_PLL3:
                HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
                pclk = pll3_clocks.PLL3_R_Frequency;
                break;
            case RCC_I2C4CLKSOURCE_HSI:
                pclk = HSI_VALUE;
                break;
            case RCC_I2C4CLKSOURCE_CSI:
                pclk = CSI_VALUE;
                break;
            default:
                // should not happend
                error("I2C4: Invalid clock source");
                break;
        }
    }
#endif
#if defined I2C5_BASE
    else if (i2c == I2C_5) {
        clocksource = __HAL_RCC_GET_I2C5_SOURCE();
        switch (clocksource) {
            case RCC_I2C5CLKSOURCE_D2PCLK1:
                pclk = HAL_RCC_GetPCLK1Freq();
                break;
            case RCC_I2C5CLKSOURCE_PLL3:
                HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
                pclk = pll3_clocks.PLL3_R_Frequency;
                break;
            case RCC_I2C5CLKSOURCE_HSI:
                pclk = HSI_VALUE;
                break;
            case RCC_I2C5CLKSOURCE_CSI:
                pclk = CSI_VALUE;
                break;
            default:
                // should not happend
                error("I2C5: Invalid clock source");
                break;
        }
    }
#endif
    else {
        // should not happend
        error("I2C: unknown instance");
    }
    return pclk;
}
#endif // DEVICE_I2C