我用的是STM32CubeIDE v1.12.1(lasted version),STM提供的IDE。 最近我开始了一个新项目,它是一个使用液晶显示器的产品。
我正在添加外部 SDRAM 并将其连接到 FMC 并将其与 LTDC 一起使用。 在先添加其他外围设备并最后实现与 LCD 相关的设备驱动程序时,我们遇到了一个问题,即设备在上电时不断进入硬故障。
在分析原因时,发现IDE自动生成的设备初始化代码部分如下
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_QUADSPI_Init();
MX_SPI1_Init();
MX_I2C1_Init();
MX_DMA2D_Init();
MX_I2C2_Init();
MX_RTC_Init();
MX_USART1_UART_Init();
MX_USART6_UART_Init();
MX_LTDC_Init();
MX_FMC_Init();
MX_SPI6_Init();
MX_SDMMC1_SD_Init();
MX_FATFS_Init();
/* USER CODE BEGIN 2 */
我怀疑是 LCD 的初始化代码太落后(特别是 FMC 初始化函数)导致了问题,所以我修改了如下顺序。
MX_GPIO_Init();
MX_DMA_Init();
MX_FMC_Init();
MX_QUADSPI_Init();
MX_SPI1_Init();
MX_SPI6_Init();
MX_I2C1_Init();
MX_I2C2_Init();
MX_USART1_UART_Init();
MX_USART6_UART_Init();
MX_LTDC_Init();
MX_DMA2D_Init();
MX_SDMMC1_SD_Init();
MX_FATFS_Init();
MX_RTC_Init();
问题从此消失了! 原因不明,但我们最好的猜测是在初始化序列期间发生了严重错误。
问题是每次 CubeID 自动生成代码时,初始化代码的顺序都被还原了。我暂时禁用了使用预处理器自动生成的代码,如下所示,但这是一个临时措施。
/**
* MX_FMC_Init() positioning problem
* this function must be immediately after MX_DMA_Init().
*/
MX_GPIO_Init();
MX_DMA_Init();
MX_FMC_Init();
MX_QUADSPI_Init();
MX_SPI1_Init();
MX_SPI6_Init();
MX_I2C1_Init();
MX_I2C2_Init();
MX_USART1_UART_Init();
MX_USART6_UART_Init();
MX_LTDC_Init();
MX_DMA2D_Init();
MX_SDMMC1_SD_Init();
MX_FATFS_Init();
MX_RTC_Init();
#if 0
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_QUADSPI_Init();
MX_SPI1_Init();
MX_I2C1_Init();
MX_DMA2D_Init();
MX_I2C2_Init();
MX_RTC_Init();
MX_USART1_UART_Init();
MX_USART6_UART_Init();
MX_LTDC_Init();
MX_FMC_Init();
MX_SPI6_Init();
MX_SDMMC1_SD_Init();
MX_FATFS_Init();
/* USER CODE BEGIN 2 */
#endif
有什么办法可以指定CubeIDE自动生成的初始化代码的顺序吗?
是的,有办法。
在 STM32CubIDE 中,打开您的 .ioc 文件,单击顶部的项目管理器选项卡,然后单击左侧的高级设置框。
这将为您提供生成的函数调用列表。每个人都有一个与之关联的等级,这决定了它们被调用的顺序。
根据需要分配 Rank 字段,以确保您的外围设备按照您需要的顺序进行初始化。