01、前言
前幾期文章中,我的畢設(shè)已經(jīng)經(jīng)過第二次的修改,初步完成了各傳感器芯片的焊接與調(diào)試,第二版原理圖中除了姿態(tài)傳感器LSDLSM6DS3TR不能使用之外,其余的模塊均調(diào)試完成。
LSM6DS3TR在看芯片手冊的時候不小心調(diào)整錯了接線,導(dǎo)致LSM6DS工作在主機(jī)模式,從而暫時沒辦法解決。不過鑒于其他大體都已經(jīng)完成了,所以決定暫時擱置不管這個模塊了,還有測量光強(qiáng)的芯片,本來是能用的,莫名其妙不知道為什么數(shù)據(jù)突然讀出來不能用了,準(zhǔn)備換一塊上去。
因此接下來的主要目的是繪制LCD顯示屏的GUI界面以及后續(xù)的藍(lán)牙連接的APP制作。
02、ST7789的坑
前幾天發(fā)表過關(guān)于ST7789的字符顯示刷新問題,但是由于要用GUI框架(選用ST的TouchGFX),因此實(shí)際上字符刷新是無所謂的,主要需要的函數(shù)是圖片刷新。
但是在使用過程中發(fā)現(xiàn),圖片的顏色非常有問題。
類似于這種問題,大部分的回答是說ST7789被設(shè)置為了BGR模式,和常規(guī)的RGB模式相比,它的紅藍(lán)被調(diào)換了。
但是將ST7789重新修改為RGB模式后依舊出現(xiàn)了顏色顯示不對的問題。
仔細(xì)閱讀ST7789的芯片手冊之后發(fā)現(xiàn)。
在16位RGB,3線模式(SPI)模式下,ST7789每個像素位是這樣子的。
但是問題在于,我的STM32硬件SPI采用的是8位傳輸!而STM32采用的是大端存儲模式,所有的數(shù)據(jù)都是高位在前
但是在8位模式下,會先發(fā)送低八位,再發(fā)送高八位,導(dǎo)致高低字節(jié)數(shù)據(jù)反了過來從而導(dǎo)致數(shù)據(jù)異常。
在一些開源驅(qū)動中,對這部分的處理是將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();
}
于是發(fā)現(xiàn)圖片正常的顯示成功了。
3、GUI
GUI界面采用ST原生的TouchGFX,不過礙于芯片的Flash只有256K,40K的RAM,并且沒有配置外部RAM,因此GUI界面幾乎都是基礎(chǔ)圖形手繪,并沒有采用過多的圖片修飾。