001----手把手教你制作TouchGFX的工程模板

手把手教你制作TouchGFX的工程模板

开发环境:CubeMX5.6.1(packages–F4–1.25.0)、Keil5(5.30.0.0–Keil.STM32F4xx_DFP.2.9.0)、Touch GFX(Version4.13.0)
硬件开发板平台:野火STM32F429IG-V2
液晶显示屏型号:野火GT-917S、分辨率800x480

第1步:打开Cube MX软件

在这里插入图片描述

第2步:新建工程

在这里插入图片描述

第3步:选择自己使用的芯片并开始工程配置

在这里插入图片描述

第4步:开启仿真接口

在这里插入图片描述

第5步:选择外部高速时钟HSE

在这里插入图片描述

第6步:选择触摸屏对应得IIC通讯得接口和配置(一般默认)

在这里插入图片描述

第6步:选择并配置触摸屏得中断引脚、RST引脚和液晶的背光引脚

在这里插入图片描述

第6步:开启触摸屏的中断引脚的NVIC

在这里插入图片描述

第7步:开启并配置使用FMC通讯的SDRAM

在这里插入图片描述

第7步:开启SDRAM的中断功能

在这里插入图片描述
在这里插入图片描述

第8步:开启DM2D(一般默认)

在这里插入图片描述

第8步:开启DM2D的中断功能

在这里插入图片描述

第9步:开启并配置LTDC层级参数

在这里插入图片描述

第9步:配置LTDC的液晶显示参数

在这里插入图片描述

第9步:开启LTDC的中断使能

在这里插入图片描述

第9步:配置LTDC的引脚

在这里插入图片描述

第10步:配置系统时钟和LTDC时钟

在这里插入图片描述

第11步:配置USART串行通讯(为方便调试和使用打印函数printf();)

在这里插入图片描述

第12步:下载并加载Touch GFX功能

在这里插入图片描述

第13步:开启并配置Touch GFX

在这里插入图片描述

第14步:开启CRC

在这里插入图片描述

第15步:填写工程名、选择存储路径、编译软件环境和堆栈的大小设置

在这里插入图片描述

第16步:选择.c .h文件分开单独生成(个人习惯)

在这里插入图片描述

第17步:点击生成代码工程文件

在这里插入图片描述

第18步:添加触摸屏驱动程序文件

在这里插入图片描述

第19步:新建BSP组添加BSP文件到编译软件中

在这里插入图片描述

第20步:添加BSP文件的头文件路径到工程中

在这里插入图片描述

第21步:添加usart.c中的代码实现串口打印功能

在这里插入图片描述

//【注意添加头文件】
#include "stdio.h"
///重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
    /* 发送一个字节数据到串口DEBUG_USART */
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);    
    
    return (ch);
}

///重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
        
    int ch;
    HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000); 
    return (ch);
}

第22步:在fmc.c中添加SDRAM的初始化代码

在这里插入图片描述

//【注意:在 int main()的初始化中加这个初始化SDRAM:SDRAM_InitSequence();】
static FMC_SDRAM_CommandTypeDef Command;


/**
  * @brief  延迟一段时间
  * @param  延迟的时间长度
  * @retval None
  */
static void SDRAM_delay(__IO uint32_t nCount)
{
  __IO uint32_t index = 0; 
  for(index = (100000 * nCount); index != 0; index--)
  {
  }
}


/**
  * @brief  对SDRAM芯片进行初始化配置
  * @param  None. 
  * @retval None.
  */
void SDRAM_InitSequence(void)
{
  uint32_t tmpr = 0;
  
/* Step 3 --------------------------------------------------------------------*/
  /* 配置命令:开启提供给SDRAM的时钟 */
  Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
  Command.CommandTarget = FMC_COMMAND_TARGET_BANK;
  Command.AutoRefreshNumber = 1;
  Command.ModeRegisterDefinition = 0;
/* Send the command */
  HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT);

  /* Step 2: Insert 100 us minimum delay */ 
  /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */
  SDRAM_delay(1);
    
/* Step 5 --------------------------------------------------------------------*/
  /* 配置命令:对所有的bank预充电 */ 
  Command.CommandMode = FMC_SDRAM_CMD_PALL;
  Command.CommandTarget = FMC_COMMAND_TARGET_BANK;
  Command.AutoRefreshNumber = 1;
  Command.ModeRegisterDefinition = 0;
/* Send the command */
  HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT);   
  
/* Step 6 --------------------------------------------------------------------*/
  /* 配置命令:自动刷新 */   
  Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
  Command.CommandTarget = FMC_COMMAND_TARGET_BANK;
  Command.AutoRefreshNumber = 4;
  Command.ModeRegisterDefinition = 0;
 /* Send the command */
  HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT);
  
/* Step 7 --------------------------------------------------------------------*/
  /* 设置sdram寄存器配置 */
  tmpr = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2          |
                   SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
                   SDRAM_MODEREG_CAS_LATENCY_3           |
                   SDRAM_MODEREG_OPERATING_MODE_STANDARD |
                   SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
  
  /* 配置命令:设置SDRAM寄存器 */
  Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
  Command.CommandTarget = FMC_COMMAND_TARGET_BANK;
  Command.AutoRefreshNumber = 1;
  Command.ModeRegisterDefinition = tmpr;
  /* Send the command */
  HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT);
  
