Skip to main content

STM32CubeMX (MCUs)

Ask questions on STM32CubeMX. Discuss code generation and configuration challenges, among other topics.

  • 7,253 Topics
  • 27,397 Replies
7253 Topics
Linker error with LL SPI driver when I2S is not configured on STM32G4

在使用 STM32CubeMX 进行项目配置时,我只启用和配置了与 SPI 外设相关的功能,而没有激活任何 I2S 功能。生成代码后,我选择使用低层 (LL) 库进行 SPI 驱动程序开发。但是,在项目编译过程中发生了链接器错误。 经过调查,确定了根本原因:意法半导体提供的LL库源文件 不是纯SPI驱动程序,而是复合SPI/I2S驱动程序模块。该文件包含SPI和I2S功能的函数实现。其中,某些I2S函数(例如某些初始化或时钟配置函数)调用依赖于中的实现的特定函数,其中之一是。stm32g4xx_ll_spi.cstm32g4xx_ll_rcc.cLL_RCC_GetI2SClockFreq 由于我的项目从未配置或使用 I2S,因此 STM32CubeMX 的构建系统在生成项目时不包含包含函数实现的代码模块 。但是,由于该 文件是完整编译的,因此其中的 I2S 代码需要链接到该函数,最终导致链接器报告错误——缺少符号。LL_RCC_GetI2SClockFreqstm32g4xx_ll_spi.cLL_RCC_GetI2SClockFreq 目前,我采用了一种临时解决方法:在 CubeMX 自动生成的设备头文件中,我注释掉了用于控制 I2S 功能编译的宏定义:stm32g474xx.h c // #define SPI_I2S_SUPPORT /*!< I2S support */ 这会导致预处理器在编译 LL 库源文件期间排除所有与 I2S 相关的代码,从而避免引用 并允许项目成功编译。 LL_RCC_GetI2SClockFreq 然而,这种方法有一个明显的缺陷:它不是一个根本的解决方案。每次使用 STM32CubeMX 重新生成代码时,我对文件的手动修改都会被覆盖,需要重复相同的注释作。这大大降低了开发效率,并表明当前项目配置或库文件组织存在固有的低效率。STM32G474xx.h 希望能够实现一种可配置的方法,使构建系统能够自动检测项目中外设的使用情况,并智能地决定是否编译LL库中的I2S相关代码,而不是依赖这种手动修改自动生成文件的方法。   Adding the English version :  When using STM32CubeMX for project configuration, I only e