手把手教你制作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步:添加一个按钮控件
对啦!本人能力有限哈!文中有啥讲错 的地方,还请留言指正哈!