STM32F407/405 SPI屏幕+TouchGFX
新版的TouchGFX支持部分缓冲帧,只刷新一部分要更新的内容
STM32CubeMX创建工程
- 创建STM32F405工程,配置好时钟,我使用的是SPI 320*240 屏幕,所以使能SPI2(吐槽一下SPI2比SPI1要慢好多),使能SPI2 DMA_TX(因为是显示屏,所以只需要发送就行了),配置好显示屏的触摸驱动引脚
- 使能CRC(TouchGFX需要用到),使能FreeRTOS(选择CMSIS V2),设置FreeRTOS TOTAL_HEAP_SIZE为50*1024,(设置多少自己定啦)。
- 使能TouchGFX,参数设置如下图
参数中的Number of Blocks参数设置为2或者更多时该怎么写程序目前还没有搞定,不过有一个可以用了就好,再多了就用带LTDC的芯片了不是嘛。
参数中的BlockSize设置可以根据自己的情况定,我的GUI中最小的图片高度是20,所以我设置的比9600高,当全图刷新时,每次都只会刷新240*20高度的数据。具体原因再FramBufferAllocator.hpp
文件中的virtual uint16_t allocateBlock(const uint16_t x, const uint16_t y, const uint16_t width, const uint16_t height, uint8_t** block)
的函数中,可以自己分析。
生成MDK工程。打开工程文件下的ApplicationTemplate.touchgfx文件,添加几个BOX等,让界面上有显示,点击生成代码。
- 打开MDK工程,编译。打开TouchGFXHAL.cpp文件,找到
void TouchGFXHAL::flushFrameBuffer(const touchgfx::Rect& rect)
函数,可以看到他调用的是TouchGFXGeneratedHAL,cpp
中的void TouchGFXGeneratedHAL::flushFrameBuffer(const touchgfx::Rect& rect)函数,根据我们的编译信息,可知需要自己完成
void TouchGFXGeneratedHAL::flushFrameBuffer(const touchgfx::Rect& rect)
函数,
int touchgfxDisplayDriverTransmitActive()
函数和
"C" void touchgfxSignalVSync(void);
函数的编写。
创建TouchGFX_User.c/.h文件,在TouchGFX_User.c中添加
osMessageQueueId_t xQueueLCD;
const osMessageQueueAttr_t xQueueLCD_attributes = {
.name = "xQueueLCD"
};
并在freertos.c文件中MX_FREERTOS_Init(void)
函数中创建该队列
创建LCD刷新信息的通讯队列
xQueueLCD = osMessageQueueNew (10, sizeof(_st_lcd), &xQueueLCD_attributes);
创建函数 void touchgfxDisplayDriverTransmitBlock()
void touchgfxDisplayDriverTransmitBlock(const uint8_t* pixels, uint16_t x, uint16_t y, uint16_t w, uint16_t h)
{
const uint8_t* a =pixels;
_st_lcd lcdinfo = {
.pixels = a,
.x = x,
.y = y,
.w = w,
.h = h
};
if(