AnsweredAssumed Answered

Undefined reference HAL_I2C_Init. Help?

Question asked by loucas on Dec 22, 2016
Latest reply on Dec 26, 2016 by Imen D

Hello everybody,


In first time, I'm sorry for my english! ^^


I'm trying to configure an I2C communication for a MCU STM32F401RT6. I don't use ...Cube_MX but I use STM32f4xx_HAL Library for different reason and not STM32f4xx library.

My program compile but there is a problem with the linker => I have the famous error message : undefined reference to 'HAL_I2C_Init' (Yes, again and again this error message ^^).


To simplify, I removed other file .c and .h and I keep just Main program.


Here main.c Program


#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_def.h"
#include "stm32f4xx_hal_i2c.h"


#define I2Cx I2C1
#define I2Cx_CLK_ENABLE()                                     __HAL_RCC_I2C1_CLK_ENABLE()
#define I2Cx_SCL_GPIO_CLK_ENABLE()                __HAL_RCC_GPIOB_CLK_ENABLE()
#define I2Cx_SDA_GPIO_CLK_ENABLE()               __HAL_RCC_GPIOB_CLK_ENABLE()
#define I2Cx_FORCE_RESET()                                __HAL_RCC_I2C1_FORCE_RESET()
#define I2Cx_RELEASE_RESET()                            __HAL_RCC_I2C1_RELEASE_RESET()
#define I2Cx_SCL_PIN                                               GPIO_PIN_6
#define I2Cx_SCL_GPIO_PORT                               GPIOB
#define I2Cx_SDA_PIN                                              GPIO_PIN_7
#define I2Cx_SDA_GPIO_PORT                               GPIOB
#define I2Cx_GPIO_MODE                                        GPIO_MODE_AF_OD
#define I2Cx_GPIO_PULL                                           GPIO_PULLUP
#define I2Cx_GPIO_SPEED                                        GPIO_SPEED_FREQ_HIGH
#define I2Cx_SCL_AF                                                 GPIO_AF4_I2C1
#define I2Cx_SDA_AF                                                 GPIO_AF4_I2C1

static I2C_HandleTypeDef hi2c;
bool I2CInit(void);


int main(void) {






bool I2CInit(void) {

hi2c.Instance = I2Cx;
hi2c.Init.ClockSpeed = 100000; // 100kHz
hi2c.Init.DutyCycle = I2C_DUTYCYCLE_2; // 50% duty cycle --> standard
hi2c.Init.OwnAddress1 = 0x00; // own address, not relevant in master mode
hi2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; // Set address length to 7 bit addresses
hi2c.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; // Disable seconde Address
hi2c.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; // Disable general call
hi2c.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; // Disable no stretch
hi2c.Devaddress = 0x3B;

if (HAL_I2C_DeInit(&hi2c) != HAL_OK) {
return false;

if (HAL_I2C_Init(&hi2c) != HAL_OK) {
return false;


return true;


I compile and link with a makefile and on Cygdrive terminal.

here the message on my terminal.



I don't see where is the problem. I looked for on google but I didn't find a solution. I specify that the stm32f4xx_hal_conf.h include HAL_I2C_MODULE_ENABLED


Do you understand where is the problem?


Thank you very much for your assistance?