STM32L431低功耗调试,退出低功耗模式后SPI读写外部FLASH出错

STM32L4退出低功耗后SPI读写出错

现象描述: 单片机低功耗唤醒后,SPI读写外部FLASH出错
使用单片机型号: stm32L431
库函数版本: HAL库2017版

查找问题方案:
进入低功耗前打印出SPI的相关寄存器,低功耗唤醒后,再配置完SPI后,再次打印出SPI对应的寄存器,比较寄存器配置,发现SPI相关寄存器在进低出功耗前后并无变化,然后打印了SPI相关管脚配置的寄存器GPIOB->MODER,发现数据异常,进低功耗前GPIOB->MODER=a9ffad7d,退出低功耗后GPIOB->MODER=ffffad7d,问题找到,通过寄存器可以看到SPI对应管脚GPIOB13,GPIOB14,GPIOB15,在推出低功耗后,管脚还处于模拟输入模式,并未在SPI初始化后进入复用推挽模式
既然查出时SPI管脚配置问题,但 在唤醒后,立即配置SPI初始化了呀,为什么没有成功呢?呢只可能是没有进去初始化函数,在初始化函数里面通过串口打印“初始化”,发现推出低功耗后确实没有进入初始化函数,在往前查,发现了一个条件编译,只有在SPI 的hspi->StateHAL_SPI_STATE_RESET状态,才会进行管脚初始化函数HAL_SPI_MspInit(hspi);在hspi->StateHAL_SPI_STATE_RESET 之前串口打印hspi->State的值
发现hspi>State=HAL_SPI_STATE_READY ,到此真正的问题找到了,在进低功耗前调用 HAL_SPI_MspDeInit(&hspi2)后,hspi->State寄存器并未恢复至HAL_SPI_STATE_RESET。
解决方案:
在 void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)函数中将spiHandle->State 清零
新添加代码:spiHandle->State = HAL_SPI_STATE_RESET; //恢复为reset状态,不然退出低功耗后,无法进行管脚初始化配

测试验证: 再次在退出低功耗后读取SPI管脚配置寄存器,管脚配置成功,读取外部flash数据成功

在这里插入图片描述
在这里插入图片描述