单片机
返回首页

STM32的FSMC总线驱动ili9341,掉电重启无法正常显示的问题

2025-09-17 来源:cnblogs

问题描述                                                         


  通过STM32的FSMC总线驱动ili9341,程序调试和刚下载的时候,显示完全正常。可是就在我掉电关机,重新启动的时候就完全跑飞了。这令我非常疑惑。以下是我的FSMC总线配置程序,


static void LCD_FSMC_Config(void)

{

    FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;

    FSMC_NORSRAMTimingInitTypeDef  p; 

      

    p.FSMC_AddressSetupTime = 0x02;  

    p.FSMC_AddressHoldTime = 0x00;

    p.FSMC_DataSetupTime = 0x05;           

    p.FSMC_BusTurnAroundDuration = 0x00;

    p.FSMC_CLKDivision = 0x00;

    p.FSMC_DataLatency = 0x00;

    p.FSMC_AccessMode = FSMC_AccessMode_B;    

    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;

    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;

    FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;

    FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;

    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;

    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;

    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;

    FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;

    FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;

    FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;

    FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;

    FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;

    FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;

    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;

    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;  

    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); 

    

    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);  

}


解决的方法                                                        

  在使用FSMC_NORSRAMInit函数通过传入参数FSMC_NORSRAMInitStructure初始化FSMC总线之前,需要先将这个传入变量FSMC_NORSRAMInitStructure通过函数FSMC_NORSRAMStructInit函数初始化这个变量。


    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;

    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

    FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure);

原因分析                                                          


  为什么这么做呢?因为传入的变量是一个自动变量,进入我们的FSMC设置函数时,它的值是不确定的。假设我们没有对其初始化成默认值,直接利用这个变量。如果我们队这个变量的每一个参数都设置成我们确定的值,那么FSMC就可以按照我们设置的工作。倘若我们没有做到,只将这个变量的一部分参数进行设置,显然还有一些参数是不可预测的。导致的结果就是,我们调用库函数FSMC_NORSRAMInit初始化的时候,这些不可测的参数使我们的设置出乎我们的预料。


总结                                                             


   由此,我也得出一个教训,在我们调用库函数的时候,要先将传入库函数的自动变量进行初始化。然后再来使用,这样最严谨,最可靠。


进入单片机查看更多内容>>

上一篇:STM32系统时钟

下一篇:stm32 PA0 中断

相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 设计汽车集群电源

  • 6晶体管H桥

  • 温度控制风扇

  • USB LED调光器

  • AVR PC步进电机驱动器

  • AVR温度计TCN75

    相关电子头条文章