arduion 下使用 stm32 显示屏

Arduion下使用stm32显示屏

 

Arduion挺好用的,stm32功能挺强大,arduion IDE也支持stm32了

 

手头有一块STM32F103VET的开发板,带2.4寸的TFT,显示屏使用ILI9325的驱动,触膜屏使用的是SPI接口, 但是arduion下没有对应的驱动; 只能自己改改了,如果你的板子的连线跟我的一样,你可以直接使用这个程序;或是只要稍修改下就能放到你自己中使用

显示屏-篇

Arduion下使用stm32可以参考:

http://bbs.mydigit.cn/read.php?tid=2168292

 

1.硬件连线:(不用管一般开发板上都已经连好了)LCD使用fsmc接口来实现;

FSMC_D0---FSMC_D15 和LCD 的DB1-DB8 DB10-DB17 相互连接

FSMC_A16(P58)作为LCD 的RS 选择(注意这里,将导致使用的地址不同,使用A16将导致我的基地址变为:0x60020000

 

2.软件-寄存器操作:(主要将寄存器的操作函数LCD_WR_REG,LCD_WR_CMD,LCD_WR_Data,LCD_WR_Data_8 (完成,和后面的FSMC初始化完成;后面的ILI9325的相关函数可直接复制原STM32中的函数)

//lcd_reg.h文件

#define Bank1_LCD_D    ((uint32_t)0x60020000)    //disp Data ADDR

#define Bank1_LCD_C    ((uint32_t)0x60000000)   //disp Reg ADDR

#define     __IO    volatile



void LCD_WR_REG(unsigned int index);

void LCD_WR_CMD(unsigned int index,unsigned int val);

void LCD_WR_Data(unsigned int val);

void LCD_WR_Data_8(unsigned int val);





//写寄存器地址函数

void LCD_WR_REG(unsigned int index)

{

  *(__IO uint16_t *) (Bank1_LCD_C)= index;



}







//写寄存器数据函数

//输入:dbw 数据位数,1为16位,0为8位。

void LCD_WR_CMD(unsigned int index,unsigned int val)

{

  *(__IO uint16_t *) (Bank1_LCD_C)= index; 

  *(__IO uint16_t *) (Bank1_LCD_D)= val;

}



unsigned int LCD_RD_data(void){

  unsigned int a=0;

  a=(*(__IO uint16_t *) (Bank1_LCD_D));   //Dummy

  //a= *(__IO uint16_t *) (Bank1_LCD_D);    //H

  //a=a<<8;

  a=*(__IO uint16_t *) (Bank1_LCD_D); //L



  return(a); 

}







//写16位数据函数

void    LCD_WR_Data(unsigned int val)

{  

  *(__IO uint16_t *) (Bank1_LCD_D)= val; 

}



void LCD_WR_Data_8(unsigned int val)

{

  *(__IO uint16_t *) (Bank1_LCD_D)= val;

}



 

3.FSMC设置(可复制原STM32中触摸屏

void STM_FSMC_LCD_TimeSet(uint8_t _as, uint8_t _ds)

{       

  FSMC_NORSRAM_TimingTypeDef Timing;

  GPIO_InitTypeDef GPIO_InitStruct;

  /* USER CODE BEGIN FSMC_MspInit 0 */



  /* USER CODE END FSMC_MspInit 0 */

  if (FSMC_Initialized == 0) {

 

  FSMC_Initialized = 1;

  /* Peripheral clock enable */

  __HAL_RCC_GPIOC_CLK_ENABLE();

  __HAL_RCC_GPIOD_CLK_ENABLE();

  __HAL_RCC_GPIOE_CLK_ENABLE();

  __HAL_RCC_FSMC_CLK_ENABLE();

 

  /** FSMC GPIO Configuration 

  PE7   ------> FSMC_D4

  PE8   ------> FSMC_D5

  PE9   ------> FSMC_D6

  PE10   ------> FSMC_D7

  PE11   ------> FSMC_D8

  PE12   ------> FSMC_D9

  PE13   ------> FSMC_D10

  PE14   ------> FSMC_D11

  PE15   ------> FSMC_D12

  PD8   ------> FSMC_D13

  PD9   ------> FSMC_D14

  PD10   ------> FSMC_D15

  PD13   ------> FSMC_A16

  PD14   ------> FSMC_D0

  PD15   ------> FSMC_D1

  PD0   ------> FSMC_D2

  PD1   ------> FSMC_D3

  PD4   ------> FSMC_NOE

  PD5   ------> FSMC_NWE

  PD7   ------> FSMC_NE1

  */





  //-----------------------------GPI0E===================================

  GPIO_InitStruct.Pin = GPIO_PIN_0;

  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);  //LCD BACKLIGHT

  GPIO_InitStruct.Pin = GPIO_PIN_1;

  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); //LCD-RST



  //-----------FMSC

  GPIO_InitStruct.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_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);





  //------------------------------GPIOD-------------------



  GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_6 | GPIO_PIN_3;

  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);  //LCD BACKLIGHT



                                                                                        /* NE1 configuration */

  GPIO_InitStruct.Pin = GPIO_PIN_7;

  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);



  GPIO_InitStruct.Pin = GPIO_PIN_11;

  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);  //RS



 //-----------FMSC

  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1 |GPIO_PIN_4|GPIO_PIN_5

                        |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14

                        |GPIO_PIN_15;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);





  //====================================SET*************************

  digitalWrite(PD7 | PD14 | PD15 | PD0 | PD1, HIGH);

  digitalWrite(PE7 | PE8 | PE9 | PE10, HIGH);

  digitalWrite(PE0 | PE1, LOW);

  digitalWrite(PD4|PD5, HIGH);





  //GPIO_SetBits(GPIOD, GPIO_Pin_7);                    //CS=1

  //GPIO_SetBits(GPIOD, GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_0 | GPIO_Pin_1);  //�?�?

  //GPIO_SetBits(GPIOE, GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10); //�?�?

  //GPIO_ResetBits(GPIOE, GPIO_Pin_0);

  //GPIO_ResetBits(GPIOE, GPIO_Pin_1);                //RESET=0

  //GPIO_SetBits(GPIOD, GPIO_Pin_4);               //RD=1

  //GPIO_SetBits(GPIOD, GPIO_Pin_5);                    //WR=1

                                                                                               //  GPIO_SetBits(GPIOD, GPIO_Pin_13);                          //LIGHT



                                                                                               //GPIO_SetBits(GPIOD, GPIO_Pin_11);                     //RS

  }

  /** Perform the SRAM1 memory initialization sequence

  */



 

  fsmcLcdHandle.Instance = FSMC_NORSRAM_DEVICE;

  fsmcLcdHandle.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;

  /* fsmcLcdHandle.Init */

  fsmcLcdHandle.Init.NSBank = FSMC_NORSRAM_BANK1;

  fsmcLcdHandle.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;

  fsmcLcdHandle.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;

  fsmcLcdHandle.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;

  fsmcLcdHandle.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;

  fsmcLcdHandle.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;

  fsmcLcdHandle.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;

  fsmcLcdHandle.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;

  fsmcLcdHandle.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;

  fsmcLcdHandle.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;

  fsmcLcdHandle.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;

  fsmcLcdHandle.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;

  fsmcLcdHandle.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;



