FSMC驱动屏的问题!

2019-07-21 01:58发布

#define Bank1_LCD_C    ((uint32_t)0x60000000)                //Disp Reg ADDR
#define Bank1_LCD_D    ((uint32_t)0x61000000)                  //Disp Data ADDR       // A23 PE2
/*选定LCD指定寄存器*/
#define LCD_WR_REG(index)      ((*(__IO uint16_t *) (Bank1_LCD_C)) = ((uint16_t)index))
/*往LCD GRAM写入数据*/
#define LCD_WR_Data(val)       ((*(__IO uint16_t *) (Bank1_LCD_D)) = ((uint16_t)(val)))//u16
#define LCD_ILI9486_CMD(index)           LCD_WR_REG(index)
#define LCD_ILI9486_Parameter(val)         LCD_WR_Data(val)


/**************************************************
* @briefCD_GPIO_Init
* @param:
* @retval :
****************************************************/
void LCD_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
  //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
  /*配置LCD 背光引脚*/
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;   
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
  /*配置LCD RST背光引脚*/
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;   
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  /*配置FSMC相对的数据线,FSMC D0-D15:PD 14 15 0 1,PE 7 8 9 10 11 12 13 14 15,PD 8 9 10*/
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8|GPIO_Pin_9
                              |GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;  
  GPIO_Init(GPIOD, &GPIO_InitStructure);  
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10
                              |GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14
                              |GPIO_Pin_15;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
/* 配置FSMC相对的控制信号:
  * PD4-FSMC_NOE  CD-RD
  * PD5-FSMC_NWE  CD-WR
  * PG12-FSMC_NE1CD-CS
  * PE2-FSMC_A23  CD-DC
*/
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;
  GPIO_Init(GPIOD, &GPIO_InitStructure);  
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
  /*打开背光*/
  GPIO_SetBits(GPIOE,GPIO_Pin_0);
}
/**************************************************
* @briefCD_FSMC_Init
* @param:
* @retval :
****************************************************/
void LCD_FSMC_Init(void)
{   
  FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  FSMC_NORSRAMTimingInitTypeDef  ReadTimer;
  FSMC_NORSRAMTimingInitTypeDef  WriterTimer;
  
  
  ReadTimer.FSMC_AddressSetupTime = 0x01;         //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns
  ReadTimer.FSMC_AddressHoldTime = 0x00;         //地址保持时间(ADDHLD)模式A未用到       
  ReadTimer.FSMC_DataSetupTime = 0x0f;                 // 数据保存时间为16个HCLK,因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
  ReadTimer.FSMC_BusTurnAroundDuration = 0x00;
  ReadTimer.FSMC_CLKDivision = 0x00;
  ReadTimer.FSMC_DataLatency = 0x00;
  ReadTimer.FSMC_AccessMode = FSMC_AccessMode_A;         //模式A
  
  WriterTimer.FSMC_AddressSetupTime = 0x02;         //0x01 地址建立时间(ADDSET)为1个HCLK  
  WriterTimer.FSMC_AddressHoldTime = 0x00;         //地址保持时间(A               
  WriterTimer.FSMC_DataSetupTime = 0x05;                 ////0x03 数据保存时间为4个HCLK       
  WriterTimer.FSMC_BusTurnAroundDuration = 0x00;
  WriterTimer.FSMC_CLKDivision = 0x00;
  WriterTimer.FSMC_DataLatency = 0x00;
  WriterTimer.FSMC_AccessMode = FSMC_AccessMode_A;         //模式A
   
   
   
  
  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 = &ReadTimer;
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &WriterTimer;  
  
  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
  
  /* 使能 FSMC Bank1_SRAM Bank */
  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);   
}

  LCD_ILI9486_CMD(0XF9);
  LCD_ILI9486_Parameter(0x00);

为什么跑到 LCD_ILI9486_Parameter(0x00);就会重启;要不就会跑到这个中断里
/**
  * @brief  This function handles Hard Fault exception.
  * @param  None
  * @retval None
  */
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

用的是IAR ?各路大神?原子哥!为何这样!小弟不解?
还希望各位指教下!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。