网站兼容视图,网站tag作用,网页设计与制作项目教程答案,珠海市网站建设哪家好配置请参考链接#xff1a;TouchGFX超低配置移植教程-CSDN博客
一#xff0c;显示配置
1.适当增加堆栈大小 2.适当增大缓冲大小 双重缓冲消除了任何撕裂的风险#xff0c;无论渲染下一帧需要多长时间#xff0c;因为TfT控制器#xff0c;例如#xff0c;总是可以访问最…配置请参考链接TouchGFX超低配置移植教程-CSDN博客
一显示配置
1.适当增加堆栈大小 2.适当增大缓冲大小 双重缓冲消除了任何撕裂的风险无论渲染下一帧需要多长时间因为TfT控制器例如总是可以访问最新的完整帧数据。单个缓冲可以消除对外部存储器的需求可能会发生撕裂。部分缓冲消除了对外部内存的需求同时仍然允许将大部分内部内存用于framebuffer之外的事情。 如果“Number of Blocks”设置为1这意味着TouchGFX将只分配一个内存块用于帧缓冲区。这通常适用于简单的图形界面或显示需求不高的应用场景。在这种情况下TouchGFX将使用一个单缓冲区方案来更新和显示图形数据。
然而如果图形界面较为复杂或需要更高的刷新率可能需要使用双缓冲或多缓冲方案来减少屏幕撕裂和闪烁现象。在这种情况下“Number of Blocks”参数的值将相应增加以允许TouchGFX分配更多的内存块用于帧缓冲区。
二硬件配置
1.开启I2C1用于连接触摸芯片,PB6,PB7 2.开启SPI1Transmit Only Master用于LCD 串行数据传输,(PB3,PB5)开启DMA
开启SPI中断用于屏幕刷新完成时调用函数 3.开启QSPI 4线模式用于读写W25Q64
计算请参考链接 4.开启tim6 定时器为TouchGFX提供时钟源
三C/C 基础示例
1.在cpp文件中的c函数外部函数声明
extern C int touchgfxDisplayDriverTransmitActive();
2.在c文件中的cpp函数外部函数声明
extern void touchgfxTickHandler(void);//也可以省略extern
3.使cpp文件中的函数兼容c文件使用
extern C
void DisplayDriver_TransferCompleteCallback()
{PartialFrameBufferManager::tryTransmitBlockFromIRQ();
}
要在其他 C 文件中使用在 TouchGFXGeneratedHAL.cpp 中定义的 DisplayDriver_TransferCompleteCallback 函数你需要确保以下几点
声明函数原型在需要使用该函数的 C 文件中声明该函数的原型。 确保链接确保在编译和链接时包含 TouchGFXGeneratedHAL.cpp 文件以便链接器能够找到该函数的定义。
由于 DisplayDriver_TransferCompleteCallback 函数被声明为 extern C它具有 C 链接约定因此可以在 C 文件中直接使用。
以下是具体步骤
步骤 1声明函数原型
在需要使用 DisplayDriver_TransferCompleteCallback 函数的 C 文件中声明该函数的原型。
你可以通过创建一个头文件来包含这个声明或者直接在 C 文件中声明。
void touchgfxTickHandler(void);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static int counter0;if (htim-Instance TIM6){touchgfxTickHandler();if(counter%2000)toggle_led();}
}
4.无论是函数还是全局变量在一个文件中定义了在另一个文件中如果要使用只需要extern外部声明一下就行了其中函数可以省略extern在.h文件中声明只是为了方便管理而已。
四无外扩flash代码移植
TGFX SPI左侧为原始代码右侧为用户代码。无外部flash移植仅提供思路
1点击TouchGFXGeneratedHAL.cpp其位于Application/User/ TouchGFX/target/generated一栏中在该点cpp文件的开头就可以看到四个函数声明前三个都是需要用户自己提供。 //st7789.c
volatile uint8_t IsTransmittingBlock_0;
/*** Check if a Frame Buffer Block is beeing transmitted.*/
int touchgfxDisplayDriverTransmitActive(void)
{return IsTransmittingBlock_;
}
/*** Check if a Frame Buffer Block ending at bottom may be sent.*/
int touchgfxDisplayDriverShouldTransferBlock(uint16_t bottom)
{return 1;
}
/*** Transmit a Frame Buffer Block.*/
void touchgfxDisplayDriverTransmitBlock(const uint8_t* pixels, uint16_t x, uint16_t y, uint16_t w, uint16_t h)
{IsTransmittingBlock_1;ST7789_DrawImage(x,y,w,h,(uint16_t*)pixels);
}
2除了上述三个函数还需要注意一个函数DisplayDriver_TransferCompleteCallback用户需要在屏幕刷新完成时调用该函数。 //spi.c
extern volatile uint8_t IsTransmittingBlock_;
extern void DisplayDriver_TransferCompleteCallback(void);
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{if (hspi-Instance SPI1) {IsTransmittingBlock_ 0;DisplayDriver_TransferCompleteCallback();}
}
3TouchGFX正常工作的前提条件是需要一个外部的时钟源由于本例程使用的屏为SPI屏STM32CubeMX中配置的时钟源选项默认为Custom即需要用户自己为TouchGFX提供时钟源 //tim.c
extern void touchgfxTickHandler(void);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static int counter0;if (htim-Instance TIM6){touchgfxTickHandler();if(counter%2000)HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);}
}
//OSWrappers.cpp
extern C {uint8_t isInited 0;}
extern C
void touchgfxTickHandler()
{static uint8_t ms 0;static uint8_t isHigh 0;if(isInited){ms;if(ms20){ms 0;isHigh !isHigh;if(isHigh){OSWrappers::signalVSync();}else{HAL::getInstance()-frontPorchEntered();} }}
}
4.使用外部变量 isInited 为 1表示初始化已经成功完成。 extern uint8_t isInited;
isInited 1;
5.初始化SPI屏幕开启定时器中断 ST7789_Init();
HAL_TIM_Base_Start_IT(htim6);