/* Timing  LCD device configuration

 *SPFD5420A

 *AddressSetupTime   10 ns

 *DataSetupTime      25 ns

 */



//for spfd5420, other must fixed! 

  Timing.AddressSetupTime = _as/14;  // 14ns(1/72M)*1(HCLK) = 14ns

  Timing.AddressHoldTime = 0;        //  FSMC_ACCESS_MODE_A unused

  Timing.DataSetupTime = _ds/14;     // 14ns(1/72M)*2(HCLK) = 28ns

  Timing.BusTurnAroundDuration = 0;

  Timing.CLKDivision = 0;

  Timing.DataLatency = 0;

  Timing.AccessMode = FSMC_ACCESS_MODE_A;

  /* ExtTiming */



  if (HAL_SRAM_Init(&fsmcLcdHandle, &Timing, NULL) != HAL_OK)

  {

   // _Error_Handler(__FILE__, __LINE__);

  }

 

  /** Disconnect NADV

  */

  __HAL_AFIO_FSMCNADV_DISCONNECTED();

}

 

 

 

4.IL9325的初始化、清屏、画点(上面的寄存器函数完成后,可直接复制stm32未例中的il9325的代码

 

正常情况下就可以显示了

 

代码地址:https://download.csdn.net/download/qq_39239990/10637937

 

 

猜你喜欢

转载自blog.csdn.net/qq_39239990/article/details/82255295