STM32F407中的RT-thread系統中移植LCD的程序-FSMC控制

環境

  • 開發板:正點原子探索者
  • 芯片:STM32F407ZGT6
  • 系統:RT-Thread
  • 屏幕型號:TFTLCD 55510 4.3寸
  • 開發軟件:Keil,CubeMX, Env

目的

現在將裸板上的LCD程序,移植到RT-thread上,裸板程序有lcd.c 和lcd.h,front.h

過程

使用F4芯片的FSMC來控制LCD,類似與將LCD當初存儲設備SRAM,利用 CubeMX來進行配置
在 FSMC的bank1下的NE4下配置LCD。這樣的話芯片與LCD對應的GPIO接口都可以被配置
在這裏插入圖片描述

配置完成後再打開env,生成mdk5工程
在這裏插入圖片描述

把lcd的相關代碼文件,放到新工程中,這裏與main放在一起
在這裏插入圖片描述
lcd.c需要修改一下,LCD_init原本有時鐘使能,GPIO配置,引腳複用的配置,都清除,CubeMX圖形配置會做這些事。有些裸板上的頭文件也可以去掉,換成rt-thread常用的頭文件。FSMC的配置放到main裏
在這裏插入圖片描述
另外在把對應的延時函數,換成rt-thread上的對應函數,gpio的使用接口也要替換,例如點亮LCD背光的部分

	LCD_Display_Dir(0);		//默認爲豎屏
	rt_pin_mode(LCD_PIN, PIN_MODE_OUTPUT);
	rt_pin_write(LCD_PIN, PIN_HIGH);				//點亮背光
	LCD_Clear(WHITE);

這裏需要添加下面兩個庫文件,main函數中對FSMC初始化要用到
在這裏插入圖片描述

在main函數中添加MX_FSMC_Init,進行FSMC的初始話,lcd_display在LCD上顯示

SRAM_HandleTypeDef hsram1;
static void MX_FSMC_Init(void)
{

  /* USER CODE BEGIN FSMC_Init 0 */

  /* USER CODE END FSMC_Init 0 */

  FSMC_NORSRAM_TimingTypeDef Timing = {0};
  FSMC_NORSRAM_TimingTypeDef ExtTiming = {0};

  /* USER CODE BEGIN FSMC_Init 1 */

  /* USER CODE END FSMC_Init 1 */

  /** Perform the SRAM1 memory initialization sequence
  */
  hsram1.Instance = FSMC_NORSRAM_DEVICE;
  hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank = FSMC_NORSRAM_BANK4;
  hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
  hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
  hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
  hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
  hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
  hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
  hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
  hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
  hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE;
  hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
  /* Timing */
  Timing.AddressSetupTime = 15;
  Timing.AddressHoldTime = 0;
  Timing.DataSetupTime = 24;
  Timing.BusTurnAroundDuration = 0;
  Timing.CLKDivision = 0;
  Timing.DataLatency = 0;
  Timing.AccessMode = FSMC_ACCESS_MODE_A;
  /* ExtTiming */
  ExtTiming.AddressSetupTime = 8;
  ExtTiming.AddressHoldTime = 15;
  ExtTiming.DataSetupTime = 8;
  ExtTiming.BusTurnAroundDuration = 0;
  ExtTiming.CLKDivision = 0;
  ExtTiming.DataLatency = 0;
  ExtTiming.AccessMode = FSMC_ACCESS_MODE_A;

  if (HAL_SRAM_Init(&hsram1, &Timing, &ExtTiming) != HAL_OK)
  {
    Error_Handler( );
  }

  /** Disconnect NADV
  */

//  __HAL_AFIO_FSMCNADV_DISCONNECTED();

  /* USER CODE BEGIN FSMC_Init 2 */

  /* USER CODE END FSMC_Init 2 */
}

static int lcd_display(void)
{ 
 	u8 x=0;
	u8 lcd_id[12];				//存放LCD ID字符串
 	LCD_Init();           //初始化LCD FSMC接口
	POINT_COLOR=RED;      //畫筆顏色:紅色
	sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//將LCD ID打印到lcd_id數組。				 	
  	while(1) 
	{		 
		switch(x)
		{
			case 0:LCD_Clear(WHITE);break;
			case 1:LCD_Clear(BLACK);break;
			case 2:LCD_Clear(BLUE);break;
			case 3:LCD_Clear(RED);break;
			case 4:LCD_Clear(MAGENTA);break;
			case 5:LCD_Clear(GREEN);break;
			case 6:LCD_Clear(CYAN);break; 
			case 7:LCD_Clear(YELLOW);break;
			case 8:LCD_Clear(BRRED);break;
			case 9:LCD_Clear(GRAY);break;
			case 10:LCD_Clear(LGRAY);break;
			case 11:LCD_Clear(BROWN);break;
		}
		POINT_COLOR=RED;	  
		LCD_ShowString(30,40,210,24,24,"Explorer STM32F4");	
		LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
		LCD_ShowString(30,90,200,16,16,"RT-thread");
 		LCD_ShowString(30,110,200,16,16,lcd_id);		//顯示LCD ID	      					 
		LCD_ShowString(30,130,200,12,12,"2014/5/4");	      					 
		x++;
		if(x==12)x=0;
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_thread_mdelay(500);
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_thread_mdelay(500);
	} 
}
MSH_CMD_EXPORT(lcd_display, lcd_display samole);

上電啓動並在uart串口上顯示的輸入命令lcd_display,即可正常顯示
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章