问题描述                                                         

  通过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初始化的时候,这些不可测的参数使我们的设置出乎我们的预料。

总结                                                             

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

posted on 2014-10-30 21:28  amanlikethis  阅读(2036)  评论(0编辑  收藏  举报