前言
屏幕是嵌入式開發(fā)中的一個(gè)重要的部分,cdsn上有許多解釋原理的,還有很多是采用正點(diǎn)原子的屏幕來驅(qū)動(dòng)的,對(duì)于剛剛?cè)腴T不久的我們可能沒有資金去購買較為昂貴的屏幕。而對(duì)于底層原理我們暫時(shí)也不必了解的那么深入,能點(diǎn)亮屏幕就是我們最大的快樂。
除了中景園的資料全一些以外,沒有啥更好的驅(qū)動(dòng)了! 嘛?
無意中找到了一個(gè)很不錯(cuò)的網(wǎng)站,他們的代碼和中景園相似但又有所不同,畢竟科技以換殼為本嘛!所以本篇拙筆就是記錄如何將代碼移植到stm32上。
官網(wǎng)地址:官網(wǎng)地址
在官網(wǎng)中可下載相應(yīng)的代碼,我在每節(jié)的鏈接中會(huì)貼出移植好的代碼。
環(huán)境搭建
cubemx、keil5、tft_lcd屏幕(spi接口)、stm32開發(fā)板、
一、stm32軟件spi驅(qū)動(dòng)lcd
鏈接:百度網(wǎng)盤——my
提取碼:fnov
1 cubemx配置
cubemx配置如上圖所示,記得一定要改名字,不然每次都要修改lcd的源碼會(huì)很麻煩,名字就寫圖中的就可以了。(這個(gè)還不知道是什么的需要補(bǔ)習(xí)一下cubemx了后續(xù)會(huì)出一期期cubemx的基礎(chǔ)使用
)
2 代碼移植
將官網(wǎng)中的文件下載下來以后繼續(xù)解壓,
這個(gè)鏈接里面有官網(wǎng)的文件
鏈接:百度網(wǎng)盤
提取碼:2eq4
打開這個(gè)目錄下的代碼并在自己創(chuàng)建的工程下創(chuàng)建一個(gè)user文件夾。
在user文件夾下創(chuàng)建需要的.h .c文件
1)lcd.c
上面的大段注釋就不需要了,直接把下面的代碼加入就可以了,再把lcd.h加入
這個(gè)時(shí)候要根據(jù)叉叉和感嘆號(hào)去修改代碼
第一步
刪除#include “delay.h”
。
刪除void LCD_Init(void)
中的LCD_GPIOInit();//LCD GPIO初始化
這句代碼,因?yàn)閏ube已經(jīng)幫我們初始化過了不需要初始化了。
把delay_ms
改成hal_delay
;因?yàn)闃?biāo)準(zhǔn)庫中沒有帶延時(shí)而hal庫中有,我們直接用hal庫的就可以了。
第二步
把#include “sys.h”
改成#include “main.h”
并在下面加一下#define u8 uint8_t
#define u16 uint16_t
因?yàn)閔al庫中沒有u8 和u 16,所以需要宏定義一下。
第三步
刪除lcd端口定義,因?yàn)閏ube引腳幫我們配置好了,不需要這個(gè)了
修改引腳電平的跳變,這一步是很重要的
這里我們修改為:
這里并沒有調(diào)用hal_gpio_write()
因?yàn)橹苯硬倏v寄存器的話會(huì)快很多。
lcd.h就自己寫了,這個(gè)也很簡單,實(shí)在不會(huì)就對(duì)照我的【百度網(wǎng)盤——my】中的文件抄寫一下,后面基本都是只介紹.c庫的修改
2)spi.c
在這里直接移植過去就可以了不需要繼續(xù)更改(可以把頭部注釋都刪除)
在spi.h文件中我們修改宏定義如圖:
這一步是修改模擬spi信號(hào)的跳變的。
3)gui.c
第一步:
刪除#include "delay.h"
第二步:
在gui.h中寫:
#include "main.h"
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
第三步:
移植font.h文件,這里是不需要修改的
4)test.c
第一步:
刪除#include "delay.h"
#include "touch.h"
#include "key.h"
#include "led.h"
以及最下面的void Touch_Test(void)
函數(shù)
第二步:
移植test.h文件
并寫入:
#include "main.h"
#define u8 uint8_t
5)驗(yàn)證
在主函數(shù)中寫這些即可。
3 屏幕背光亮度調(diào)節(jié)
背光的原理就不介紹了,我們的lcd會(huì)有一個(gè)BL引腳,這樣引腳就是調(diào)節(jié)背光的,即調(diào)節(jié)屏幕亮度,這個(gè)引腳我們一般設(shè)置為3.3v即為正常亮度,當(dāng)想讓他暗一些的時(shí)候就需要對(duì)這個(gè)引腳pwm輸出,通過控制占空比來調(diào)節(jié)亮度,高電平占比越多,屏幕越亮。
二、stm32硬件spi驅(qū)動(dòng)lcd
硬件spi要比軟件模擬的spi快很多,在本次有一個(gè)test_time函數(shù),用軟件和硬件分別跑,硬件所需的時(shí)間僅僅是軟件的一半。
鏈接:硬件spi_my
提取碼:6ikf
1 cubemx配置
并不需要要重新創(chuàng)建文件,只需要將上一份的文件復(fù)制粘貼以后進(jìn)cubemx繼續(xù)修改就可以了。
模式選擇為只做主機(jī)發(fā)送。隨后生成代碼即可。
2 代碼修改
本次我們只需要修改spi.c和spi.h即可,首先就是把user文件夾下的這兩個(gè)文件改名為my_user.h
和my_user.c
因?yàn)楸緛砻謺?huì)和cubemx生成的文件重名。
把my_user.c中的刪除掉,添加下面代碼:
#include "my_spi.h"
#include "spi.h"
/*****************************************************************************
* @name :u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte)
* @date :2018-08-09
* @function :Write a byte of data using STM32's hardware SPI
* @parameters :SPIx: SPI type,x for 1,2,3
Byte:Data to be written
* @retvalue :Data received by the bus
******************************************************************************/
u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte)
{
while((SPIx->SR&SPI_FLAG_TXE)==RESET); //等待發(fā)送區(qū)空
SPIx->DR=Byte; //發(fā)送一個(gè)byte
while((SPIx->SR&SPI_FLAG_RXNE)==RESET);//等待接收完一個(gè)byte
return SPIx->DR; //返回收到的數(shù)據(jù)
}
//u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte)
//{
// HAL_SPI_Transmit(&hspi1,&Byte,1,10);
// return SPIx->DR; //返回收到的數(shù)據(jù)
//}
/*****************************************************************************
* @name :void SPI_SetSpeed(SPI_TypeDef* SPIx,u8 SpeedSet)
* @date :2018-08-09
* @function :Set hardware SPI Speed
* @parameters :SPIx: SPI type,x for 1,2,3
SpeedSet:0-high speed
1-low speed
* @retvalue :None
******************************************************************************/
void SPI_SetSpeed(SPI_TypeDef* SPIx,u8 SpeedSet)
{
SPIx->CR1&=0XFFC7;
if(SpeedSet==1)//高速
{
SPIx->CR1|=SPI_BAUDRATEPRESCALER_2;//Fsck=Fpclk/2
}
else//低速
{
SPIx->CR1|=SPI_BAUDRATEPRESCALER_32; //Fsck=Fpclk/32
}
SPIx->CR1|=1<<6; //SPI設(shè)備使能
}
/*****************************************************************************
* @name :void SPI2_Init(void)
* @date :2018-08-09
* @function :Initialize the STM32 hardware SPI2
* @parameters :None
* @retvalue :None
******************************************************************************/
void SPI_Init(void)
{
__HAL_SPI_ENABLE(&hspi1);//這句話很重要
}
在my_spi.h中寫:
#include "main.h"
#ifndef _SPI_H_
#define _SPI_H_
#define u8 uint8_t
u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte);
void SPI_Init(void);
void SPI_SetSpeed(SPI_TypeDef* SPIx,u8 SpeedSet);
#endif
再把lcd.c中的打叉的地方改為SPI_WriteByte(SPI1,…….)紅色的省略號(hào)就是填寫本來那里填的數(shù)據(jù)。
這樣就完成了,直接燒錄即可。
3 速度測試
分別在軟件和硬件的test.c
文件的末尾寫上:
void test_time(void)
{
LCD_Fill(0,0,lcddev.width,lcddev.height,WHITE);
Show_Str(20,30,BLUE,YELLOW,"BL Test",16,1);HAL_Delay(1);
LCD_Fill(0,0,lcddev.width,lcddev.height,RED);
Show_Str(20,30,BLUE,YELLOW,"RED ",16,1);HAL_Delay(1);
LCD_Fill(0,0,lcddev.width,lcddev.height,GREEN);
Show_Str(20,30,BLUE,YELLOW,"GREEN ",16,1);HAL_Delay(1);
LCD_Fill(0,0,lcddev.width,lcddev.height,BLUE);
Show_Str(20,30,RED,YELLOW,"BLUE ",16,1);HAL_Delay(1);
}
并把主函數(shù)中的原有測試代碼注釋,寫成如圖:
當(dāng)復(fù)位鍵按下以后開始計(jì)時(shí),在我的板子上,硬件spi跑完只需要14秒,即屏幕的刷新率可以達(dá)到30fps,而使用軟件的話只能達(dá)到10多fps。由此可見硬件spi是很不錯(cuò)的選擇。
三、提高屏幕刷新率
在tft_lcd的屏幕下,我們對(duì)于屏幕呈像素質(zhì)的關(guān)注是比較少的,我們主要是希望屏幕有較快的相應(yīng)速度,使用我們在上兩節(jié)分別使用了軟件spi和硬件spi。在硬件spi中我們參考的是標(biāo)準(zhǔn)庫,移植到的是hal庫,其中不難發(fā)現(xiàn)我們在使用寫數(shù)據(jù)函數(shù)的時(shí)候,使用到的都是寄存器方法,而沒有使用標(biāo)準(zhǔn)庫以及hal庫提供的庫函數(shù)。為什么留著方便的庫函數(shù)不用而才用寄存器呢?
其實(shí)當(dāng)你F12庫函數(shù)你就能發(fā)現(xiàn),庫函數(shù)中存積著大量的代碼,有些代碼是為了檢查通信協(xié)議的。我們在追求速度的時(shí)候總要舍棄些什么,畢竟有舍才有得嘛!
在標(biāo)準(zhǔn)庫中代碼是這樣的
而在我們移植的hal庫中,我們用了差不多的函數(shù):
細(xì)心的你可能已經(jīng)發(fā)現(xiàn)了,只是標(biāo)志少了幾個(gè)字母而已。
其實(shí)我們可以很簡潔的寫出這個(gè)代碼:
一句話就可以解決,但是當(dāng)你使用這個(gè)函數(shù)驅(qū)動(dòng)屏幕刷新的時(shí)候你會(huì)發(fā)現(xiàn)你只能眨眼補(bǔ)幀,這實(shí)在是太慢了,慢到速度還比不過軟件spi。那有沒有方法在hal庫的spi中尋找一個(gè)速度也比較快,且合適的代碼呢?
這只能通過縮減hal_spi_transmit();函數(shù)了,暫時(shí)還沒想好
四、中文顯示
1打開取模軟件
2左上角模式選擇為字符模式
3點(diǎn)擊選項(xiàng)
4設(shè)置如下,然后點(diǎn)擊確定。
5以16x16漢字取模為例:
字寬字高都改為16
然后在輸入欄輸入漢字
點(diǎn)擊生成字模
生成的字模如下
然后將字模復(fù)制到例程lcdfont.h文件夾 如下數(shù)組內(nèi)
注:每個(gè)字的字模前需要添加這個(gè)漢字,并用雙引號(hào)括起來然后加上逗號(hào)!文章來源:http://www.zghlxwxcb.cn/news/detail-437878.html
總結(jié)
以上就是今天要講的內(nèi)容,本文僅僅簡單介紹了如何移植到hal庫,當(dāng)你點(diǎn)亮屏幕的那一刻所以的坑都是值得的。
相逢何必曾相識(shí),江湖再見??!文章來源地址http://www.zghlxwxcb.cn/news/detail-437878.html
到了這里,關(guān)于stm32 hal庫硬件spi(軟件spi)驅(qū)動(dòng)1.8寸tft—lcd屏幕的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!