/* Step 8 --------------------------------------------------------------------*/

  /* 设置刷新计数器 */
  /*刷新速率 = (COUNT + 1) x SDRAM 频率时钟
    COUNT =( SDRAM 刷新周期/行数) - 20*/
  /* 64ms/8192=7.813us  (7.813 us x FSDCLK) - 20 =683 */
  HAL_SDRAM_ProgramRefreshRate(&sdramHandle, 683); 
//  FMC_SetRefreshCount(1386);
//  /* 发送上述命令*/
//  while(FMC_GetFlagStatus(FMC_BANK_SDRAM, FMC_FLAG_Busy) != RESET)
//  {
//  }
}

第23步:在fmc.h中添加SDRAM用到的宏定义

在这里插入图片描述


#define IS42S16400J_SIZE     (32 * 1024 * 1024)    //,32M字节

/*SDRAM 的bank选择*/  
#define FMC_BANK_SDRAM              FMC_Bank2_SDRAM  
#define FMC_COMMAND_TARGET_BANK     FMC_SDRAM_CMD_TARGET_BANK2
#define sdramHandle hsdram1
#define SDRAM_TIMEOUT               ((uint32_t)0xFFFF)
#define SDRAM_BANK_ADDR             ((uint32_t)0xD0000000)


/**
  * @brief  FMC SDRAM 模式配置的寄存器相关定义
  */
#define SDRAM_MODEREG_BURST_LENGTH_1             ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_LENGTH_2             ((uint16_t)0x0001)
#define SDRAM_MODEREG_BURST_LENGTH_4             ((uint16_t)0x0002)
#define SDRAM_MODEREG_BURST_LENGTH_8             ((uint16_t)0x0004)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL      ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED     ((uint16_t)0x0008)
#define SDRAM_MODEREG_CAS_LATENCY_2              ((uint16_t)0x0020)
#define SDRAM_MODEREG_CAS_LATENCY_3              ((uint16_t)0x0030)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD    ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000) 
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE     ((uint16_t)0x0200) 

void SDRAM_InitSequence(void);

第24步:在stm32f4xx_it.c中添加触摸屏中断读数据代码

在这里插入图片描述

在这里插入图片描述

#include "bsp_i2c_touch.h"
extern void GTP_TouchProcess(void);

void EXTI15_10_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */
	if(__HAL_GPIO_EXTI_GET_IT(GTP_INT_GPIO_PIN) != RESET) //确保是否产生了EXTI Line中断
	{
		//HAL_GPIO_TogglePin(GPIOH,GPIO_PIN_12);
		//LED2_TOGGLE;
    GTP_TouchProcess();   	
    __HAL_GPIO_EXTI_CLEAR_IT(GTP_INT_GPIO_PIN);     //清除中断标志位
	} 
  /* USER CODE END EXTI15_10_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */

  /* USER CODE END EXTI15_10_IRQn 1 */
}

第25步:在Touch GFX中添加触摸数据获取接口代码

在这里插入图片描述

extern "C"
{
	#include "stdio.h"
	#include "gt9xx.h"

	extern int16_t pre_x;
	extern int16_t pre_y;
}

void STM32TouchController::init()
{
    /**
     * Initialize touch controller and driver
     *
     */GTP_Init_Panel();
}

bool STM32TouchController::sampleTouch(int32_t& x, int32_t& y)
{
    /**
     * By default sampleTouch returns false,
     * return true if a touch has been detected, otherwise false.
     *
     * Coordinates are passed to the caller by reference by x and y.
     *
     * This function is called by the TouchGFX framework.
     * By default sampleTouch is called every tick, this can be adjusted by HAL::setTouchSampleRate(int8_t);
     *
     */
	GTP_TouchProcess();
	if(pre_x == -1 && pre_y == -1)
	{
		return false;
	}
	else
	{
		x = pre_x;
	    y = pre_y;
		return true;
	}
}

第26步:主函数main.c中添加的函数,也可以在GFX的初始化中进行添加

在这里插入图片描述

在这里插入图片描述

#include "bsp_i2c_touch.h"
#include "gt9xx.h"
#include "stdio.h"

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_CRC_Init();
  MX_DMA2D_Init();
  MX_FMC_Init();
  MX_I2C2_Init();
  MX_LTDC_Init();
  MX_USART1_UART_Init();
  MX_TouchGFX_Init();
  /* USER CODE BEGIN 2 */
SDRAM_InitSequence();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

  MX_TouchGFX_Process();
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

第27步:打开Touch GFX开始尽情的发挥想象设计吧 哈哈哈哈

在这里插入图片描述

第28步:选择空白模板进行设计

在这里插入图片描述

第29步:添加背景Box控件

在这里插入图片描述

第30步:添加一个按钮控件

在这里插入图片描述

对啦!本人能力有限哈!文中有啥讲错 的地方,还请留言指正哈!

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值