01、前言
前几期文章中,我的毕设已经经过第二次的修改,初步完成了各传感器芯片的焊接与调试,第二版原理图中除了姿态传感器LSDLSM6DS3TR不能使用之外,其余的模块均调试完成。
LSM6DS3TR在看芯片手册的时候不小心调整错了接线,导致LSM6DS工作在主机模式,从而暂时没办法解决。不过鉴于其他大体都已经完成了,所以决定暂时搁置不管这个模块了,还有测量光强的芯片,本来是能用的,莫名其妙不知道为什么数据突然读出来不能用了,准备换一块上去。
因此接下来的主要目的是绘制LCD显示屏的GUI界面以及后续的蓝牙连接的APP制作。
02、ST7789的坑
前几天发表过关于ST7789的字符显示刷新问题,但是由于要用GUI框架(选用ST的TouchGFX),因此实际上字符刷新是无所谓的,主要需要的函数是图片刷新。
但是在使用过程中发现,图片的颜色非常有问题。
类似于这种问题,大部分的回答是说ST7789被设置为了BGR模式,和常规的RGB模式相比,它的红蓝被调换了。
但是将ST7789重新修改为RGB模式后依旧出现了颜色显示不对的问题。
仔细阅读ST7789的芯片手册之后发现。
在16位RGB,3线模式(SPI)模式下,ST7789每个像素位是这样子的。
但是问题在于,我的STM32硬件SPI采用的是8位传输!而STM32采用的是大端存储模式,所有的数据都是高位在前
但是在8位模式下,会先发送低八位,再发送高八位,导致高低字节数据反了过来从而导致数据异常。
在一些开源驱动中,对这部分的处理是将16bit的高低位手动交换之后再传输。
但是这种效率太慢了,会大幅度的降低使用流畅度。
于是后面想到能不能在传输像素信息的时候,将SPI的传输格式修改为16Bit,传输完再修改回来。
void?ST7789_WriteData_16Bit(uint8_t *buff, size_t buff_size){? hspi2.Init.DataSize = SPI_DATASIZE_16BIT;? HAL_SPI_Init(&hspi2);? ? ST7789_Select();? ? ST7789_DC_Set();? ??while?(buff_size >?0) {? ? ??uint16_t?chunk_size?=?buff_size >?65535???65535?: buff_size;? ? ??// 配置DMA传输? ? ? HAL_SPI_Transmit_DMA(&ST7789_SPI_PORT, buff, buff_size);? ? ??// 等待DMA传输完成? ? ??while(HAL_SPI_GetState(&ST7789_SPI_PORT) != HAL_SPI_STATE_READY)? ? ? ? {? ? ? ? ? ??// 等待DMA传输完成? ? ? ? }? ? ? buff += chunk_size;? ? ? buff_size -= chunk_size;? ? }? ? hspi2.Init.DataSize = SPI_DATASIZE_8BIT;? HAL_SPI_Init(&hspi2);? ? ST7789_UnSelect();}
于是发现图片正常的显示成功了。
3、GUI
GUI界面采用ST原生的TouchGFX,不过碍于芯片的Flash只有256K,40K的RAM,并且没有配置外部RAM,因此GUI界面几乎都是基础图形手绘,并没有采用过多的图片修饰。
2789