[应用相关] STM32的FSMC总线驱动ili9341,掉电重启无法正常显示的问题

[复制链接]
622|3
 楼主| decoding 发表于 2019-8-4 18:01 | 显示全部楼层 |阅读模式
问题描述                                                         
  通过STM32的FSMC总线驱动ili9341,程序调试和刚下载的时候,显示完全正常。可是就在我掉电关机,重新启动的时候就完全跑飞了。这令我非常疑惑。以下是我的FSMC总线配置程序,

  1. static void LCD_FSMC_Config(void)
  2. {
  3.     FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  4.     FSMC_NORSRAMTimingInitTypeDef  p;
  5.       
  6.     p.FSMC_AddressSetupTime = 0x02;  
  7.     p.FSMC_AddressHoldTime = 0x00;
  8.     p.FSMC_DataSetupTime = 0x05;           
  9.     p.FSMC_BusTurnAroundDuration = 0x00;
  10.     p.FSMC_CLKDivision = 0x00;
  11.     p.FSMC_DataLatency = 0x00;
  12.     p.FSMC_AccessMode = FSMC_AccessMode_B;   
  13.     FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
  14.     FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  15.     FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
  16.     FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
  17.     FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
  18.     FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
  19.     FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  20.     FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  21.     FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  22.     FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  23.     FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  24.     FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  25.     FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  26.     FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
  27.     FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;  
  28.     FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
  29.    
  30.     FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);  
  31. }


 楼主| decoding 发表于 2019-8-4 18:02 | 显示全部楼层
解决的方法                                                         
  在使用FSMC_NORSRAMInit函数通过传入参数FSMC_NORSRAMInitStructure初始化FSMC总线之前,需要先将这个传入变量FSMC_NORSRAMInitStructure通过函数FSMC_NORSRAMStructInit函数初始化这个变量。

  1.     FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
  2.     FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
  3.     FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure);
 楼主| decoding 发表于 2019-8-4 18:02 | 显示全部楼层
原因分析                                                         

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

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

本版积分规则

30

主题

469

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部